ガウス波予測戦略は,ガウスフィルタリングに基づく定量的な取引戦略である.ガウスフィルタのスムージング機能を使用して,価格シリーズを複数回フィルタリングし,複数のスムージング価格シリーズを生成する.その後,これらの価格シリーズの多項式フィッティングと組み合わせて,将来の価格の予測を実現する.予測結果に応じて,ロングまたはショートポジションの提案を与える.
この戦略の核心はガウスフィルターアルゴリズムである.ガウスフィルターは,ガウス関数を重みとして使用する線形スムーズ化フィルターである.戦略のパラメータ p はフィルタリングウィンドウのサイズとして設定されている.その後,フィルタリング係数 alfa は三角関数で計算される.各価格シリーズ ret\[i\] は,元の価格シリーズの第1回ガウスフィルタリング後の結果を表す.
この戦略は再帰の考え方を採用している.まず,alpha と元の価格シリーズ価格で,最初のフィルタリング ret を計算する.その後,ret をベースに,第2回のフィルタリングを ret 2 を取得するために実行する.これを複数回繰り返す.最後に,複数の価格シリーズを組み合わせることで,将来の価格 ret 4 を予測するために曲線を配置する.予測価格が現在の実際の価格よりも高くなった場合,ロングに行く.現在の価格よりも低い場合はショートに行く.
複数のフィルタリングによって,よりスムーズで,傾向に適していることができます.同時に,多項式フィッティングと組み合わせて,短期間の価格動向の予測を実現します.
この戦略には以下の利点があります.
高周波のノイズを効果的にフィルタリングし,戦略をより安定させることができます.
繰り返しの複数のフィルタリングにより 価格動向に適し 予測効果を向上させる
多項式フィッティングに基づいた価格予測. 短期的な価格動向をモデル化し,取引信号を生成することができる.
現在の価格と予測価格に基づいて判断します. 取引信号は,トレンド予測と直接組み合わせられ,取引機会を逃さないようにします.
実行し,理解し,最適化しやすい.他の分析指標を拡張するための高周波戦略の基本モジュールとして機能することができます.
この戦略には次のリスクもあります
価格の急激な変化に対するガウスフィルターの平滑効果は短期間の取引機会を逃す可能性があります.
多項式フィッティングは過度にフィッティングするリスクがあります.価格変化モデルが突然変異した場合,予測効果は低下します.
フィルター窓のサイズと配列の順序を正確に設定する必要があります. そうでなければ失敗する可能性があります.
取引シグナルの開示価格のみをベースにし,日中取引はできません.
戦略は以下の側面で最適化できます.
モデル訓練と滑り窓の再訓練メカニズムを追加し,パラメータのダイナミックな調整をすることで,過剰装着のリスクを減らす.
価格指標や特徴を増やしてインプットを豊かにし 予測を安定させる
ストップ・ロスのメカニズムを追加し 極端な市場状況で大きな損失を避けるために 最大損失比を設定します
ポジション管理を最適化し 予測の精度と変動に基づいて ポジションを動的に調整します
LSTMのような主流の機械学習モデルに基づく予測を試して 予測能力をさらに向上させてください
概要すると,これは高周波定量戦略で,ガウスフィルターと多項式フィッティングを使用して価格予測を行う.特定の利点があるが,改善余地もある.より多くの機能,ダイナミックパラメータチューニング,ストップ損失メカニズムなどを導入することで,戦略効果がはるかに向上することができる.この戦略は,高周波戦略のさらなる研究と最適化のための基本的なモジュールとして基礎を築く.
/*backtest start: 2023-01-15 00:00:00 end: 2024-01-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Gaussbot v1.0", overlay=true) p = input(20, minval=1, title="Length") price = input(open, title="Source") pi=3.1415926535 w=2*pi/p beta = (1 - cos(w))/(pow(1.414,2.0/3) - 1) alfa = -beta + sqrt(beta*beta + 2*beta) ret= pow(alfa,4)*price+4*(1-alfa)*nz(ret[1])-6*pow(1-alfa,2)*nz(ret[2])+4*pow(1-alfa,3)*nz(ret[3])-pow(1-alfa,4)*nz(ret[4]) ret2 = pow(alfa,4)*ret+4*(1-alfa)*nz(ret2[1])-6*pow(1-alfa,2)*nz(ret2[2])+4*pow(1-alfa,3)*nz(ret2[3])-pow(1-alfa,4)*nz(ret2[4]) ret3 = pow(alfa,4)*ret2+4*(1-alfa)*nz(ret3[1])-6*pow(1-alfa,2)*nz(ret3[2])+4*pow(1-alfa,3)*nz(ret3[3])-pow(1-alfa,4)*nz(ret3[4]) ret4 = 3*ret-3*ret2+ret3 diff2 = nz(ret[1]) - nz(ret[2]) - (nz(ret[2]) - nz(ret[3]) ) diff22 = nz(ret2[1]) - nz(ret2[2]) - (nz(ret2[2]) - nz(ret2[3]) ) diff23 = nz(ret3[1]) - nz(ret3[2]) - (nz(ret3[2]) - nz(ret3[3]) ) diff24 = nz(ret4[1]) - nz(ret4[2]) - (nz(ret4[2]) - nz(ret4[3]) ) longCondition = price[0] - ret4[1] > 0 shortCondition = price[0] - ret4[1] < 0 if(longCondition and shortCondition) longCondition = longCondition[1] shortCondition = shortCondition[1] if(longCondition==false and shortCondition==false) longCondition = longCondition[1] shortCondition = shortCondition[1] if (longCondition==true and shortCondition == false) strategy.entry("Gaussbot Long", strategy.long ) if (longCondition==false and shortCondition == true) strategy.entry("Gaussbot Short", strategy.short)