3
tập trung vào
1444
Người theo dõi

Một công cụ mạnh mẽ cho các nhà giao dịch theo chương trình: Thuật toán cập nhật gia tăng để tính toán giá trị trung bình và phương sai

Được tạo ra trong: 2023-11-08 16:28:36, cập nhật trên: 2024-11-08 09:13:54
comments   0
hits   1735

Một công cụ mạnh mẽ cho các nhà giao dịch theo chương trình: Thuật toán cập nhật gia tăng để tính toán giá trị trung bình và phương sai

Giới thiệu

Trong giao dịch theo chương trình, thường cần phải tính toán giá trị trung bình và phương sai, chẳng hạn như khi tính toán các chỉ số như đường trung bình động và độ biến động. Khi chúng ta cần tính toán tần suất cao và trong thời gian dài, chúng ta cần lưu giữ dữ liệu lịch sử dài hạn, điều này không cần thiết, tốn thời gian và tài nguyên. Bài báo này giới thiệu một thuật toán cập nhật trực tuyến để tính toán các giá trị trung bình có trọng số và phương sai, đặc biệt quan trọng để xử lý các luồng dữ liệu thời gian thực và điều chỉnh động các chiến lược giao dịch, đặc biệt là các chiến lược tần suất cao. Bài viết cũng cung cấp mã Python tương ứng để giúp các nhà giao dịch triển khai và áp dụng thuật toán này vào các giao dịch thực tế một cách nhanh chóng.

Trung bình đơn giản và phương sai

Nếu chúng ta sử dụng \(\mu_n\) để biểu diễn giá trị trung bình của điểm dữ liệu thứ \(n\), giả sử rằng chúng ta đã tính toán giá trị trung bình của \({n-1}\) điểm dữ liệu \(\mu_{n-1}\), thì bây giờ chúng ta Một điểm dữ liệu mới \(x_{n}\) được nhận. Chúng tôi muốn tính toán giá trị trung bình mới \(\mu_{n}\) bao gồm điểm dữ liệu mới này. Sau đây là bản trích dẫn chi tiết.

\(\mu_n = \frac{1}{n} \sum_{i=1}^{n} x_i\) \(\mu_n = \frac{1}{n} \left( x_n + \sum_{i=1}^{n-1} x_i \right)\) \(\mu_{n-1} = \frac{1}{n-1} \sum_{i=1}^{n-1} x_i\) \((n-1)\mu_{n-1} = \sum_{i=1}^{n-1} x_i\) \(\mu_n = \frac{1}{n} \left( x_n + (n-1)\mu_{n-1} \right)\) \(\mu_n = \mu_{n-1} + \frac{1}{n} (x_n - \mu_{n-1})\)

Quá trình cập nhật phương sai có thể được phân chia thành các bước sau:

\(S_n = \sum_{i=1}^{n} (x_i - \mu_n)^2\) \(S_n = \sum_{i=1}^{n} x_i^2 - n\mu_n^2\) \(S_n - S_{n-1} = x_n^2 - n\mu_n^2 + (n - 1)\mu_{n-1}^2\) \(S_n - S_{n-1} = (x_n - \mu_{n-1})(x_n - \mu_n)\) \(S_n = S_{n-1} + (x_n - \mu_{n-1})(x_n - \mu_n)\) \(\sigma_n^2 = \frac{S_n}{n}\)

Như có thể thấy từ hai công thức trên, quá trình này cho phép chúng ta cập nhật giá trị trung bình và phương sai mới bằng cách chỉ giữ lại giá trị trung bình và phương sai của dữ liệu trước đó khi nhận được mỗi điểm dữ liệu mới \(x_n\), mà không lưu dữ liệu lịch sử. và tính toán nhanh hơn. Nhưng vấn đề là những gì được tính theo cách này là giá trị trung bình và phương sai của toàn bộ mẫu, trong khi trong chiến lược thực tế, chúng ta cần xem xét một khoảng thời gian cố định nhất định. Bằng cách quan sát bản cập nhật trung bình ở trên, chúng ta có thể thấy rằng lượng cập nhật trung bình mới là độ lệch của dữ liệu mới so với trung bình trước đó nhân với tỷ lệ. Nếu tỷ lệ này cố định, chúng ta sẽ có được trung bình có trọng số theo hàm mũ mà chúng ta sẽ thảo luận tiếp theo.

Trung bình có trọng số theo cấp số nhân

Giá trị trung bình theo hàm mũ có thể được xác định bằng mối quan hệ đệ quy sau:

\(\mu_t = \alpha x_t + (1 - \alpha) \mu_{t-1}\)

