トレードを行う方であれば「バックテスト」という言葉を聞いたことのある人は多いと思います。
今日はTradingViewでバックテストを行う際に必須と言えるバックテスト期間を指定するコードを共有します。
え?なんですか?
バックテストが何なのかそもそもわからない?
はーあ!仕方ないですね。
それではそもそもバックテストが何なのかから簡単に説明していきます。
バックテストって何?
定量的に定めることのできる投資戦略には言葉にできる取引ルールがあります。
何円になったら買おう/売ろうといった情報から、移動平均線がゴールデンクロスになったら買おうといったものです。
こういった取引ルールを過去の値動きに当てはめてみて、過去の値動きではどのような結果になったのかをシミュレーションすることをバックテストと言います。
チャートを少しずつスクロールしていき、ここでは得した、ここでは損したと記録していくことは非常に手間であり非効率的です。
そこで多くのトレーダーはバックテストが行える仕組みを自分で構築したり、サービスとして提供されているものを活用したりしています。
たとえばこれは『TradingViewのストラテジーを何も考えずに自動化するやり方』で紹介したストラテジーのバックテスト結果です。
バックテストを行うことで、その取引ルールが本当に機能するものなのかどうかをある程度見極めることができます。
見極めるための第一歩がバックテストです。
事前にどれぐらいの損益が見込めるかを予測した上でトレードを行えたほうがいいですよね。
不確実性を抑えることができるので、可能であればバックテストは行うべきです。(HFT系など一部の手法は例外)
またバックテストはシステムトレードユーザーだけのものではありません。
裁量トレーダーにも大いに関係のある話です。
裁量ユーザーであれば、いわゆるデモトレードがバックテストに該当すると思います。
過去チャートの再生機能を使ってトレードを行ったり、板情報を録画しておいて、それを見ながらトレードを行って、そのやり方が実践で使えるものなのかどうか検証することは皆さんやっていると思います。
そんなバックテストですが、結果を妄信することはできません。
バックテストを信じていいの?
バックテストはあくまでも過去の値動きに取引ルールを当てはめてみた結果であり、未来の結果を保証するものではありません。
たとえばスポーツのことを考えてみます。
強い国や選手はいても、永遠に勝ち続けることはできません。その時のコンディション、相手チームの成長などで勝負の行方はいかようにでも転がります。
ラグビーでニュージーランドはめちゃくちゃ強いと誰もが断言できると思います。
ですが、必ずワールドカップで優勝できるかというとそれは別の話になります。
バックテストもこれと同じです。
バックテストを行うことで、これは強いストラテジーである可能性が高いと言うことはできますが、必ず今後も機能し続けるとは言えません。
あくまでもバックテストは目安として考えてください。
またトレードのバックテストで最も重要な要素が「バックテスト期間」です。値動きは時系列情報であり、期間によって中身が変わるためです。
期間を変えて検証することはバックテストを行う上で必須です。
ということでようやく本題に入ります。
TradinViewでバックテスト期間を指定する
TradingViewでバックテスト期間を指定してみます。
面倒な手間はなしです。
以下のコードを使います。これがバックテスト期間を指定するためのpine scriptです。
testStartYear = input(2018, "バックテスト開始年") testStartMonth = input(1, "バックテスト開始月") testStartDay = input(1, "バックテスト開始日") testStartHour = input(0, "バックテスト開始時間") testPeriodStart = timestamp("Asia/Tokyo",testStartYear,testStartMonth,testStartDay,testStartHour,0) testStopYear = input(2020, "バックテスト終了年") testStopMonth = input(12, "バックテスト終了月") testStopDay = input(31, "バックテスト終了日") testStopHour = input(23, "バックテスト終了時間") testPeriodStop = timestamp("Asia/Tokyo",testStopYear,testStopMonth,testStopDay,testStopHour,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false
これだけあっても困ると思うので、「以前の記事」のストラテジーに使える形で貼り付けてみます。
これをそのままコピペして使ってください。
//@version=4 strategy("ChannelBreakOutStrategy", overlay=true) testStartYear = input(2018, "バックテスト開始年") testStartMonth = input(1, "バックテスト開始月") testStartDay = input(1, "バックテスト開始日") testPeriodStart = timestamp("Asia/Tokyo",testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2020, "バックテスト終了年") testStopMonth = input(12, "バックテスト終了月") testStopDay = input(31, "バックテスト終了日") testPeriodStop = timestamp("Asia/Tokyo",testStopYear,testStopMonth,testStopDay,0,0) testPeriod = time >= testPeriodStart and time <= testPeriodStop ? 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) 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]) and testPeriod) strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE") strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE")
つまり売買条件にバックテスト期間を追加しています。
ここで「チャートへ追加」を行いバックテスト結果を確認するとこんな結果が出てきます。
このスクショは2018年1月1日~2019年11月22日までのバックテスト結果です。
元の記事のバックテスト期間は2017年~のものです。
損益グラフの形が異なっていることがわかります。
バックテスト期間を細かく変えてチェックするやり方は、「4歳児からのストラテジーのパラメータ変更」を参考にしてください。
バックテスト期間を変えることで、本当にそのストラテジーが使えるものなのかどうかの推測が立つとともに、ストラテジーが得意な値動き、苦手な値動きが視覚的にわかります。
TradingViewで検証を行うときには、ぜひこのコードを活用してみてください。
このコードが使えれば、プログラミング知識がゼロでも、簡単なフォークフォワードテスト(なんちゃってk-分割交差検証)を行えます。
この話はまたいずれしたいと思います。
今日はここまで!
BBBでした。