Alat pedagang terprogram: algoritma pembaruan inkremental untuk menghitung rata-rata dan selisih

Penulis:Rumput, Dibuat: 2023-11-08 16:28:36, Diperbarui: 2023-11-09 20:46:17

img

Daftar

Dalam perdagangan terprogram, seringkali perlu menghitung rata-rata dan defisit, seperti dalam perhitungan indikator seperti rata-rata dan fluktuasi. Ketika kita membutuhkan perhitungan frekuensi tinggi dan siklus panjang, data historis harus disimpan untuk waktu yang lama, yang tidak perlu dan memakan sumber daya. Artikel ini memperkenalkan algoritma pembaruan online untuk menghitung rata-rata dan defisit yang ditingkatkan, yang sangat penting untuk menangani aliran data real-time dan strategi perdagangan penyesuaian dinamis, terutama strategi frekuensi tinggi.

Rata-rata sederhana dan perbedaannya

Jika kita menggunakan $\mu_n$ untuk menunjukkan rata-rata titik data ke $\n$, misalkan kita telah menghitung rata-rata titik data $\mu_{n-1}$, kita sekarang menerima titik data baru $x_{n}$. Kita ingin menghitung rata-rata baru $\mu_{n}$ yang berisi titik data baru ini. Berikut adalah inferensi rinci.

$\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 diferensial dapat dipecah 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}) $S_n = S_{n-1} + (x_n - \mu_{n-1}) $\sigma_n^2 = \frac{S_n}{n}$

Dari dua rumus di atas, proses ini memungkinkan kita untuk menyimpan rata-rata dan perbedaan dari satu data saja pada setiap titik data baru $x_n$ yang diterima, sehingga rata-rata dan perbedaan baru dapat diperbarui tanpa perlu menyimpan data historis, dan perhitungan lebih cepat. Tetapi masalahnya adalah bahwa perhitungan ini adalah rata-rata dan perbedaan dari seluruh sampel, dan dalam strategi praktis, yang perlu kita pertimbangkan adalah periode tetap tertentu.

Rata-rata yang ditimbang secara eksponensial

Rata-rata berat indeks dapat didefinisikan dengan hubungan rekursif berikut:

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

Di mana, $\mu_t$ adalah rata-rata indeks terberat pada titik waktu $t$, $x_t$ adalah nilai pengamatan pada titik waktu $t$, $\alpha$ adalah faktor bobot, dan $\mu_{t-1} $ adalah rata-rata indeks terberat pada titik waktu sebelumnya.

Variansi tertimbang eksponensial

Untuk perbedaannya, kita perlu menghitung rata-rata indeks ditambah berat perbedaannya pada setiap titik waktu. Hal ini dapat dicapai dengan relasi 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 perbedaan pangkat plus indeks pada titik waktu $t$, dan $\sigma_{t-1}^2$ adalah perbedaan pangkat plus indeks pada titik waktu sebelumnya.

Indeks pengamatan ditambah dengan rata-rata dan suku cadang, dengan bentuk peningkatan yang diperbarui sesuai dengan intuisi, mempertahankan sebagian dari nilai masa lalu, ditambah dengan perubahan baru, proses inferensi spesifik dapat merujuk pada makalah ini:https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf

Rata-rata bergerak sederhana (SMA) dan rata-rata bergerak indeks (EMA)

Rata-rata sederhana (juga disebut rata-rata aritmatika) dan rata-rata terberat indeks adalah dua ukuran statistik yang umum, masing-masing memiliki karakteristik dan kegunaan yang berbeda. Rata-rata sederhana memberikan bobot yang sama pada setiap nilai observasi, yang mencerminkan posisi pusat dari kumpulan data. Rata-rata terberat indeks adalah metode perhitungan regresi yang memberikan bobot yang lebih tinggi pada nilai observasi terbaru.

  • Pengelolaan: rata-rata sederhana memberikan bobot yang sama pada setiap titik data, sedangkan rata-rata indeksasi memberikan bobot yang lebih tinggi pada titik data terdekat.
  • Sensitivitas terhadap informasi baru: rata-rata sederhana tidak cukup sensitif terhadap data yang baru ditambahkan karena melibatkan perhitungan ulang dari semua titik data. Rata-rata berlemak indeks dapat mencerminkan perubahan data terbaru lebih cepat.
  • Kompleksitas komputasi: Perhitungan rata-rata sederhana relatif sederhana, tetapi biaya perhitungan juga meningkat seiring bertambahnya titik data. Perhitungan rata-rata terberat indeks lebih rumit, tetapi karena sifatnya yang berulang, dapat menangani aliran data berkelanjutan dengan lebih efisien.