trong đó \(\mu_t\) là giá trị trung bình theo trọng số mũ tại thời điểm \(t\), \(x_t\) là giá trị quan sát được tại thời điểm \(t\), \(\alpha\) là hệ số trọng số và \(\mu_{t-1}\) là Nó là giá trị trung bình theo cấp số nhân của thời điểm trước đó.

Phương sai có trọng số theo hàm mũ

Đối với phương sai, chúng ta cần tính toán trung bình theo hàm mũ của các độ lệch bình phương tại mỗi thời điểm. Điều này có thể đạt được thông qua mối quan hệ lặp lại sau:

\(S_n = \alpha S_{n-1} + (1 - \alpha)(x_n - \mu_n)(x_n - \mu_{n-1})\)

trong đó \(\sigma_t^2\) là phương sai có trọng số theo hàm mũ tại thời điểm \(t\), và \(\sigma_{t-1}^2\) là phương sai có trọng số theo hàm mũ tại thời điểm trước đó.

Quan sát giá trị trung bình và phương sai theo hàm mũ. Các dạng cập nhật gia tăng của chúng phù hợp với trực giác. Cả hai đều giữ lại một phần giá trị trong quá khứ và thêm vào sự thay đổi mới. Quá trình suy luận cụ thể có thể được tham khảo trong bài báo này: https://fanf2.user . srcf.net/hermes/doc/antiforgery/stats.pdf

Đường trung bình động đơn giản (SMA) so với đường trung bình động hàm mũ (EMA)

Trung bình đơn giản (còn gọi là trung bình số học) và trung bình có trọng số theo hàm mũ là hai phép đo thống kê phổ biến, mỗi phép có những đặc điểm và cách sử dụng khác nhau. Giá trị trung bình đơn giản đưa ra trọng số như nhau cho mỗi quan sát và phản ánh vị trí trung tâm của tập dữ liệu. Trung bình theo hàm mũ là phép tính đệ quy chú trọng hơn vào các quan sát gần đây hơn. Trọng lượng giảm theo cấp số nhân khi quan sát cách xa thời điểm hiện tại.

  • Phân phối trọng lượng:Trung bình đơn giản đưa ra trọng số bằng nhau cho mỗi điểm dữ liệu, trong khi trung bình theo cấp số nhân đưa ra trọng số cao hơn cho các điểm dữ liệu gần đây nhất.
  • Nhạy cảm với thông tin mới:Trung bình đơn giản không đủ nhạy với dữ liệu mới được thêm vào vì nó liên quan đến việc tính toán lại tất cả các điểm dữ liệu. Trung bình theo cấp số nhân có thể phản ánh những thay đổi trong dữ liệu mới nhất nhanh hơn.
  • Độ phức tạp tính toán:Việc tính toán trung bình đơn giản tương đối đơn giản, nhưng khi số lượng điểm dữ liệu tăng lên, chi phí tính toán cũng sẽ tăng lên. Giá trị trung bình theo hàm mũ phức tạp hơn khi tính toán, nhưng do tính chất đệ quy nên nó có thể hiệu quả hơn đối với các luồng dữ liệu liên tục.

Phương pháp chuyển đổi gần đúng EMA và SMA

Mặc dù trung bình đơn giản và trung bình có trọng số theo hàm mũ khác nhau về mặt khái niệm, chúng ta có thể làm cho trung bình có trọng số theo hàm mũ xấp xỉ trung bình đơn giản cho một số lượng quan sát cụ thể bằng cách chọn giá trị \(\alpha\) thích hợp. Mối quan hệ gần đúng này có thể được mô tả bằng quy mô mẫu hiệu dụng, là một hàm của hệ số trọng số \(\alpha\) trong giá trị trung bình theo hàm mũ.

Đường trung bình động đơn giản (SMA) là giá trung bình cộng của tất cả giá trong một khoảng thời gian nhất định. Đối với cửa sổ thời gian \(N\), tâm của SMA (nơi có giá trị trung bình) có thể được coi là:

\(\text{Trọng tâm SMA} = \frac{1 + N}{2}\)

Đường trung bình động hàm mũ (EMA) là đường trung bình có trọng số trong đó các điểm dữ liệu gần đây hơn có trọng số lớn hơn. Trọng lượng của EMA giảm theo cấp số nhân theo thời gian. Tâm của EMA có thể được tính bằng cách cộng các chuỗi sau:

\(\text{Trọng tâm EMA} = \alpha \times \left[1 + 2(1 - \alpha) + 3(1 - \alpha)^2 + \cdots \right] = \frac{1}{\alpha}\)

Khi chúng ta giả sử SMA và EMA có cùng khối tâm, chúng ta sẽ có:

\(\frac{1 + N}{2} = \frac{1}{\alpha}\)

