
Dalam perdagangan terprogram, sering kali perlu menghitung rata-rata dan varians, seperti saat menghitung indikator seperti rata-rata pergerakan dan volatilitas. Ketika kita memerlukan kalkulasi frekuensi tinggi dan jangka panjang, kita perlu menyimpan data historis jangka panjang, yang tidak perlu serta memakan waktu dan sumber daya. Makalah ini memperkenalkan algoritma pembaruan daring untuk menghitung rata-rata tertimbang dan varians, yang khususnya penting untuk memproses aliran data waktu nyata dan menyesuaikan strategi perdagangan secara dinamis, terutama strategi frekuensi tinggi. Artikel ini juga menyediakan implementasi kode Python yang sesuai untuk membantu pedagang dengan cepat menyebarkan dan mengaplikasikan algoritma ini dalam transaksi sebenarnya.
Jika kita menggunakan \(\mu_n\) untuk mewakili rata-rata titik data ke-\(n\), dengan asumsi bahwa kita telah menghitung rata-rata titik data \({n-1}\) \(\mu_{n-1}\), sekarang kita Titik data baru \(x_{n}\) diterima. Kami ingin menghitung rata-rata baru \(\mu_{n}\) yang mencakup titik data baru ini. Berikut ini adalah uraian terperincinya.
\(\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})\)
Proses pembaruan varians dapat diuraikan menjadi langkah-langkah berikut:
\(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}\)
Seperti yang dapat dilihat dari kedua rumus di atas, proses ini memungkinkan kita untuk memperbarui mean dan varians baru dengan hanya mempertahankan mean dan varians dari data sebelumnya ketika menerima setiap titik data baru \(x_n\), tanpa menyimpan data historis. , dan perhitungannya lebih cepat. Namun masalahnya adalah apa yang dihitung dengan cara ini adalah rata-rata dan varians seluruh sampel, sedangkan dalam strategi sebenarnya, kita perlu mempertimbangkan periode tetap tertentu. Dengan mengamati pembaruan rata-rata di atas, kita dapat melihat bahwa jumlah pembaruan rata-rata yang baru adalah deviasi data baru dari rata-rata sebelumnya dikalikan dengan rasio. Jika rasio ini tetap, kita akan mendapatkan rata-rata tertimbang eksponensial yang akan kita bahas selanjutnya.
Rata-rata tertimbang eksponensial dapat didefinisikan dengan hubungan rekursif berikut:
\(\mu_t = \alpha x_t + (1 - \alpha) \mu_{t-1}\)
di mana \(\mu_t\) adalah rata-rata tertimbang eksponensial pada titik waktu \(t\), \(x_t\) adalah nilai teramati pada titik waktu \(t\), \(\alpha\) adalah faktor bobot, dan \(\mu_{t-1}\) adalah rata-rata tertimbang secara eksponensial dari titik waktu sebelumnya.
Untuk varians, kita perlu menghitung rata-rata tertimbang secara eksponensial dari deviasi kuadrat pada setiap titik waktu. Hal ini dapat dicapai melalui hubungan rekursif berikut:
\(S_n = \alpha S_{n-1} + (1 - \alpha)(x_n - \mu_n)(x_n - \mu_{n-1})\)
di mana \(\sigma_t^2\) adalah varians terbobot eksponensial pada titik waktu \(t\), dan \(\sigma_{t-1}^2\) adalah varians terbobot eksponensial pada titik waktu sebelumnya.
Amati rata-rata dan varians yang tertimbang secara eksponensial. Bentuk pembaruan inkrementalnya sejalan dengan intuisi. Keduanya mempertahankan sebagian dari nilai masa lalu dan menambahkan perubahan baru. Proses derivasi spesifik dapat dirujuk ke makalah ini: https://fanf2.user srcf.net/hermes/doc/antiforgery/stats.pdf
Rata-rata sederhana (juga dikenal sebagai rata-rata aritmatika) dan rata-rata tertimbang eksponensial adalah dua ukuran statistik umum, masing-masing dengan karakteristik dan kegunaan yang berbeda. Rata-rata sederhana memberikan bobot yang sama pada setiap observasi dan mencerminkan lokasi pusat kumpulan data. Rata-rata tertimbang secara eksponensial adalah perhitungan rekursif yang memberikan bobot lebih besar pada pengamatan terkini. Bobotnya berkurang secara eksponensial saat pengamatan semakin menjauh dari waktu saat ini.
Walaupun rata-rata sederhana dan rata-rata tertimbang eksponensial secara konseptual berbeda, kita dapat membuat rata-rata tertimbang eksponensial mendekati rata-rata sederhana untuk sejumlah observasi tertentu dengan memilih nilai \(\alpha\) yang tepat. Hubungan perkiraan ini dapat dijelaskan dengan ukuran sampel efektif, yang merupakan fungsi faktor bobot \(\alpha\) dalam rata-rata tertimbang secara eksponensial.
Simple Moving Average (SMA) adalah rata-rata aritmatika semua harga dalam jangka waktu tertentu. Untuk jangka waktu \(N\), titik pusat SMA (di mana rata-ratanya berada) dapat dianggap sebagai:
\(\teks{SMA titik berat} = \frac{1 + N}{2}\)
Rata-rata pergerakan eksponensial (EMA) adalah rata-rata tertimbang di mana titik data yang lebih baru memiliki bobot lebih besar. Bobot EMA menurun secara eksponensial seiring berjalannya waktu. Sentroid EMA dapat diperoleh dengan menjumlahkan seri berikut:
\(\teks{pusat massa EMA} = \alpha \kali \kiri[1 + 2(1 - \alpha) + 3(1 - \alpha)^2 + \cdots \right] = \frac{1}{\alpha}\)
Ketika kita berasumsi bahwa SMA dan EMA memiliki pusat massa yang sama, kita memperoleh:
\(\frac{1 + N}{2} = \frac{1}{\alpha}\)
Dengan menyelesaikan persamaan ini, kita bisa mendapatkan hubungan antara \(\alpha\) dan \(N\):
\(\alpha = \frac{2}{N + 1}\)
Artinya, untuk SMA \(N\)-hari tertentu, nilai \(\alpha\) yang sesuai dapat digunakan untuk menghitung EMA “ekuivalen” sehingga keduanya memiliki pusat massa yang sama dan hasilnya sangat mirip.
Misalkan kita memiliki EMA yang diperbarui setiap detik dengan faktor bobot \(\alpha_1\). Artinya setiap detik, titik data baru ditambahkan ke EMA dengan bobot \(\alpha_1\), sementara dampak titik data lama dikalikan dengan \(1 - \alpha_1\).
Jika kita mengubah frekuensi pembaruan, katakanlah memperbarui setiap \(f\) detik, kita ingin menemukan faktor bobot baru \(\alpha_2\) sehingga dampak total dari titik data dalam \(f\) detik sama seperti ketika memperbarui setiap detik. .
Selama \(f\) detik, jika tidak ada pembaruan yang dilakukan, pengaruh titik data lama akan berkurang sebanyak \(f\) kali, setiap kali dikalikan dengan \(1 - \alpha_1\). Oleh karena itu, faktor peluruhan total setelah \(f\) detik adalah \((1 - \alpha_1)^f\).
Untuk membuat EMA yang diperbarui setiap \(f\) detik memiliki efek peluruhan yang sama dalam satu siklus pembaruan seperti EMA yang diperbarui sekali per detik, kita menetapkan faktor peluruhan total setelah \(f\) detik menjadi sama dengan faktor peluruhan dalam satu pembaruan. siklus:
\((1 - \alpha_1)^f = 1 - \alpha_2\)
Dengan menyelesaikan persamaan ini, kita memperoleh faktor bobot baru \(\alpha_2\):
\(\alpha_2 = 1 - (1 - \alpha_1)^f\)
Rumus ini memberikan perkiraan untuk faktor bobot baru \(\alpha_2\) yang menjaga efek penghalusan EMA tetap konstan saat frekuensi pembaruan berubah. Misalnya, kita hitung harga rata-rata \(\alpha_1\) sebagai 0,001, dan perbarui harga terbaru setiap 10 detik. Jika kita ubah ke 1 detik, ekuivalen \(\alpha_2\) adalah sekitar 0,01
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)
Dalam perdagangan terprogram frekuensi tinggi, pemrosesan cepat data waktu nyata sangatlah penting. Untuk meningkatkan efisiensi komputasi dan mengurangi konsumsi sumber daya, makalah ini memperkenalkan algoritma pembaruan daring untuk menghitung rata-rata tertimbang dan varians aliran data secara terus-menerus. Perhitungan pembaruan tambahan secara real-time juga dapat digunakan untuk menghitung berbagai data dan indikator statistik, seperti korelasi antara dua harga aset, penyesuaian linier, dan lain-lain, yang memiliki potensi besar. Pembaruan bertahap memperlakukan data sebagai sistem sinyal, yang merupakan evolusi pemikiran dibandingkan dengan kalkulasi periode tetap. Jika strategi Anda juga memiliki bagian yang menyimpan kalkulasi data historis, Anda sebaiknya memodifikasinya sesuai dengan ide ini, hanya mencatat estimasi status sistem, dan saat data baru tiba, memperbarui status sistem, dan seterusnya.