見出し画像

TradingViewストラテジーの疑似フォワードテスト方法その2

本noteは、前回記事の続きとなります。

できること

今回のソースコード変更により、バックテスト期間がチェックボックスの操作で簡易に変更できるようになります。
・60日前~現在期間の確認
・30日前~現在期間の確認
・60日前~30日前期間の確認

※具体的なイメージは、設定例を参照してください

変更手順

まず、前回完成したソースコードです。

//@version=4
strategy("ChannelBreakOut", overlay=true)

symd = input(0, "Start YMD (YYYYMMDD)")
btStart = symd<=0?timestamp(2000,1,1,0,0):timestamp("Asia/Tokyo",floor(symd/10000),floor(symd/100)%100,symd%100,0,0)
eymd = input(0, "Stop YMD (YYYYMMDD)")
btStop = eymd<=0?timenow-86400000*abs(eymd):timestamp("Asia/Tokyo",floor(eymd/10000),floor(eymd/100)%100,eymd%100,0,0)
btPeriod = time>=btStart and time<btStop ? true : false

length = input(title="Length", type=input.integer, minval=1, maxval=1000, defval=30)

upBound = highest(high, length)
downBound = lowest(low, length)

if (not na(close[length])) and btPeriod
  strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE")
  strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE")

下記をコメントアウトします。

//btPeriod = time>=btStart and time<=btStop ? true : false

下記を追加します。

bt60day = input(false, "60days backtest")
bt60dayStart = btStop - 5184000000
bt30day = input(false, "30days backtest")
bt30dayStart = btStop - 2592000000
bt30dayoffset = input(false, "30days offset backtest")
bt30dayStartoffset = btStop - 5184000000
bt30dayStopoffset = btStop - 2592000000

btPeriod() =>
   if bt30dayoffset
       time >= bt30dayStartoffset and time <= bt30dayStopoffset ? true : false
   else
       if bt30day
           time >= bt30dayStart and time <= btStop ? true : false
       else
           if bt60day
               time >= bt60dayStart and time <= btStop ? true : false
           else
               time >= btStart and time <= btStop ? true : false

売買条件の判定を変更します。

//if (not na(close[length]) and testPeriod)
if (not na(close[length])) and btPeriod()

修正後の全体のコードは、以下のようになります。

//@version=4
strategy("ChannelBreakOut", overlay=true)

symd = input(0, "Start YMD (YYYYMMDD)")
btStart = symd<=0?timestamp(2000,1,1,0,0):timestamp("Asia/Tokyo",floor(symd/10000),floor(symd/100)%100,symd%100,0,0)
eymd = input(0, "Stop YMD (YYYYMMDD)")
btStop = eymd<=0?timenow-86400000*abs(eymd):timestamp("Asia/Tokyo",floor(eymd/10000),floor(eymd/100)%100,eymd%100,23,59)
//btPeriod = time>=btStart and time<=btStop ? true : false

bt60day = input(false, "60days backtest")
bt60dayStart = btStop - 5184000000
bt30day = input(false, "30days backtest")
bt30dayStart = btStop - 2592000000
bt30dayoffset = input(false, "30days offset backtest")
bt30dayStartoffset = btStop - 5184000000
bt30dayStopoffset = btStop - 2592000000

btPeriod() =>
   if bt30dayoffset
       time >= bt30dayStartoffset and time <= bt30dayStopoffset ? true : false
   else
       if bt30day
           time >= bt30dayStart and time <= btStop ? true : false
       else
           if bt60day
               time >= bt60dayStart and time <= btStop ? true : false
           else
               time >= btStart and time <= btStop ? true : false

length = input(title="Length", type=input.integer, minval=1, maxval=1000, defval=30)
upBound = highest(high, length)
downBound = lowest(low, length)

//if (not na(close[length]) and testPeriod)
if (not na(close[length])) and btPeriod()
   strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE")
   strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE")

カスタマイズのポイント

N日前にしたい場合は、下記計算式を参考にコードを改変してください。

Nday = 86400 * 1000 * N
1日の秒数=86400秒
1日のミリ秒数=86400 x 1000ミリ秒
N日のミリ秒数=86400 x 1000 x Nミリ秒

パラメータ指定の解説

画像1

・Start YMD (YYYYMMDD)
バックテスト開始日付を指定する
0:参照できる最古の足を開始日付とする
YYYYMMDD:指定した年月日の0:00を開始日付とする
例)20200101 ※2020/1/1~
・Stop YMD (YYYYMMDD)
バックテスト終了日付を指定する
0:現在日時を終了日付とする
YYYYMMDD:指定した年月日の23:59を終了日付とする
例)20200430 ※~2020/4/30
マイナス:指定した日数前の現在時刻を終了日付とする
例)-30 ※~現在より30日前
・60days backtest
チェックを付けると、バックテスト終了日より60日前~バックテスト終了日までの期間でバックテストする
・30days backtest
チェックを付けると、バックテスト終了日より30日前~バックテスト終了日までの期間でバックテストする
・30days offset backtest
チェックを付けると、バックテスト終了日より60日前~バックテスト終了日より30日前までの期間でバックテストする

複数にチェックが付いている場合は、下にあるものが優先されます。
通常のテスト期間を指定したい場合は、すべてのチェックを外してください。

指定例

・最古~現在日時までの期間でバックテストする

画像2

画像9

・現在日時より60日前~現在日時までの期間でバックテストする

画像3

画像9

・現在日時より30日前~現在日時までの期間でバックテストする

画像4

画像9

・現在日時より60日前~現在日時より30日前までの期間でバックテストする

画像5

画像9

・指定日より60日前~指定日までの期間でバックテストする

画像6

画像9

・指定日より30日前~指定日までの期間でバックテストする

画像7

画像9

・指定日より60日前~指定日より30日前までの期間でバックテストする

画像8

画像9

活用例

簡易的なカーブフィッティング(ロバスト性)検査が可能です。
・60日前~30日前にてパラメータ調整する。
・30日前~現在でも有効であるのか検証する。
・60日前~現在での中期的な検証する。

また、このバックテスト指定を利用することにより「TVST-LabCheck」「TVST-LabBot」で同一期間の比較分析をするときに効率化が高めることもできます。

本noteの記事は以上となります。
参考になったという方は、よろしけば「いいね」を押していただけると幸いです。

[EOF]



この記事が気に入ったらサポートをしてみませんか?