Giải phương trình này, ta có thể thu được mối quan hệ giữa \(\alpha\)\(N\):

\(\alpha = \frac{2}{N + 1}\)

Điều này có nghĩa là, đối với SMA \(N\)-ngày nhất định, giá trị \(\alpha\) tương ứng có thể được sử dụng để tính toán EMA “tương đương” sao cho hai EMA có cùng khối tâm và kết quả rất giống nhau.

Chuyển đổi EMA với các tần số cập nhật khác nhau

Giả sử chúng ta có một EMA được cập nhật mỗi giây với hệ số trọng số là \(\alpha_1\). Điều này có nghĩa là mỗi giây, một điểm dữ liệu mới được thêm vào EMA với trọng số \(\alpha_1\), trong khi tác động của các điểm dữ liệu cũ được nhân với \(1 - \alpha_1\).

Nếu chúng ta thay đổi tần suất cập nhật, chẳng hạn như cập nhật sau mỗi \(f\) giây, chúng ta muốn tìm một hệ số trọng số mới \(\alpha_2\) sao cho tổng tác động của một điểm dữ liệu trong vòng \(f\) giây giống như khi cập nhật sau mỗi giây .

Trong hơn \(f\) giây, nếu không có bản cập nhật nào được thực hiện, ảnh hưởng của các điểm dữ liệu cũ sẽ liên tục giảm \(f\) lần, mỗi lần nhân với \(1 - \alpha_1\). Do đó, hệ số phân rã tổng cộng sau \(f\) giây là \((1 - \alpha_1)^f\).

Để làm cho EMA được cập nhật sau mỗi \(f\) giây có cùng hiệu ứng suy giảm trong một chu kỳ cập nhật như EMA được cập nhật một lần mỗi giây, chúng tôi đặt hệ số suy giảm tổng sau \(f\) giây bằng với hệ số suy giảm trong một lần cập nhật xe đạp:

\((1 - \alpha_1)^f = 1 - \alpha_2\)

Giải phương trình này, ta thu được hệ số trọng số mới \(\alpha_2\):

\(\alpha_2 = 1 - (1 - \alpha_1)^f\)

Công thức này cung cấp giá trị gần đúng cho hệ số trọng số mới \(\alpha_2\) giúp duy trì hiệu ứng làm mịn EMA không đổi khi tần suất cập nhật thay đổi. Ví dụ, chúng ta tính giá trung bình \(\alpha_1\) là 0,001 và cập nhật giá mới nhất sau mỗi 10 giây. Nếu chúng ta đổi thành 1 giây, giá trị tương đương \(\alpha_2\) là khoảng 0,01

Triển khai mã Python

class ExponentialWeightedStats:
    def __init__(self, alpha):
        self.alpha = alpha
        self.mu = 0
        self.S = 0
        self.initialized = False

    def update(self, x):
        if not self.initialized:
            self.mu = x
            self.S = 0
            self.initialized = True
        else:
            temp = x - self.mu
            new_mu = self.mu + self.alpha * temp
            self.S = self.alpha * self.S + (1 - self.alpha) * temp * (x - self.mu)
            self.mu = new_mu

    @property
    def mean(self):
        return self.mu

    @property
    def variance(self):
        return self.S

# 使用示例
alpha = 0.05  # 权重因子
stats = ExponentialWeightedStats(alpha)
data_stream = [] # 数据流
for data_point in data_stream:
    stats.update(data_point)

Tóm tắt

Trong giao dịch theo chương trình tần suất cao, việc xử lý nhanh dữ liệu thời gian thực là rất quan trọng. Để cải thiện hiệu quả tính toán và giảm mức tiêu thụ tài nguyên, bài báo này giới thiệu một thuật toán cập nhật trực tuyến để liên tục tính toán giá trị trung bình và phương sai có trọng số của luồng dữ liệu. Việc tính toán các bản cập nhật gia tăng theo thời gian thực cũng có thể được sử dụng để tính toán nhiều dữ liệu thống kê và chỉ số khác nhau, chẳng hạn như mối tương quan giữa giá hai tài sản, điều chỉnh tuyến tính, v.v., có tiềm năng rất lớn. Các bản cập nhật gia tăng xử lý dữ liệu như một hệ thống tín hiệu, là sự phát triển về tư duy so với các phép tính theo chu kỳ cố định. Nếu chiến lược của bạn cũng có phần lưu các tính toán dữ liệu lịch sử, bạn cũng có thể sửa đổi nó theo ý tưởng này, chỉ ghi lại ước tính về trạng thái hệ thống và khi có dữ liệu mới, hãy cập nhật trạng thái hệ thống, v.v.