EMA dan SMA adalah metode perhitungan yang hampir sama

Meskipun rata-rata sederhana dan rata-rata terberat indeks secara konseptual berbeda, kita dapat membuat rata-rata terberat indeks mendekati rata-rata sederhana yang berisi nilai pengamatan kuantitas tertentu dengan memilih nilai $\alpha$ yang tepat. Hubungan ini dapat dijelaskan dengan ukuran sampel efektif, yang merupakan fungsi dari faktor bobot $\alpha$ dalam rata-rata terberat indeks.

Rata-rata bergerak sederhana (SMA) adalah rata-rata aritmatika dari semua harga dalam jendela waktu tertentu. Untuk jendela waktu $N$, pusat massa (SMA) dapat dianggap sebagai:

$\text{SMA} = \frac{1 + N}{2}$

Rata-rata bergerak indeks (EMA) adalah rata-rata terberat di mana titik data terdekat memiliki bobot yang lebih besar. Berat EMA berkurang seiring dengan tingkat indeks waktu. Pusat massa EMA dapat diperoleh dengan mencari dan mencari tingkat berikut:

$\text{EMA} = \alpha \times \left[1 + 2 ((1 - \alpha) + 3 ((1 - \alpha) ^2 + \cdots \right] = \frac{1}{\alpha}$

Bila kita mengasumsikan bahwa SMA dan EMA memiliki massa yang sama, kita bisa mendapatkan:

$\frac{1 + N}{2} = \frac{1}{\alpha}$

Jika kita memecahkan persamaan ini, kita bisa mendapatkan hubungan antara $\alpha$ dan $N$:

$\alpha = \frac{2}{N + 1}$

Ini berarti bahwa untuk SMA $N$ hari yang diberikan, nilai $\alpha$ yang sesuai dapat digunakan untuk menghitung EMA yang sama dengan EMA, sehingga keduanya memiliki massa yang sama dan hasilnya sangat dekat.

Pertukaran frekuensi pembaruan EMA yang berbeda

Misalkan kita memiliki EMA yang diperbarui setiap detik dengan faktor bobot $\alpha_1$. Ini berarti bahwa setiap detik titik data baru akan ditambahkan ke EMA dengan bobot $\alpha_1$, sedangkan dampak titik data lama akan dikalikan dengan $1 - \alpha_1$.

Jika kita mengubah frekuensi pembaruan, misalnya setiap $f$ detik, kita ingin menemukan faktor bobot baru $\alpha_2$, sehingga dampak keseluruhan titik data dalam $f$ detik sama dengan saat pembaruan per detik.

Dalam waktu $f$ detik, jika tidak diperbarui, dampak dari titik data lama akan terus menurun $f$ kali, setiap kali dikalikan dengan $1 - \alpha_1$. Oleh karena itu, faktor penurunan total setelah $f$ detik adalah $(1 - \alpha_1) ^ f$.

Untuk membuat EMA yang diperbarui $f$ per detik memiliki efek penurunan yang sama dengan EMA yang diperbarui per detik dalam satu siklus pembaruan, kita mengatur faktor penurunan total setelah $f$ per detik sama dengan faktor penurunan dalam satu siklus pembaruan:

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

Jika kita memecahkan persamaan ini, kita mendapatkan faktor bobot baru $\alpha_2$:

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

Rumus ini memberikan perkiraan nilai faktor bobot baru $\alpha_2$ yang tidak berubah pada perubahan frekuensi pembaruan untuk mempertahankan efek EMA yang lancar. Sebagai contoh: kita menghitung harga rata-rata $\alpha_1$ sebesar 0.001, dan harga terbaru diperbarui setiap 10s, jika diubah menjadi 1s, maka $\alpha_2$ setara dengan sekitar 0.01

Implementasi kode 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)

Pengamatan

Dalam perdagangan terprogram frekuensi tinggi, pemrosesan data real-time yang cepat sangat penting. Untuk meningkatkan efisiensi komputasi dan mengurangi konsumsi sumber daya, artikel ini memperkenalkan algoritma pembaruan online untuk menghitung rata-rata dan diferensial ditambahkan dari aliran data secara berkelanjutan. Perhitungan pembaruan inkremental real-time juga dapat digunakan untuk perhitungan berbagai data statistik dan indikator, seperti hubungan harga dua aset, kesesuaian linear, dll.


Lebih banyak