見出し画像

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
のように変更します。

パラメータ指定の解説

画像7

・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
※最古~現在

画像1

画像9

指定期間を対象とする
・Start YMD (YYYYMMDD):20200401
・Stop YMD (YYYYMMDD) :20200430
※2020/4/1~2020/4/30

画像2

画像9

指定日以降~現在を対象とする
・Start YMD (YYYYMMDD):20200101
・Stop YMD (YYYYMMDD) :0
※2020/1/1~現在

画像3

画像9

最古の日~指定日を対象とする
・Start YMD (YYYYMMDD):0
・Stop YMD (YYYYMMDD) :20200331
※最古~2020/3/31

画像4

画像9

指定日~現在から30日前を対象とする
・Start YMD (YYYYMMDD):20200101
・Stop YMD (YYYYMMDD) :-30
※2020/1/1~現在から30日前

画像5

画像9

次回は、より高度なテスト期間が指定できる記事となります。

画像6


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

[EOF]

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