二重MA重ね合わせに基づく適応型バックテスト時間範囲選択戦略


作成日: 2024-01-05 12:12:10 最終変更日: 2024-01-05 12:12:10
コピー: 0 クリック数: 589
1
フォロー
1621
フォロワー

二重MA重ね合わせに基づく適応型バックテスト時間範囲選択戦略

概要

この戦略の核心となる考えは,回測時間帯を柔軟に選択できるフレームワークを実現し,ユーザーが異なるニーズに応じて,自動または手動で回測の開始時間を設定できるようにすることです.

戦略は,入力パラメータによって4つの日付範囲選択方法を提供します.全履歴データ,最近指定された日数,最近指定された週数,または手動指定された日付範囲を使用します.戦略は,選択された日付範囲に応じて反測ウィンドウを動的に設定し,取引ロジックは変わらないまま,異なる時間ウィンドウの下での戦略のパフォーマンスの違いを比較することができます.

戦略原則

この戦略は,回帰日程範囲選択モジュールと双MA取引戦略モジュールで構成されています.

デート 範囲 選択 モジュール

  1. 4 つの日付範囲の選択が提供されています. すべての過去データ (ALL), 最近指定された日 (DAYS), 最近指定された週数 (WEEKS), 手動指定された日付範囲 (MANUAL) 。
  2. 選択した範囲に応じて,タイム変換ダイナミック設定で起止時間を回測する.
  3. 時間条件window() 関数は,K線をフィルタリングして,選択した日付範囲内でのみ反測を行う.

双MA取引戦略モジュール

  1. 急速MAの間はfastMA,デフォルト14;ゆっくりMAの間はslowMA,デフォルト28。
  2. 速いMAで遅いMAを通るときは,多めに;速いMAの下で遅いMAを通るときは,平仓する。
  3. MAの曲線を描いてください

戦略的優位分析

  1. 異なる実験のニーズを満たすために,制限なく,異なる回帰時間範囲を柔軟に選択できます.
  2. 異なる周期パラメータの効果を同じ時間帯でテストすることができ,結果は比較可能である.
  3. 取引の論理を単純に変更し,他の戦略の枠組みとして使用できます.
  4. マンチェスター・マッチングの戦略は簡単で理解しやすく,入門しやすい.

リスクと解決策の分析

  1. 双MA戦略は粗で,頻繁に取引される問題がある. 止損メカニズムなどの最適化を考慮することができる.
  2. 手動で日付の範囲を設定する際には,誤った日付を使用しないように注意が必要です. 提示情報を表示できます.
  3. 全履歴回測時間が長すぎるとテストサイクルが増加する. スライドポイントを追加したり手数料を削減したりすることが考えられます.

戦略最適化の方向性

  1. ストップ・ロジックの判断を高め,損失のリスクを低減する.
  2. 株式プールフィルターに追加し,指数に関連性のある株式を好むことで安定性を高める.
  3. 取引信号のフィルターを追加し,周期内不安定な信号をフィルターし,不要な取引を減らす.
  4. 異なる分類指数の関連株のパフォーマンスをテストし,最適な品種を見つけます.

要約する

この戦略は,一般的な反測日付範囲の枠組みとして,柔軟でカスタマイズでき,ユーザーの異なるテストニーズを満たすことができる.簡単な効果的な二重MA取引ロジックと連携して,戦略を迅速に検証および比較することができます.フィルター,止損ロジックなどの追加によって,戦略を最適化して,戦略を現場で適用する一歩近づけることができます.全体的に,この戦略の枠組みは,優れた拡張性と参照価値を持っています.

ストラテジーソースコード
/*backtest
start: 2022-12-29 00:00:00
end: 2024-01-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title = "How To Auto Set Date Range", shorttitle = " ", overlay = true)

// Revision:        1
// Author:          @allanster 

// === INPUT MA ===
fastMA = input(defval = 14, title = "FastMA", type = input.integer, minval = 1, step = 1)
slowMA = input(defval = 28, title = "SlowMA", type = input.integer, minval = 1, step = 1)

// === INPUT BACKTEST RANGE ===
useRange     = input(defval = "WEEKS", title = "Date Range", type = input.string, confirm = false, options = ["ALL", "DAYS", "WEEKS", "MANUAL"])
nDaysOrWeeks = input(defval = 52, title = "# Days or Weeks", type = input.integer, minval = 1)
FromMonth    = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay      = input(defval = 15, title = "From Day", minval = 1, maxval = 31)
FromYear     = input(defval = 2019, title = "From Year", minval = 2014)
ToMonth      = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay        = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear       = input(defval = 9999, title = "To Year", minval = 2014)

// === FUNCTION EXAMPLE ===
window() => true

// === LOGIC ===
buy  = crossover(sma(close, fastMA), sma(close, slowMA))         // buy when fastMA crosses over slowMA
sell = crossunder(sma(close, fastMA), sma(close, slowMA))        // sell when fastMA crosses under slowMA

// === EXECUTION ===
strategy.entry("L", strategy.long, when=window() and buy)        // buy long when "within window of time" AND crossover
strategy.close("L", when=window() and sell)                      // sell long when "within window of time" AND crossunder         

// === PLOTTING ===
plot(sma(close, fastMA), title = 'FastMA', color = color.aqua, linewidth = 2, style = plot.style_line)    // plot FastMA
plot(sma(close, slowMA), title = 'SlowMA', color = color.yellow, linewidth = 2, style = plot.style_line)  // plot SlowMA