平均逆転モメンタム戦略は,短期間の価格平均を追跡するトレンドトレーディング戦略である.中期市場のトレンドを判断するために平均逆転指標とモメンタム指標を組み合わせます.
この戦略は,まず,平均逆転線と価格の標準偏差を計算する.その後,上限値と下限値パラメータによって設定された
ロング・シグナルでは,価格は平均逆転線を下に1つの標準偏差で,閉じる価格はLENGTH期間のSMAを下に,そしてTREND SMA上にある必要があります.これらの3つの条件を満たす場合は,ロングポジションが開かれます.閉じる条件は,価格がLENGTH期間のSMAを上回るときです.
ショートシグナルでは,価格は平均逆転線より1標準偏差,閉じる価格はLENGTH期間のSMA以上,トレンドSMA以下で,これらの3つの条件が満たされた場合,ショートポジションが開かれます.閉じる条件は,価格がLENGTH期間のSMA以下に突破したときです.
この戦略は,利益とストップ損失の管理のために 利益目標とストップ損失の割合を組み合わせています.
退出方法は移動平均のクロスオーバーか線形回帰のクロスオーバーを選択できます.
双方向取引,トレンドフィルタリング,利益採取,ストップ損失などの組み合わせにより,中期市場動向の判断と追跡を実現します.
平均逆転指標は,値中心から価格の偏差を効果的に判断することができます.
動力指標SMAは 短期的な市場騒音をフィルターすることができます
双方向取引はあらゆる方向のトレンド機会を完全に把握できます
利得とストップ・ロスのメカニズムは リスクを効果的にコントロールできます
選択可能な退出方法は,市場の条件に適応するために柔軟であることができます.
中期トレンドを把握する 完全なトレンドトレード戦略です
平均逆転指示はパラメータ設定に敏感で,誤った限界設定は誤った信号を引き起こす可能性があります.
不安定な市場環境では,ストップロスは頻繁に実行される可能性があります.
横向的なトレンドでは,取引頻度は高すぎることになり,取引コストとスリップリスクが増加する可能性があります.
取引手段に十分な流動性がない場合,スリップ管理は最適ではない可能性があります.
双方向取引はリスクが高く 慎重なマネーマネジメントが必要です
これらのリスクは,パラメータ最適化,ストップ損失調整,マネーマネジメントなどによって制御できます.
平均リバーションとモメント指標のパラメータ設定を最適化し,異なる取引手段に最適化します.
トレンド認識能力を向上させるために,トレンド識別指標を追加します.
ストップ・ロスの戦略を最適化し,市場の大幅な変動により良く適応させる.
ポジションサイズを市場状況に基づいて調整するためのポジションサイズ化モジュールを追加します.
リスク管理のモジュールを追加します. 最大引き上げ制御,株式曲線制御などです.
戦略パラメータを自動的に最適化するために 機械学習方法を組み合わせることを検討します
概要すると,平均逆転勢力の戦略は,シンプルで効果的な指標設計を通じて中期平均逆転傾向を捉える.この戦略は強い適応性と汎用性を持っていますが,いくつかのリスクもあります.継続的な最適化と他の戦略と組み合わせることで,より良いパフォーマンスを達成することができます.全体的に見ると,戦略はかなり完全であり,検討に値するトレンド取引方法です.
/*backtest start: 2023-10-15 00:00:00 end: 2023-11-14 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © GlobalMarketSignals //@version=4 strategy("GMS: Mean Reversion Strategy", overlay=true) LongShort = input(title="Long Only or Short Only or Both?", type=input.string, defval="Both", options=["Both", "Long Only", "Short Only"]) Lookback = input(title="Length", type=input.integer, defval=10, minval=0) LThr1 = input(title="Upper threshold", type=input.float, defval=1, minval=0) LThr = input(title="Lower threshold", type=input.float, defval=-1, maxval=0) src = input(title="Source", type=input.source, defval=close) LongShort2 = input(title="Linear Regression Exit or Moving Average Exit?", type=input.string, defval="MA", options=["LR", "MA"]) SMAlenL = input(title="MA/LR Exit Length", type = input.integer ,defval=10) SMALen2 = input(title="Trend SMA Length", type = input.integer ,defval=200) AboveBelow = input(title="Above or Below Trend SMA?", type=input.string, defval="Above", options=["Above", "Below", "Don't Include"]) PTbutton = input(title="Profit Target On/Off", type=input.bool, defval=true) ProfitTarget = input(title="Profit Target %", type=input.float, defval=1, step=0.1, minval=0) SLbutton = input(title="Stop Loss On/Off", type=input.bool, defval=true) StopLoss = input(title="Stop Loss %", type=input.float, defval=-1, step=0.1, maxval=0) x = (src-linreg(src,Lookback,0))/(stdev(src,Lookback)) plot(linreg(src,Lookback,0)) //PROFIT TARGET & STOPLOSS if PTbutton == true and SLbutton == true strategy.exit("EXIT", profit=((close*(ProfitTarget*0.01))/syminfo.mintick), loss=((close*(StopLoss*-0.01))/syminfo.mintick)) else if PTbutton == true and SLbutton == false strategy.exit("PT EXIT", profit=((close*(ProfitTarget*0.01))/syminfo.mintick)) else if PTbutton == false and SLbutton == true strategy.exit("SL EXIT", loss=((close*(StopLoss*-0.01))/syminfo.mintick)) else strategy.cancel("PT EXIT") //////////////////////// //MOVING AVERAGE EXIT// ////////////////////// if LongShort=="Long Only" and AboveBelow=="Above" and LongShort2 =="MA" strategy.entry("LONG", true, when = x<LThr and close<sma(close,SMAlenL) and close>sma(close,SMALen2)) strategy.close("LONG", when = close>sma(close,SMAlenL)) if LongShort=="Long Only" and AboveBelow=="Below" and LongShort2 =="MA" strategy.entry("LONG", true, when = x<LThr and close<sma(close,SMAlenL) and close<sma(close,SMALen2)) strategy.close("LONG", when = close>sma(close,SMAlenL)) if LongShort=="Long Only" and AboveBelow=="Don't Include" and LongShort2 =="MA" strategy.entry("LONG", true, when = x<LThr and close<sma(close,SMAlenL) ) strategy.close("LONG", when = close>sma(close,SMAlenL)) /////// if LongShort=="Short Only" and AboveBelow=="Above" and LongShort2 =="MA" strategy.entry("SHORT", false, when = x>LThr1 and close>sma(close,SMAlenL) and close>sma(close,SMALen2)) strategy.close("SHORT", when = close<sma(close,SMAlenL)) if LongShort=="Short Only" and AboveBelow=="Below" and LongShort2 =="MA" strategy.entry("SHORT", false, when = x>LThr1 and close>sma(close,SMAlenL) and close<sma(close,SMALen2)) strategy.close("SHORT", when = close<sma(close,SMAlenL)) if LongShort=="Short Only" and AboveBelow=="Don't Include" and LongShort2 =="MA" strategy.entry("SHORT", false, when = x>LThr1 and close>sma(close,SMAlenL) ) strategy.close("SHORT", when = close<sma(close,SMAlenL)) ////// if LongShort=="Both" and AboveBelow=="Above" and LongShort2 =="MA" strategy.entry("LONG", true, when = x<LThr and close<sma(close,SMAlenL) and close>sma(close,SMALen2)) strategy.close("LONG", when = close>sma(close,SMAlenL)) if LongShort=="Both" and AboveBelow=="Below" and LongShort2 =="MA" strategy.entry("LONG", true, when = x<LThr and close<sma(close,SMAlenL) and close<sma(close,SMALen2)) strategy.close("LONG", when = close>sma(close,SMAlenL)) if LongShort=="Both" and AboveBelow=="Don't Include" and LongShort2 =="MA" strategy.entry("LONG", true, when = x<LThr and close<sma(close,SMAlenL) ) strategy.close("LONG", when = close>sma(close,SMAlenL)) /////// if LongShort=="Both" and AboveBelow=="Above" and LongShort2 =="MA" strategy.entry("SHORT", false, when = x>LThr1 and close>sma(close,SMAlenL) and close>sma(close,SMALen2)) strategy.close("SHORT", when = close<sma(close,SMAlenL)) if LongShort=="Both" and AboveBelow=="Below" and LongShort2 =="MA" strategy.entry("SHORT", false, when = x>LThr1 and close>sma(close,SMAlenL) and close<sma(close,SMALen2)) strategy.close("SHORT", when = close<sma(close,SMAlenL)) if LongShort=="Both" and AboveBelow=="Don't Include" and LongShort2 =="MA" strategy.entry("SHORT", false, when = x>LThr1 and close>sma(close,SMAlenL) ) strategy.close("SHORT", when = close<sma(close,SMAlenL)) ///////////////// //LIN REG EXIT// /////////////// if LongShort=="Long Only" and AboveBelow=="Above" and LongShort2 =="LR" strategy.entry("LONG", true, when = x<LThr and close<linreg(close,SMAlenL,0) and close>sma(close,SMALen2)) strategy.close("LONG", when = close>linreg(close,SMAlenL,0)) if LongShort=="Long Only" and AboveBelow=="Below" and LongShort2 =="LR" strategy.entry("LONG", true, when = x<LThr and close<linreg(close,SMAlenL,0) and close<sma(close,SMALen2)) strategy.close("LONG", when = close>linreg(close,SMAlenL,0)) if LongShort=="Long Only" and AboveBelow=="Don't Include" and LongShort2 =="LR" strategy.entry("LONG", true, when = x<LThr and close<linreg(close,SMAlenL,0) ) strategy.close("LONG", when = close>linreg(close,SMAlenL,0)) /////// if LongShort=="Short Only" and AboveBelow=="Above" and LongShort2 =="LR" strategy.entry("SHORT", false, when = x>LThr1 and close>linreg(close,SMAlenL,0) and close>sma(close,SMALen2)) strategy.close("SHORT", when = close<linreg(close,SMAlenL,0)) if LongShort=="Short Only" and AboveBelow=="Below" and LongShort2 =="LR" strategy.entry("SHORT", false, when = x>LThr1 and close>linreg(close,SMAlenL,0) and close<sma(close,SMALen2)) strategy.close("SHORT", when = close<linreg(close,SMAlenL,0)) if LongShort=="Short Only" and AboveBelow=="Don't Include" and LongShort2 =="LR" strategy.entry("SHORT", false, when = x>LThr1 and close>linreg(close,SMAlenL,0) ) strategy.close("SHORT", when = close<linreg(close,SMAlenL,0)) ////// if LongShort=="Both" and AboveBelow=="Above" and LongShort2 =="LR" strategy.entry("LONG", true, when = x<LThr and close<linreg(close,SMAlenL,0) and close>sma(close,SMALen2)) strategy.close("LONG", when = close>linreg(close,SMAlenL,0)) if LongShort=="Both" and AboveBelow=="Below" and LongShort2 =="LR" strategy.entry("LONG", true, when = x<LThr and close<linreg(close,SMAlenL,0) and close<sma(close,SMALen2)) strategy.close("LONG", when = close>linreg(close,SMAlenL,0)) if LongShort=="Both" and AboveBelow=="Don't Include" and LongShort2 =="LR" strategy.entry("LONG", true, when = x<LThr and close<linreg(close,SMAlenL,0) ) strategy.close("LONG", when = close>linreg(close,SMAlenL,0)) /////// if LongShort=="Both" and AboveBelow=="Above" and LongShort2 =="LR" strategy.entry("SHORT", false, when = x>LThr1 and close>linreg(close,SMAlenL,0) and close>sma(close,SMALen2)) strategy.close("SHORT", when = close<linreg(close,SMAlenL,0)) if LongShort=="Both" and AboveBelow=="Below" and LongShort2 =="LR" strategy.entry("SHORT", false, when = x>LThr1 and close>linreg(close,SMAlenL,0) and close<sma(close,SMALen2)) strategy.close("SHORT", when = close<linreg(close,SMAlenL,0)) if LongShort=="Both" and AboveBelow=="Don't Include" and LongShort2 =="LR" strategy.entry("SHORT", false, when = x>LThr1 and close>linreg(close,SMAlenL,0) ) strategy.close("SHORT", when = close<linreg(close,SMAlenL,0))