TradingViewストラテジーの疑似フォワードテスト方法その1
自作した売買戦略(ストラテジー)やパラメータ変更によって、良い成績のものができたとしても実際に稼働させてもその後過去のように良い成績が続かないことがよくあります。
これを回避するには、実トレードにてフォワードテストを実施することが大切なのですが、バックテスト期間を分けて確認することで同じような(疑似フォワードテスト)結果を取得することが可能です。
本noteでは、よくあるチャネルブレイクアウトストラテジーのソースコードで解説します。
できること
既存のソースコードに数行追加するだけで、以下の対象期間が変更できるようになります。
・全期間の確認
・指定した期間の確認
・n日前までの確認
変更手順
まず、元のソースコードです。
//@version=4
strategy("ChannelBreakOut", overlay=true)
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]))
strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE")
strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE")
この状態では、利用できる全期間の足が対象となっています。
※現時点(2020/4/19)だと、2時間足では2018/1/4が初回エントリーです。
以下のコードを追加します。
symd = input(0, "Start YMD (YYYYMMDD)")
btStart = symd<=0?timestamp(2017,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
そして、既存の売買条件に以下の条件を追加します。
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,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")
if (not na(close[length]))
の部分を
if (not na(close[length])) and btPeriod
のように変更します。
パラメータ指定の解説
・Start YMD (YYYYMMDD)
バックテスト開始日付を指定する
0:参照できる最古の足を開始日付とする
YYYYMMDD:指定した年月日の0:00を開始日付とする
例)20200101 ※2020/1/1~
・Stop YMD (YYYYMMDD)
バックテスト終了日付を指定する
0:現在日時を終了日付とする
YYYYMMDD:指定した年月日の23:59を終了日付とする
例)20200430 ※~2020/4/30
マイナス:指定した日数前の現在時刻を終了日付とする
例)-30 ※~現在より30日前
指定例
全期間を対象とする
・Start YMD (YYYYMMDD):0
・Stop YMD (YYYYMMDD) :0
※最古~現在
指定期間を対象とする
・Start YMD (YYYYMMDD):20200401
・Stop YMD (YYYYMMDD) :20200430
※2020/4/1~2020/4/30
指定日以降~現在を対象とする
・Start YMD (YYYYMMDD):20200101
・Stop YMD (YYYYMMDD) :0
※2020/1/1~現在
最古の日~指定日を対象とする
・Start YMD (YYYYMMDD):0
・Stop YMD (YYYYMMDD) :20200331
※最古~2020/3/31
指定日~現在から30日前を対象とする
・Start YMD (YYYYMMDD):20200101
・Stop YMD (YYYYMMDD) :-30
※2020/1/1~現在から30日前
次回は、より高度なテスト期間が指定できる記事となります。
本noteの記事は以上となります。
参考になったという方は、よろしけば「いいね」を押していただけると幸いです。
[EOF]