プログラミングトレーダーの利害:増量更新アルゴリズム 平均値と方差を計算する

作者: リン・ハーン小草, 作成日:2023年11月08日 16:28:36, 更新日:2023年11月09日 20:46:17

img

履歴書

プログラム化取引では,平均値と微分を計算することがしばしば必要である.例えば均線と波動率などの指標を計算する時である.高周波および長周期計算が必要な場合,長時間の履歴データを保持することが必要であり,それは不要であり資源を消費する.この記事は,重み付け平均値と微分を計算するためのオンライン更新アルゴリズムを紹介している.これは,リアルタイムデータ流と動的調整取引戦略,特に高周波戦略を扱うために特に重要です.また,トレーダーが実際の取引にこのアルゴリズムを迅速に展開し,適用するのを助ける,関連するPythonコードの実装も提供しています.

単純な平均と方差

$\mu_{n}$のデータポイントの平均を$\mu_n$で表示すると, $\mu_{n-1}$のデータポイントの平均を$\mu_{n-1}$で計算したと仮定し,新しいデータポイント $x_{n}$を受け取ります.

$\mu_n = \frac{1}{n} \sum_{i=1}^{n} x_i$ 余分に,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で,xは1で, この式は,この式を,この式を,この式を, 計算してみましょう. 計算してみましょう. $\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}) $

差異更新プロセスは次のステップに分けることができます:

この式は,x^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2 $S_n = \sum_{i=1}^{n} x_i^2 - n\mu_n^2$ この2つの条件は,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}$

上記の2つの公式からわかるように,このプロセスは,新しいデータ点$x_n$に新しいデータ点$x_n$を受け取る度に,最初のデータ点の平均値と差を保持し,新しい平均値と差を更新し,歴史的なデータを保存する必要なく,計算がより速くすることができます. しかし,問題は,この方法で計算されるのは,サンプル全体の平均値と差です. 実際の戦略では,一定の固定周期を考慮する必要があります. 上記の平均値更新を見て,新しい平均値更新は,過去の平均値との偏差の割合で1倍です.

指数加重平均数 (指数加重平均数)

指数加重平均は,次の回帰関係によって定義される.

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

$\mu_t$は,時間点 $t$の指数加重平均値, $x_t$は,時間点 $t$の観測値, $\alpha$は重量因数, $\mu_{t-1}$は,前の時間点の指数加重平均値である.

指数加乗方差 (指数加乗方差)

差分については,各時間点の平方差分の指数加重平均を計算する必要があります. これは,次の回帰関係によって実現できます.

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

$\sigma_t^2$は,時間点 $t$の指数加乗差であり, $\sigma_{t-1}^2$は,前の時間点の指数加乗差である.

観察指数加重平均数と方差,それらの増量更新形式は直感的に,過去の値の一部を保持し,新しい変化を加え,具体的な推論プロセスは,この論文を参照することができます:https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf

単純な移動平均 (SMA) と指数移動平均 (EMA)

単純な平均数 (算術平均数とも呼ばれる) と指数加重平均数は,それぞれ異なる特性と用途を持つ2つの一般的な統計指標である. 単純な平均数は,データセットの中心位置を反映する各観測値に同じ重みを付与する. 指数加重平均数は,最近観測値により高い重みを付与する回帰計算方法である. 観測値が現在の時間から距離を拡大するにつれて重量は指数的に減少する.

  • 体重分配単純な平均は,各データポイントに同じ重さを与え,指数加重平均は,最も近いデータポイントにより高い重さを与えます.
  • 新しい情報への敏感性単純な平均は,すべてのデータポイントの再計算を伴うため,新たに追加されたデータに敏感ではない.指数加重平均は,最新のデータの変化をより迅速に反映する.
  • 計算の複雑性単純な平均の計算は比較的簡単だが,データポイントが増えるにつれて計算コストも増加する.指数加重平均の計算はより複雑だが,その帰帰性性性により連続したデータストリームをより効率的に処理できる.

EMAとSMAの近似換算方法

単純な平均数と指数加重平均数とは概念的には異なるが,適切な$\alpha$値を選択することで,指数加重平均を特定の量の観測値を含む単純な平均数に近似させることができる.この近似関係は,指数加重平均数における重量因子$\alpha$の関数である有効サンプルの大きさによって記述できる.

単純な移動平均 (SMA) は,与えられた時間ウィンドウ内のすべての価格の算術平均である.時間ウィンドウ $N$ に対して,SMA の質量中心 (つまり平均値の位置) は以下のように考えられる.

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

指数移動平均 (EMA) は,最も近いデータポイントがより大きな重みを持つ重み平均である.EMAの重さは時間指数階層とともに減少する.EMAの質量中心は,次の階層で求めることができる.

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

SMAとEMAが同じ質量を持つと仮定すると,

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

$\alpha$ と $N$ の関係が得られます.

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

これは,与えられた$N$日のSMAに対して,対応する$\alpha$値は,等同のEMAを計算するために使用され,両者の質量が同じになり,結果は非常に近いことを意味します.

EMAの異なる更新頻度の交換

例えば,EMAが毎秒更新され,重量因子は$\alpha_1$であるとします. つまり,毎秒新しいデータポイントが $\alpha_1$の重さでEMAに追加され,古いデータポイントの影響は $1 - \alpha_1$で倍されます.

更新頻度を変えると,例えば毎$f$秒に1回更新すると,新しい重量因子$\alpha_2$を見つけたいので,$f$秒間のデータポイントの総影響は毎秒更新時と同じになる.

$f$秒間の間に,更新が行われなければ,古いデータポイントの影響は $1 - \alpha_1$で1回連続して減衰する.したがって, $f$秒後の総減衰因子は $(1 - \alpha_1) ^ f$である.

$f$秒ごとに更新されるEMAが,更新周期内の EMAと毎秒ごとに更新されるEMAと同じ衰退効果を持つようにするには, $f$秒後の総衰退因子を,更新周期内の衰退因子に等しく設定します:

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

この方程式を解くと,新しい重量因子 $\alpha_2$ を得ます.

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

この式は,更新頻度の変化にEMAを滑らかに保つ新しい重量因子$\alpha_2$の近似値を示します.例: 平均価格$\alpha_1$を計算すると,0.001で,10秒ごとに最新価格が更新され,1秒ごとに更新されれば,等価$\alpha_2$は約0.01になります.

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)

概要

高周波プログラム化取引では,リアルタイムデータの迅速な処理が不可欠である. 計算効率を向上させ,資源消費を削減するために,この記事では,データ流の加重平均と微分を連続的に計算するためのオンライン更新アルゴリズムを紹介する. リアルタイム増量更新計算は,様々な統計データと指標の計算にも使用され,二つの資産価格関連性,線形適合等などの計算に大きな可能性を秘めている. 増量更新は,固定周期計算の比,データを信号システムとして考える考え方の進化である. もしあなたの戦略に,歴史的なデータ計算の部分があるなら,この考え方を改造して,システム状態の推定のみを記録し,新しいデータが到着するときに,システム状態を更新し,このように循環する.


もっと