調整可能なバックテスト日付範囲選択戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-05 12:12:10
タグ:

img

概要

この戦略の核心構想は,ユーザの異なるニーズを満たすためにバックテストの日付範囲を柔軟に選択できるフレームワークを実装することです. これにより,ユーザはバックテストの開始および終了時間を自動的にまたは手動で設定できます.

この戦略は,すべての履歴データ,最近の指定日,最近の指定週,または日付範囲を手動で指定する入力パラメータを通じて日付範囲選択のための4つのオプションを提供します.この戦略は,選択された日付範囲に基づいてバックテストウィンドウを動的に設定し,取引論理を変更せずに,異なる時間窓の下でのパフォーマンス差を比較することができます.

戦略原則

この戦略は2つのモジュールから構成される.バックテスト日付範囲の選択とダブルMA取引戦略.

バックテスト日付範囲選択モジュール

  1. すべての履歴データ (ALL),最近の指定日 (DAYS),最近の指定週 (WEEKS),手動で指定された日付範囲 (MANUAL) を選択する4つのオプションを提供します.
  2. 選択された範囲のタイムスタンプ変換に基づいて,バックテスト開始と終了時間を動的に設定します.
  3. 時条件のウィンドウ ((() 機能を用いてキャンドルをフィルターし,選択した日付範囲内でバックテストを行う.

双重MA取引戦略モジュール

  1. 急速なMA期間がfastMAで,デフォルト14です. 遅いMA期間がslowMAで,デフォルト28です.
  2. 高速MAが低速MAを横切るときの長距離;低速MAが低速MAを横切るときの近距離.
  3. MA曲線を素早くや緩やかに描画します

利点を分析する

  1. 柔軟に異なるバックテスト日付範囲を制限なく選択し,異なる実験ニーズを満たす.
  2. 異なる期間パラメータの効果を同じ時間枠内で試験することができ,結果が比較可能である.
  3. 他の戦略のための枠組みとして役立つように取引論理を修正しやすい.
  4. 簡単に理解できる ダブルMA戦略 初心者にとっては簡単です

リスク分析と解決策

  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


もっと