私管理人は去年bitcoinのトレードをやるにあたってTradingViewに転がっている様々なストラテジーを検証しました。
そのときに使った私見でのTradingViewのよいストラテジーの選び方とストラテジーテスターのバックテストのやり方とコツを解説します。
この記事は株・FX・暗号資産などのどれにも使えるかと思います。
(転がっているストラテジーは使えないストラテジーがほとんどですが)
TradingViewについて知らない方は以下も見てみてください。
結論、まとめ
まず結論的なことを言っておくと、TradingViewにあるストラテジーやネットで検索に出てくるストラテジーも含めて99%使い物にならないように感じました。(ネット上にあるすべてのpineストラテジーを検証してはないと思うので感想です)
実際に自分が検証したストラテジーの中でリアルのトレードで使えたストラテジーは一つだけでしたが、これも偶然成績が出た疑いがあります。
(しかも寿命は半年でした)
ですので、おすすめのストラテジーとか、そういったのを題して記事を書きたいところではありますが、それは困難なので書けません。
TradingViewで投資アイディアを探すよりももっと別のところで探したほうがいいかもしれません^^;
それでもいいなら以下を読んでみてください(笑)
TradingViewにある良いストラテジーの選ぶポイント
(たんに一例なので以下に当てはまってるものではないです。)
まずは良いストラテジーを選ぶポイントを解説します。
ストラテジーを探してバックテストする流れはこの次に解説します。
選ぶポイントをまとめると以下になります。
- バックテストでの取引回数は必ず30回以上、理想は100回以上ものを選ぶ。
- パラメーターが少ないものを選ぶ
- 足が短いもので結果が出るものを選ぶ
- グラフは右肩上がりでブレがないものを選ぶ
- リペイントしていないものを選ぶ
- つまり、「シャープレシオ」を一番重視して選ぶ
- リカバリーファクターも重視する
取引回数が多いものを選ぶ
ここは多いければ多いほどバックテストの信憑性が高まりますので重要です。
統計的にも最低で30回~100回は欲しいです。
理想は100回より、より多く欲しいところです。
(相場は正規分布ではなく、ストラテジーの結果も正規分布ではないでしょうが、30が統計の標準偏差のサンプルサイズで必要な値です。)
パラメーターが少ないものを選ぶ
パラメーターが少なければそれだけバックテストでカーブフィッティングせずバックテストの信憑性が高まります。(AIC)
パラメーターは3つから4つまでが理想でしょう。
逆にパラメーターが多ければ、どんな相場でもバックテスト上は良い結果を簡単に出せます。
(ただしパラメーターが多くてもリアルで通用するストラテジーはまれにあります。)
短い時間足で結果が出るものを選ぶ
長い時間足は必然的に情報量が少ないため、同じ期間の短い時間足よりも比較的簡単にカーブフィッティングさせられます。
ただこのポイントに関しては上2つよりかは重要でありませんので、他の要素で光るものがあれば無視してもいいかもしれません。
ストラテジーのリペイントについて
ユーザーがTradingVIewに投稿しているストラテジーのスクリプトにはリペイント (再描画:後出しじゃんけん)が搭載されているものが多くあります。
リペイントのロジックでは未来の値や全く別の銘柄のデータなどを巻き込んでいて、再読み込みすると不利な取引がなかったことになって修正されます。
このリペイントを使えばリペイントができるなら勝率100%、利益率無限大で当たり前。 人気の公開スクリプトの多くはリペイント型のスクリプトで、とんでもない利益が出ます。
このようなリペイントをストラテジーは意味のないものなので、もちろん避けるべきです。
主にpineスクリプトのversion 2 以前であればリペイントしやすく、さらにverison 3 にてsecurity関数を使用していればリペイントされていることが多いので、これらを避けるようにしましょう。
シャープレシオ
「(投資商品のリターン - 無リスク利子率) ÷ 投資商品の年率リスク」と表現されることが多いです。
簡単に言えば、利益とリスクの比率のことでシャープレシオが大きいほど資産曲線がなめらかになり、安定性のある利益が見込めます。
リカバリーファクター
これはバックテストの表には載っていないので、自らで計算する必要があります。
リカバリーファクター(RF)が大きければ、RFが小さいストラテジーよりも一回あたりの取引量を多くでき、利益も多く出せるでしょう。
こちらは5以上あればよいかと思います。
Trading Viewのストラテジーを検索してバックテストを行うまでの方法・流れ・コツ
TradingViewにてストラテジーを探す流れ
・TradingViewのスクリプト一覧からストラテジーを探す
まず「スクリプト」をクリックします。
各Trading Viewユーザーが投稿したインジケーターとストラテジーのページに飛びます。
「すべてのスクリプト」を押して「ストラテジーのみ」を押すと表示をストラテジーのみに絞れます。
各ストラテジーをクリックすると詳細が見られます。
ストラテジーの詳細画面を下にスクロールするとバックテストの結果が見られます。
・TradingViewのストラテジーの詳細・バックテストで見るべきポイント
まずは2.の取引回数を見ましょう。
取引回数が30回以上でなければ検討に値しません。
さっさと画面を閉じて別のストラテジーを見てみてましょう。
次に見るのは6.グラフです。
このようにグラフから右肩上がりでそこそこなめらかであれば検討に値します。
あまりにも上下にジグザグであれば別のストラテジーを検討しましょう。
その次はこのストラテジーのpineスクリプトを見ます。
コード内の5.inputとか書かれたinput関数がパラメーターを表します。
この数がinput()多いとパラメーターが多いということなので、その場合は検討に値しません。
(年月日でバックテスト期間を絞るようなパラメーターなど、結果に影響しないようなものは例外です。)
さらにpineスクリプト内にsecurity関数があるとリペイントの疑いがあります。
コメント欄にrepaintしていると書いている場合があるのでこれらを見たら避けるようにしましょう。
(ctrl + Fもしくは⌘ + Fのページ内検索にて「repaint」を検索してください )
リカバリーファクターは1.÷2.で計算できます。
ただし計算するのはシャープレシオを見てからでも遅くはないので、まずシャープレシオを見ましょう。
4.「パフォーマンスサマリー」を押してスクロールするとシャープレシオを表示できます。
シャープレシオは0.5以上あれば良いでしょう。
0.4は少なめかもしれません。
ただしこのストラテジーのリカバリーファクターは、 $ 23155.14 / $ 933.51 =約24.8と高いです。
ですが、このストラテジーはパラメーターが多いので検討に値しません。
ただ実際のところ、いままで上げた条件を満たすストラテジーはあまりなく、探すのも難しいです。
ですので、このあともストラテジーを使ってバックテストの方法を説明します。
ストラテジーの詳細6.「お気に入りスクリプトに追加」を押してストラテジーをお気に入りに追加すると、チャート画面にてこのストラテジーのバックテストができます。
TradingViewのストラテジーテスターを使用したバックテストの方法
まずTradingViewトップページのメニューからチャートをクリックしてチャートを開きます。
開いたら1.「インジケーター」を押します。
すると2.TradingViewのスクリプト一覧ページ画面にてお気に入りに入れたストラテジー一覧が表示されます。
3.にて検索をかけてストラテジーやインジケーターを絞れます。
とりあえず2.の一覧からさきほどのストラテジー「SuperTREX strategy」を探してクリックします。
これだけでバックテストの結果が表示されます。
お手軽ですね。
1.の歯車アイコンを押すとパラメーターの設定や初期資金、ピラミッティングの設定ができます。
2.にて時間足が変更できます。
ストラテジーを素直に作った場合、足の始値にてそのストラテジーのルールを満たせばエントリーするようになりますので、このようなストラテジーは多くあります。
時間足を変えることによってエントリーするタイミングが細かくなりますので、結果が時間足によって変わってきます。
パラメーターや時間足をいじってよりよい結果やいろいろな結果を見ていってください。
ストラテジーのバックテストのコツ・詳細な検証方法
検証する場合は期間をある一定期間(例えば1年)を指定してバックテストを行う必要があります。
同じ日にバックテストの集計が始まり、集計を同じ日に終えるよう設定できれば他のストラテジーとも比較できます。
もし検証したいストラテジーに期間の指定ができるパラメーターがあればそれに越したことはありません。
しかし、ない場合はストラテジーのpineスクリプトを編集してこの機能を追加するしかありません。
・期間を設定できるパラメーターを追加する
バックテストの年月日を制限するコードを用いた移動平均線のゴールデンクロス・デッドクロスのストラテジーに年月日の期間を設定できるパラメーターを追加した例です。
//@version=4
strategy("マイストラテジー", overlay=true)
longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = crossunder(sma(close, 14), sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
↓
//@version=4
strategy("マイストラテジー", overlay=true)
SYear = input(2019, "開始: 年")
SMonth = input(5, " 月")
SDay = input(23, " 日")
SHour = input(0, " 時")
SMinute = input(1, " 分")
StartDATE = timestamp("GMT+9",SYear,SMonth,SDay,SHour,SMinute)
EYear = input(2020, "終了: 年")
EMonth = input(5, " 月")
EDay = input(23, " 日")
EHour = input(0, " 時")
EMinute = input(1, " 分")
EndDATE = timestamp("GMT+9",EYear,EMonth,EDay,EHour,EMinute)
BGColor = (time >= StartDATE) and (time <= EndDATE) ? #333333 : na
bgcolor(BGColor, transp=96)
BackTest() =>
time >= StartDATE and time <= EndDATE ? true : false
longCondition = crossover(sma(close, 14), sma(close, 28))
shortCondition = crossunder(sma(close, 14), sma(close, 28))
if BackTest()
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
BackTest()関数にて設定した期間以外であればエントリーしないよう変えています。
つまり、期間設定のパラメーターの追加方法はまず、以下のコードをコピーして、冒頭に貼り付けます。(既存のstrategyと書いてある行は消すかstrategyより下の行をコピーして既存のstrategyより下の行に貼り付けてください。)
//@version=4
strategy("マイストラテジー", overlay=true)
SYear = input(2019, "開始: 年")
SMonth = input(5, " 月")
SDay = input(23, " 日")
SHour = input(0, " 時")
SMinute = input(1, " 分")
StartDATE = timestamp("GMT+9",SYear,SMonth,SDay,SHour,SMinute)
EYear = input(2020, "終了: 年")
EMonth = input(5, " 月")
EDay = input(23, " 日")
EHour = input(0, " 時")
EMinute = input(1, " 分")
EndDATE = timestamp("GMT+9",EYear,EMonth,EDay,EHour,EMinute)
BGColor = (time >= StartDATE) and (time <= EndDATE) ? #333333 : na
bgcolor(BGColor, transp=96)
BackTest() =>
time >= StartDATE and time <= EndDATE ? true : false
その後で、if Backtest()をエントリーする関数strategy.entry
の上の部分に貼り付けます。
if BackTest()
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
このようにすると期間を指定してバックテストができるようになります。
・ アウトオブサンプルテストを行う
期間を指定してストラテジーをテストできるなら、このアウトオブサンプルテストが行えます。
例えば、2017年初から2019年末の年月日を指定して、この間にてバックテストを行います。
よい結果が出るまでパラメーターを調整して、結果が出たら2020年初から2020年末(もしくは現在まで)バックテストを行います。
そして2020年初から末までのバックテストもよい結果が出るようであれば、バックテストを行ったストラテジーはさらなる検討に値します。
もしpineコードがMT4のMQLやpythonで再現できるのであれば、ウォークフォワードテストを行うなどしてさらにストラテジーを検証しましょう。
とりあえずアウトオブサンプルテストだけではストラテジーの検証は不十分です。
プログラムを書けない人はとりあえず何ヶ月か結果が出るか様子を見たり、デモトレードで一定期間実践してみて確かめるなどしましょう。
・できるだけ短い足でバックテストを行う
さきほどにも書いたように時間足が長い足は短い足より比較的カーブフィッティングしやすく結果が出やすいです。
30分足など、短い足でも結果が出るストラテジーであれば有望といえるでしょう。
TradingViewのPro版(有料)以上であれば、さらに10分足や40分足など自由に時間足を設定できます。
まとめ
TradingViewにて使える投資アイディアやストラテジーを探すのは困難です。
さらに転がっているストラテジーも検証が不十分なものばかりです。
上記のバックテストのコツなどの検証であっても不十分なところもありますが、役立つのであれば幸いです。
コメント