移動平均値に基づく定量的な取引戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-16 17:37:13
タグ:

img

概要

この戦略は,異なるサイクルの移動平均値の黄金十字と死十字に基づいて取引信号を生成する.これは典型的なトレンドフォローする戦略に属している.重み付け移動平均値 (WMA) と適応移動平均値 (ALMA) が主に使用されている.

戦略の論理

この戦略は,まず,価格の中期および短期移動平均,ma1およびma2を計算し,ma1は短いサイクル,ma2は長いサイクルを有する.その後,ma1とma2の違いをma3として計算し,さらにma3の滑らかな移動平均ma4を計算する.ma3がma4を上向きに横切ると,購入信号が生成される.下向きに横切ると,販売信号が生成される.

ma3は,価格の中期トレンドを反映し,ma3からのノイズをフィルタリングしてより信頼性の高い取引信号を形成する. ma1とma2のサイクルは,パラメータ maLen によって設定されます.ユーザーは,異なる市場のための最適な設定を達成するためにパラメータを最適化することができます.

利点

この戦略の利点は以下の通りです.

  1. ALMAとWMAを使うことで 市場の変化に より良く適応できます
  2. 多サイクル価格平均を適用し,取引信号をより信頼できるものにします.
  3. 調節可能なパラメータは,幅広い適用可能性を持つ異なる市場のために最適化できます.
  4. 戦略の論理はシンプルで 実行も簡単です
  5. トレンド市場と横向市場の両方で良いパフォーマンスを達成できます

リスク と 解決策

この戦略にはいくつかのリスクもあります:

  1. シグナルは不透明になり,変動する市場状況のために遅くなる可能性があります.これは移動平均のサイクルとパラメータを最適化することによって解決できます.
  2. 純粋にトレンドフォローする戦略として,範囲限定市場では損失を引き起こす可能性があります.他の指標はフィルターとして追加できます.
  3. 不適切なパラメータ設定は,超短周期による過剰取引を引き起こす可能性があります.適切なパラメータは慎重に選択する必要があります.

最適化

戦略は以下の側面から最適化できます.

  1. LMA,WMA などなど,移動平均の種類をテストします.
  2. ストップ・ロスのメカニズムを追加します. 変動,価格チャネルなどに基づいています.
  3. パラメータの継続的な最適化による多時間枠分析を導入する.
  4. 自動パラメータ最適化のための機械学習アルゴリズムを 強化する

結論

この戦略は,移動平均値の黄金十字と死十字に基づいて取引信号を生成する.ALMAとマルチサイクル価格平均を用いて,信号はより正確で信頼性が高くなります.調整可能なパラメータにより広く適用できます.また,論理はシンプルで明確で,トレンド市場ではうまく機能します.したがって,高い実用的な価値があります.


/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Oracle Move Strategy", overlay=true)

maLen = input(30, "ma period")
mode =  input(defval="wma", options=["alma", "ema", "wma"])
price = close

ma(src, len) =>
     mode=="alma"  ? alma(src, len, 0.85, 6) :
     mode=="ema"? ema(src, len) : 
     wma(src, len)
    

ma1 = ma(price, floor(maLen / 2))
ma2 = ma(price, maLen)
ma3 = 2.0 * ma1 - ma2
ma4 = ma(ma3, floor(sqrt(maLen)))

//plot(ma1, color = red)
//plot(ma2, color = green)
plot(ma3, color = blue)
plot(ma4, color = orange)


mafast = ma3
maslow = ma4

if (crossover(mafast, maslow))
    strategy.entry("MA2CrossLE", strategy.long, comment="MA2CrossLE")

if (crossunder(mafast, maslow))
    strategy.entry("MA2CrossSE", strategy.short, comment="MA2CrossSE")

//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

もっと