見出し画像

【TradingView】バックテストと最適化【はむとれ】

更新情報:
 2019/12/17 初版

はむとれ」ご存知ですか?
はむとれ」は仮想通貨自動売買システムです。最近オープンソース化されてシステム自体は無料で利用できるようになりました。

画像2

はむとれ」はTradingView用のスクリプトを用意すればすぐに自動売買を始めることができますし、有料プランを導入すれば100種類以上のストラテジーの中から好きなものを選んで利用することもできます。

提供されるストラテジーはそのほとんどがソースコード付きなので、それをTradingViewに貼り付ければすぐにバックテストの結果を確認して動かすことができます。

画像3

バックテストの期間

TradingViewではストラテジーをpineというスクリプト言語で記述することでバックテストを行い、その損益や勝率、プロフィットファクターなどを知ることができます。
とてもお手軽なのですが、TradingViewのヒストリー(過去足)は直近1万本(無料版では5,000本)程度しかないため、バックテスト可能な期間が短いという問題があります。
本日(12/16)現在、TradingViewで表示/バックテスト可能な期間はbitFlyerのFXBTCJPYの場合以下のようになっていました。(リプレイ機能を使ってさらにある程度遡ることは可能です)
   1分足 1週間 (2019/12/02~)
   5分足 1か月 (2019/11/04~)
    15分足 3か月 (2019/09/01~)
    30分足 6か月 (2019/01/01~)
  1時間足     1年 (2018/01/01~)
  4時間足  4.5年 (2015/11/18~)
   1日足   27年 (2015/11/18~)
この期間の短さは長期移動平均線などを使っているとさらに短くなるという問題もあります。例えば、200SMAを使っていると最初の200本の期間は値が取れないためストラテジー的には足が無駄になり、これはリプレイ機能で遡っていいた場合にもそれぞれの先頭部分で売買の空白ができてしまうということになります。(また、EMAなどのいわゆるIIR型の指標の場合はさらにその数倍の期間で指標の値が不正確になってしまうため正しい売買となりません)

bitFlyerではヒストリー(過去足)を直接提供していないようですが、値動きの元となる約定履歴を取得することができます。そこで、約定履歴から足を作ってMT4へインポートしてバックテストや最適化を行っています。
以前はすべての約定履歴を取得することができていましたが、現在では直近31日間までに制限されています。(約定履歴を1か月以上取りこぼさないように注意(緊急メンテなどで取得に失敗しているのを危うく見逃してたことがあった))

bitFlyerのFXBTCJPYの約定履歴は2015年11月18日から始まっていて、今日現在約14億約定あり、1日あたり約150万約定づつ増えています。(減少傾向)
この約定履歴を1分足に変換するとその数は約200万本になります。(BitMEXのXBTUSDは2017年1月からで約150万本)

MT4で表示した2015年11月~2016年6月あたりの日足(価格は1/1,000で表示)
画像3

TradingViewストラテジーの注意点

 TradingViewでストラテジーを作成する場合、いくつか注意すべき点があります。

1. チャートの種類

 TradingViewではローソク足チャート以外にも平均足や鉤足チャートを表示することができますが、それらのチャートにストラテジを適用しても正しいバックテストにはなりません。(以下参照)
例えば、平均足チャートにストラテジーを適用した場合にとても成績のいいバックテスト結果が出ることがあります。(陰線/陽線が連続するチャートとみなされるためトレンドが簡単に取れる)

 https://www.tradingview.com/wiki/Strategies/ja

ストラテジーをチャートに追加する方法
  :  :
注意事項: (練行足, カギ足, ラインブレイク(新値足), ポイント&フィギュア, 平均足, スプレッドチャート(ペアチャート)) の様な非標準のチャートを利用すると、ストラテジーの結果が異なることがあります。これは注文がそのチャートの価格で実行される為です(例えば平均足の場合、実際の市場価格ではなく平均足の価格が使用されます)。

2. 指値/逆指値

 TradingViewのバグなのか仕様なのか、同じ足で指値/逆指値が約定するような場合にバックテスト結果がおかしくなります。(以下参照)
これもバックテストの結果が非常によくなることになります。

3. トレーリングストップ

 TradingViewは足のデータ(値動き)として4本値(Open/Hi/Lo/Close)しか持たず、また、バックテストで下位足が使われることもないため、トレーリングストップはトレール幅が小さいほど正しく機能しません。(これも成績が非常によくなる方向)
これは、陽線内/陰線内では値が逆行しないためです。(Open→Hi→Lo→Closeなどの順に直線状に値が動く)
(以下、「ブローカーエミュレーター」参照)

4. security()関数
pine
スクリプトのバージョン2まではsecurity()関数によって上位足を参照すると未来のデータを読むことができました。そのため、バックテストでは非常にいい成績にみせかけることができます。(例えば、完成している日足を参照しつつその日の始値でエントリーすることができる)
この問題はスクリプトのバージョンを3以上とすることで修正されますが、3以上でも記述方法によってはバージョン2と同様の参照ができるため、バックテスト的には素晴らしい成績のストラテジーをつくることが可能です。
また、そうでない場合でも上位足を正しく利用するのはなかなか難しいです。(以下「先読みの理解」参照)
(さらに、長時間動かしているとTradingViewの不具合と思われる現象にも遭遇したため非推奨にしています)

最適化

MT4を使うメリットとして、長期間のバックテストのほかにパラメーターの最適化を行うことができます。
MT4では指定したパラメーターのすべての組み合わせを計算するモードと、GA (Genetic Algorithm/遺伝的アルゴリズム)を使うモードがあります。

例えば、単純な移動平均線クロスで売買するようなストラテジーの場合、短期/長期のパラメーターをいくつにするのがいいか、そのパラメーターの周囲も同様に利益が出ているかなどを視覚的にも確認することができます。

画像4

また、単純な移動平均線クロスであっても、それぞれの移動平均線には期間のほかに参照する価格(Open/Close/Hi/Lo/Median/Typical/...)、 平滑化の種類(SMA/EMA/WMA/...)やシフト量などがあり、これらの中から全探索しようとすると組み合わせの数が膨大になってしまいます。
このような場合はGAモードを使うことで最大1万程度の組み合わせの中から最適(評価値が最大)なものを計算します。

画像5

30分足のため、TradingViewでは2019年からの結果しかわかりません。

画像6

同じ期間をMT4の結果からグラフにすると、
上図は1BTCで売買した場合の売買ごとの損益(¥)ですが、下図ではトレードオープン時の価格に対する損益の比率(%)を日ごと(UTC0時基準)に積み上げています。(DDはUTC0時での含み損益込み)

画像7

2017年からだと、

画像8

短期で見るとそれなりにDDも大きいですが、なかなかいいカーブを保っていることがわかります。

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