動量戦略は,価格変化の傾向に基づいて取引する戦略である.この戦略は,一定の周期内の価格変化を計算して,価格運動の傾向を判断し,取引シグナルを生成する.価格が上昇傾向にあるとき,購入シグナルを生成する.価格が下降傾向にあるとき,販売シグナルを生成する.この戦略は,二重動量指標の交差を生成する.
この戦略は,特定の周期内の閉盘価格の変化を計算することによって,価格の動力を判断する.具体的には,閉盘価格のN周期前の閉盘価格の変化を計算する.
まず,最初の動量指数MOM0を計算し,公式は次のとおりである.
MOM0 = CLOSE - CLOSE[N]
CLOSEは,現在の周期終了価格を表します.[N]は,N周期前の閉盘価格を表す.MOM0>0は,N周期前の閉盘価格の上昇を,N周期前の閉盘価格の低下を表す.MOM0は,N周期前の閉盘価格の減少を,N周期前の閉盘価格の減少を表す.
次に,第2動量指標MOM1を計算すると,式は次のようになります.
MOM1 = MOM0 - MOM0[1]
つまり,MOM0の現在の周期の値と前の周期の値を減算する.MOM1>0はMOM0の上昇を示し,MOM1はMOM0の減少を示している.
3番目の動力指標MOM2を計算すると,式は:
MOM2 = CLOSE - CLOSE[1]
つまり,現在の周期の閉盘価格を計算し,前の周期の閉盘価格を減算する. MOM2>0は閉盘価格の上昇を示し,MOM2は閉盘価格の低下を示している.
MOM0>0とMOM1>0であるとき,動力が継続的に上昇することを表示し,買入シグナルを生成する.MOM0とMOM2であるとき,動力が継続的に低下することを表示し,売出シグナルを生成する.
また,コードに時間条件time_condが追加され,設定された反測時間内にのみ取引シグナルが生成されます.また,注文を掛ける前に条件がまだ成立しているかどうかを再確認し,信号が消えた後に注文を続ける状況を回避します.
動量周期を短くしたり,トレンド判断を導入したり,ストップを配置したりしてリスクを減らすことができます.また,取引量指数にフィードバックを加えることも考えられます.
動量戦略は,価格の変化の傾向を追跡して,価格そのものではなく,市場のホットポイントの方向を効果的に判断し,価格の上昇と下落の機会を掴むことができます.しかし,動量には遅延性があり,パラメータ選択と組み合わせの最適化は戦略効果に不可欠です.この戦略は,二重動量指標の交差に基づいて,部分的なノイズをフィルターすることができます.パラメータを継続的に最適化し,新しい技術指標を追加し,機械学習などの方法を活用することで,戦略効果をさらに強化し,リスクを制御できます.
/*backtest
start: 2022-09-25 00:00:00
end: 2023-02-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Momentum Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true)
// Calculate start/end date and time condition
startDate = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time)
time_cond = true
i_len = input(defval = 12, title = "Length", minval = 1)
i_src = input(defval = close, title = "Source")
i_percent = input(defval = true, title = "Percent?")
i_mom = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"])
momentum(seria, length, percent) =>
_mom = percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length]
_mom
mom0 = momentum(i_src, i_len, i_percent)
mom1 = momentum(mom0, 1, i_percent)
mom2 = momentum(i_src, 1, i_percent)
momX = mom1
if i_mom == "MOM2"
momX := mom2
if (mom0 > 0 and momX > 0 and time_cond)
strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE")
else
strategy.cancel("MomLE")
if (mom0 < 0 and momX < 0 and time_cond)
strategy.entry("MomSE", strategy.short, stop = low - syminfo.mintick, comment = "MomSE")
else
strategy.cancel("MomSE")
plot(mom0, color = #00bcd4, title = "MOM")
plot(mom1, color = #00FF00, title = "MOM1", display = display.none)
plot(mom2, color = #00FF00, title = "MOM2")