プログラム化取引では,平均値と微分を計算することがしばしば必要である.例えば均線と波動率などの指標を計算する時である.高周波および長周期計算が必要な場合,長時間の履歴データを保持することが必要であり,それは不要であり資源を消費する.この記事は,重み付け平均値と微分を計算するためのオンライン更新アルゴリズムを紹介している.これは,リアルタイムデータ流と動的調整取引戦略,特に高周波戦略を扱うために特に重要です.また,トレーダーが実際の取引にこのアルゴリズムを迅速に展開し,適用するのを助ける,関連する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
単純な平均数 (算術平均数とも呼ばれる) と指数加重平均数は,それぞれ異なる特性と用途を持つ2つの一般的な統計指標である. 単純な平均数は,データセットの中心位置を反映する各観測値に同じ重みを付与する. 指数加重平均数は,最近観測値により高い重みを付与する回帰計算方法である. 観測値が現在の時間から距離を拡大するにつれて重量は指数的に減少する.
単純な平均数と指数加重平均数とは概念的には異なるが,適切な$\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が毎秒更新され,重量因子は$\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になります.
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)
高周波プログラム化取引では,リアルタイムデータの迅速な処理が不可欠である. 計算効率を向上させ,資源消費を削減するために,この記事では,データ流の加重平均と微分を連続的に計算するためのオンライン更新アルゴリズムを紹介する. リアルタイム増量更新計算は,様々な統計データと指標の計算にも使用され,二つの資産価格関連性,線形適合等などの計算に大きな可能性を秘めている. 増量更新は,固定周期計算の比,データを信号システムとして考える考え方の進化である. もしあなたの戦略に,歴史的なデータ計算の部分があるなら,この考え方を改造して,システム状態の推定のみを記録し,新しいデータが到着するときに,システム状態を更新し,このように循環する.