二重モメンタムブレークアウト戦略

作者: リン・ハーンチャオチャン開催日:2023年11月16日17時54分
タグ:

img

概要

これは二重モメントブレイクアウト戦略である.異なるパラメータ設定を持つ2つのモメントインジケーターを使用し,両方のモメントインジケーターがゼロラインを突破したとき,取引信号を生成する.この戦略は,ロングエントリーのみとショートだけが出口ポジションに使用される.

戦略の論理

命令の種類,手数料のスケジュールなどの戦略のプロパティを設定し,その後2つのインパクト指標を計算します.

// Momentum settings
****
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 code 

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

mom0 は,長さ i_len のベースモメントインジケーターで,データソース i_src は,パーセントを計算するかどうかを i_percent によって決定します.

mom1 は mom0 をデータ源と長さ 1 とするモメントインジケーターです

mom2 は原始データ i_src を源と長さ 1 とする動量指標です.

momXは mom1に設定されています. mom2も選択できます.

0 線を超えると,ロングになります. 0 線を超えると,クローズします.

戦略 の 利点

  1. 異なる設定の二重モメントインジケーターを使用すると,二重確認と偽信号の減少により信号の信頼性が向上します.

  2. ロングエントリーとショートエントリーのみは 取引頻度を低減し 取引コストを削減します

  3. 柔軟なモメントパラメータ調整は,異なる市場環境に適しています.

  4. シンプルなコード構造で 分かりやすく 変更も容易です

  5. 自動取引システムとうまく統合できます

戦略 の リスク

  1. ダブルモメンタムは 弱いトレンド信号を 見逃し 偽信号を 減少させる可能性があります

  2. 短期間の取引の機会を 逃し 長いエントリーだけ

  3. 不適切なモメントパラメータ設定は,過剰取引または遅延信号につながる.

  4. バックテストのデータが不足すると パラメータがオーバーフィットします

  5. ダブル確認は 偽信号を減らすが 排除しないので リアルタイム取引の有効性を 監視する必要があります

オプティマイゼーションの方向性

  1. 最適値を見つけるために長さとパーセントパラメータの組み合わせをテストする.

  2. トレンド確認後にショート・トレード・シグナルを追加してより多くのトレードを捕捉することを検討します.

  3. より良い結果を得るため,ROC,RSIなどの異なるモメント計算をテストします.

  4. トレンドフィルタリングを追加して 市場を回避します

  5. ストップ・ロスを最適化して 最大利益を得るために リスクの限界内です

結論

これは典型的な二重モメンタムブレイクアウト戦略である. 偽信号を減らすために二重確認を使用し,取引頻度を下げるために長いエントリのみを使用する. 利点は単純性と実装の容易さであり,パラメータ最適化とリスク管理の改善に多くの余地がある. 全体的に,合理的なモメンタムブレイクアウトフレームワークとして機能するが,収益性の高いライブ取引のために市場特有のチューニングと最適化が必要である.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Momentum Long 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)

// There will be no short entries, only exits from long.
strategy.risk.allow_entry_in(strategy.direction.long)

// 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

// Momentum settings

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"])

// Messages for buy and sell
message_buy  = input("{{strategy.order.alert_message}}", title="Buy message")
message_sell = input("{{strategy.order.alert_message}}", title="Sell message")

// Momentum code

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
    
// Strategy Alerts    

if (mom0 > 0 and momX > 0 and time_cond)
    strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE", alert_message = message_buy)
else
	strategy.cancel("MomLE")
if (mom0 < 0 and momX < 0 and time_cond)
	strategy.entry("MomExit", strategy.short, stop = low - syminfo.mintick, comment = "MomSE", alert_message = message_sell)
else
	strategy.cancel("MomExit")
	
// Plotting

plot(0, color = #5d606b, title = "ZERO")
plot(mom0, color = #00bcd4, title = "MOM")
plot(mom1, color = #00FF00, title = "MOM1", display = display.none)
plot(mom2, color = #00FF00, title = "MOM2")

もっと