
【TradingView】バックテストにご注意
2020/2/19 都合により値上げしました。
TradingViewのバックテスト結果を見る場合、注意しないといけない点がいくつかあります。
//@version=3が指定されているか
(security関数に注意)
TradingViewのスクリプト(pine)にはバージョンがあります。
現在のバージョンは3ですが、2以前のものにはバックテスト中に未来の足が参照できてしまうという問題がありました。
未来の足が参照できてしまうということは、これから値が上がるのか下がるのかが事前にわかるということで、バックテスト結果をよく見せることができます。(無敗、PF=∞のようなストラテジも簡単に作成できます)
例えば、1時間足のチャートで以下のようにsecurity関数で1日(1440分)足の終値を参照すると、その当日の終値が参照できてしまいます。(つまり、現在の1時間足の1~23時間後の値がわかることになります)
_v = security(tickerid, "1440", close)
この問題は、バージョン3でもsecurity関数の引数を次のように指定することで2と同様の動作となるので注意が必要です。
_v = security(tickerid, "1440", close, lookahead=barmerge.lookahead_on)
興味深いバックテストを見つけた場合には、そのスクリプトの先頭にバージョン指定があるのかを確認しましょう。また、security関数が使われている場合にはその引数に注意しましょう。
//@version=3
同じ足で指値/逆指値を使っていないか
pineでは指値/逆指値を指定してオーダーを出すことができますが、同じ足でその両方が約定するとおかしな動作になってしまいます。
単純なIFD注文でこの問題は発生するので注意が必要です。
次のコードをbitFlyer FXの日足チャートに適用してみます。
(12月11日に380,600円で逆指値買い、381,000円で指値売りのIFDオーダーです。オーダーはそれを出した次の足(12/12)で発効します)
//@version=3
strategy("bug-ifd", overlay=true)
if time == timestamp(2018, 12, 11, 0, 0)
strategy.entry("L", strategy.long, stop=380600)
strategy.exit("Le", "L", limit=381000)
では、このスクリプトの約定履歴を「投資戦略テスター」で見てみましょう。
なんと、381,000円に指値を入れているにも関わらず、その日の高値(398,358円)で約定したことになっています。
指値/逆指値を使っているストラテジーでは、同じ足でその両方が約定していないか確認する必要があります。
もし、同じ足で約定している場合、実際より良い結果になっている可能性があるので注意が必要です。
この問題を利用すると、こんなバックテスト結果も簡単に出すことができます。
このコードは悪用防止のため、以下の有料部分に置いておきますので技術的興味のある方だけお進みください。(有料部分は再現コードだけになります)
無料部分は以上です。
お読みいただきありがとうございました。
ここから先は
¥ 10,000
この記事が気に入ったらチップで応援してみませんか?