Dalam dagangan berprogram, biasanya perlu untuk mengira purata dan perbezaannya, seperti dalam mengira metrik seperti rata-rata dan kadar turun naik. Apabila kita memerlukan pengiraan frekuensi tinggi dan jangka panjang, data sejarah perlu disimpan untuk masa yang lama, yang tidak perlu dan memakan sumber. Artikel ini memperkenalkan algoritma kemas kini dalam talian untuk mengira purata dan perbezaannya yang ditimbang, yang sangat penting untuk menangani aliran data masa nyata dan strategi dagangan penyesuaian dinamik, terutamanya strategi frekuensi tinggi. Artikel ini juga menyediakan pelaksanaan kod Python yang sesuai untuk membantu peniaga dengan cepat menggunakan dan menggunakan algoritma ini dalam perdagangan sebenar.
Jika kita menggunakan $\mu_n$ untuk mewakili purata titik data $\n$, anggaplah kita telah mengira purata titik data $\mu_{n-1}$, dan sekarang kita menerima titik data baru $x_{n}$. Kita mahu mengira purata baru $\mu_{n}$ yang mengandungi titik data baru ini. Berikut adalah deduksi terperinci.
$\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 kemas kini perbezaannya boleh dibahagikan kepada 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}) $S_n = S_{n-1} + (x_n - \mu_{n-1}) $\sigma_n^2 = \frac{S_n}{n}$
Seperti yang dapat dilihat dari dua formula di atas, proses ini membolehkan kita menyimpan hanya satu purata dan perbezaan data pada setiap titik data baru yang diterima $x_n$, sehingga kita dapat mengemas kini purata dan perbezaan baru tanpa menyimpan data sejarah, dan mengira lebih cepat. Tetapi masalahnya adalah bahawa ia dikira sebagai purata dan perbezaan keseluruhan sampel, dan dalam strategi sebenar, apa yang perlu kita pertimbangkan adalah tempoh tetap tertentu.
Rata-rata berat indeks boleh ditakrifkan dengan hubungan berulang berikut:
$\mu_t = \alpha x_t + (1 - \alpha) \mu_{t-1}$
Di mana $\mu_t$ adalah purata indeks ditambah berat pada titik masa $t$, $x_t$ adalah nilai pemerhatian pada titik masa $t$, $\alpha$ adalah faktor berat, dan $\mu_{t-1} $ adalah purata indeks ditambah berat pada titik masa sebelumnya.
Untuk perbezaannya, kita perlu mengira purata berat indeks perbezaannya pada setiap titik masa. Ini boleh dicapai dengan hubungan berulang berikut:
$S_n = \alpha S_{n-1} + (1 - \alpha) ((x_n - \mu_n) ((x_n - \mu_{n-1}) $
Di mana $\sigma_t^2$ adalah perbezaan pangkat plus indeks pada titik waktu $t$, dan $\sigma_{t-1}^2$ adalah perbezaan pangkat plus indeks pada titik masa sebelumnya.
Indeks pemerhatian ditambah dengan purata dan perbandingan, bentuk pembaruan peningkatan mereka sesuai dengan intuisi, mengekalkan sebahagian daripada nilai masa lalu, ditambah dengan perubahan baru, proses deduksi konkrit boleh merujuk kepada kertas kerja ini:https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf
Purata sederhana (juga dikenali sebagai purata aritmatika) dan purata berimbang indeks adalah dua ukuran statistik yang biasa digunakan, masing-masing mempunyai ciri dan kegunaan yang berbeza. Purata sederhana memberi berat yang sama kepada setiap nilai pemerhatian, yang mencerminkan kedudukan pusat set data. Purata berimbang indeks adalah satu kaedah pengiraan berulang yang memberikan berat yang lebih tinggi kepada nilai pemerhatian terdekat.
Walaupun purata sederhana dan purata berat indeks berbeza secara konseptual, kita boleh membuat purata berat indeks mendekati purata sederhana yang mengandungi nilai pengamatan kuantiti tertentu dengan memilih nilai $\alpha$ yang sesuai. Hubungan ini dapat digambarkan dengan saiz sampel yang berkesan, yang merupakan fungsi faktor berat $\alpha$ dalam purata berat indeks.
Purata bergerak sederhana (SMA) adalah purata aritmatika semua harga dalam tetingkap masa yang diberikan. Untuk tetingkap masa $N$, pusat massa (SMA) adalah:
$\text{SMA} = \frac{1 + N}{2}$
Rata-rata bergerak indeks (EMA) adalah purata berat di mana titik data terdekat mempunyai berat yang lebih besar. Berat EMA berkurangan dengan kadar indeks masa. Pusat massa EMA boleh diperoleh dengan mencari dan mencari peringkat berikut:
$\text{EMA} = \alpha \times \left[1 + 2 ((1 - \alpha) + 3 ((1 - \alpha) ^2 + \cdots \right] = \frac{1}{\alpha}$
Apabila kita mengandaikan bahawa SMA dan EMA mempunyai massa yang sama, kita dapat:
$\frac{1 + N}{2} = \frac{1}{\alpha}$
Dengan menyelesaikan persamaan ini, kita boleh mendapatkan hubungan antara $\alpha$ dan $N$:
$\alpha = \frac{2}{N + 1}$
Ini bermaksud bahawa untuk SMA $N$ hari yang diberikan, nilai $\alpha$ yang sesuai boleh digunakan untuk mengira EMA yang sama dengan EMA yang sama, sehingga kedua-duanya mempunyai massa yang sama dan hasilnya sangat dekat.
Katakan kita mempunyai EMA yang dikemas kini setiap detik dengan faktor berat $\alpha_1$. Ini bermakna setiap saat, titik data baru akan ditambahkan ke EMA dengan berat $\alpha_1$, dan kesan titik data lama akan didarabkan dengan $1 - \alpha_1$.
Jika kita mengubah kekerapan kemas kini, seperti setiap $f$ saat, kita mahu mencari faktor berat baru $\alpha_2$, sehingga kesan keseluruhan titik data dalam $f$ saat sama seperti semasa kemas kini setiap saat.
Dalam masa $f$ saat, jika tidak diperbaharui, kesan titik data lama akan merosot $f$ kali secara berturut-turut, setiap kali dengan $1 - \alpha_1$. Oleh itu, faktor merosot keseluruhan selepas $f$ saat adalah $(1 - \alpha_1) ^f$.
Untuk menjadikan EMA yang diperbaharui $f$s sekali dalam satu kitaran kemas kini mempunyai kesan penurunan yang sama dengan EMA yang diperbaharui sekali setiap detik, kita menetapkan faktor penurunan keseluruhan selepas $f$s sama dengan faktor penurunan dalam satu kitaran kemas kini:
$(1 - \alpha_1) ^ f = 1 - \alpha_2$
Jika kita selesaikan persamaan ini, kita akan mendapat faktor berat baru $\alpha_2$:
$\alpha_2 = 1 - (1 - \alpha_1) ^f$
Rumus ini memberikan nilai purata faktor berat baru $\alpha_2$ yang mengekalkan kesan EMA yang lancar semasa perubahan kekerapan kemas kini. Sebagai contoh: kita mengira nilai purata harga $\alpha_1$ adalah 0.001, harga terkini dikemas kini setiap 10s, jika diubah menjadi 1s dikemas kini sekali, $\alpha_2$ setara dengan kira-kira 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)
Pengolahan data masa nyata yang cepat adalah penting dalam perdagangan berprogram frekuensi tinggi. Untuk meningkatkan kecekapan pengiraan dan mengurangkan penggunaan sumber, artikel ini memperkenalkan algoritma kemas kini dalam talian untuk mengira purata dan perbezaan yang ditambahkan dalam aliran data secara berterusan. Pengiraan kemas kini peningkatan masa nyata juga boleh digunakan untuk mengira pelbagai data statistik dan petunjuk, seperti hubungan harga dua aset, kesesuaian linear, dan lain-lain.