Peranti peniaga terprogram: algoritma kemas kini peningkatan untuk mengira rata dan perbezaan

Penulis:Rumput, Dicipta: 2023-11-08 16:28:36, Dikemas kini: 2023-11-09 20:46:17

img

Keterangan

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.

Purata dan suku sederhana

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 (Exponentially-weighted mean)

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.

Varians yang diberi berat eksponensial

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 bergerak mudah (SMA) dan purata bergerak indeks (EMA)

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.

  • Peruntukan berat: purata sederhana memberikan berat yang sama kepada setiap titik data, manakala purata indeks ditambah berat memberi berat yang lebih tinggi kepada titik data terdekat.
  • Sensitiviti terhadap maklumat baru: purata sederhana tidak cukup sensitif terhadap data yang baru ditambahkan kerana ia melibatkan pengiraan semula semua titik data; purata berat indeks dapat mencerminkan perubahan data terkini dengan lebih cepat.
  • Kerumitan Pengiraan: Pengiraan purata sederhana adalah agak mudah, tetapi kos pengiraan juga meningkat dengan peningkatan titik data. Pengiraan purata indeks ditambah berat lebih rumit, tetapi kerana sifatnya yang berulang, ia dapat mengendalikan aliran data berterusan dengan lebih cekap.

EMA dan SMA kira-kira bertukar

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.

EMA menukar frekuensi pembaruan yang berbeza

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

Pelaksanaan kod 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)

Ringkasan

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.


Lebih lanjut