移動平均クロスオーバー取引戦略は,比較的一般的な定量的な取引戦略である.この戦略は,異なる期間の移動平均を計算し,そのクロスオーバー状況に応じて取引信号を生成する.具体的には,4期,8期,20期の指数的な移動平均 (EMA) を計算する.短期EMAが長期EMAを超えると,ロング;短期EMAが長期EMAを下回ると,ショート.
この戦略の基本的な論理は
この方法によって,市場シグナルを判断するために異なる期間の移動平均値のクロスオーバーを利用し,最も長い期間の移動平均値の方向性を利用して偽のシグナルをフィルタリングし,安定した取引戦略を構築します.
この戦略の主な利点は以下の通りです.
この戦略にはいくつかのリスクもあります:
主な解決策は以下の通りです
戦略は以下の側面で最適化できます.
期間の最適化:異なる品種に応じて,最適なMA期間の組み合わせを決定する.
ストップ損失の最適化: 単一の損失を制御するために合理的にストップ損失のポイントを設定する.
パラメータ最適化: 遺伝アルゴリズム,マルコフ鎖などを使用してパラメータを動的に最適化します.
モデル融合: LSTM,RNN,その他のディープラーニングモデルと統合して,より多くのアルファを抽出します.
ポートフォリオ最適化:他の技術指標戦略と組み合わせて戦略ポートフォリオを構築する.
一般的には,移動平均クロスオーバー戦略は比較的古典的で一般的に使用される定量的な取引戦略である.この戦略はシンプルな論理を持ち,理解し,実装しやすく,一定の安定性があります.しかし,間違った信号を生成し,市場の変化に適応できないなど,いくつかの問題もあります.これらの問題はパラメータ最適化,ストップ損失最適化,モデル融合などの方法によって改善することができます.全体として,移動平均戦略は,より複雑な戦略と組み合わせて,強力な複雑な戦略を構築するための基本的なモジュールとして戦略ツールボックスで使用することができます.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //future strategy //strategy(title = "stub", default_qty_type = strategy.fixed, default_qty_value = 1, overlay = true, commission_type=strategy.commission.cash_per_contract,commission_value=2.05) //stock strategy strategy(title = "stub", overlay = true) //forex strategy //strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true) //crypto strategy //strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true, commission_type=strategy.commission.percent,commission_value=.0,default_qty_value=10000) testStartYear = input(1900, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testEndYear = input(2018, "Backtest Start Year") testEndMonth = input(12, "Backtest Start Month") testEndDay = input(1, "Backtest Start Day") testPeriodEnd = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testPeriod() => true ema1 = ema(close,4) ema2 = ema(close,8) ema3 = ema(close,20) go_long = ema1[0] > ema2[0] and ema3[0] > ema3[1] exit_long = ema1[0] < ema2[0] or ema3[0] < ema3[1] go_short = ema1[0] < ema2[0] and ema3[0] < ema3[1] exit_short = ema1[0] > ema2[0] or ema3[0] > ema3[1] if testPeriod() strategy.entry("simpleBuy", strategy.long, when=go_long) strategy.exit("simpleBuy", "simpleSell",when=exit_long) strategy.entry("simpleSell", strategy.short,when=go_short) strategy.exit("simpleSell", "simpleSell",when=exit_short)