(1)概要
(2)plot関数
(3)change関数・iff関数
(4)input関数
(5)security関数、相関係数インジケータ
(6)fill関数
(7)bgcolor関数
(8)複数行を一括でコメントアウトできる?
(9)line.new関数・line.set関数、ピボット・インジケータ
(10)関数宣言(カスタム関数)、ピボット・ハイ・ロー・インジケータ
(11)ジグザグ(ZigZag)インジケータ
(12)平均足バー・マルチタイムフレーム(MTF)
(13)ストラテジー・バックテストの概要
(14)ストラテジー・サンプル「EMAクロス+固定TP/SL」
(15)ストラテジーの「最適化」をめぐるTradingViewとMetaTraderの違い
(16)Security関数のgapsとlookaheadとは?
(17)アラート条件の設定:alertcondition
はじめに
今回はPineScript入門ガイドの15回目です。前回は、TradingViewのストラテジーとバックテストの概要をご紹介しました。今回はストラテジーのパフォーマンスの「最適化」について、まとめたいと思います。
最適化とは
最適化(Optimization)とは、「ストラテジーの変数(パラメーター)をいろいろと試して、収益性や安定性の高いパラメーターの組み合わせを見つける作業」を言います。
MetaTraderでは、ストラテジーのことをEA(エキスパート・アドバイザー)と呼び、EAを開発してバックテストをするだけでなく、EAを最適化する機能があります。MetaTrader4(MT4)に最適化の機能はありますが、MetaTrader5(MT5)では最適化の機能がとても進化しています。したがって、EAの開発とバックテスト・最適化までをMT5で行って、実際のEAの運用はMT4(VPS利用)で行う方法が現実的であると思います。(私の自作EAは、このかたちで開発・運用しています。)
MT5による最適化は、本当に便利です。8コアのCPUでしたら、8つの作業を同時に動かせますし、さらにクラウド上の別のマシンを使ったりするサービスも利用できますので、MT4で数十時間かかる最適化作業も、MT5では数分で終えたりすることができます。
MT5による最適化については、別の記事として書きたいと思います。
TradingViewでストラテジーの最適化はできる?
一方、TradingViewの現行バージョンのストラテジー・テスターでは、いわゆる「最適化」のメニューはありません。
MetaTraderのようにいろいろなパラメータの最適な組み合わせを自動で見つけることは、TradingViewではできません。
自動最適化は、マシンリソースや時間をとても消費する作業なので、クラウドで動いているTradingViewの機能としては、そもそも馴染まないでしょうね。
しかし、「手動」による最適化作業は、TradingViewで可能です。しかも、これが意外な可能性を秘めていることをこれから説明します。
サンプル・ストラテジーのバックテスト
前回記事で作成したサンプル・ストラテジー「EMAクロス+固定TP/SL」を例にして、TradingViewによるストラテジーの「手動」最適化の作業を説明していきたいと思います。
このストラテジーのロジック、およびバックテストの前提は、以下の通りです。
- 短期EMA(25期間)と長期EMA(75期間)のゴールデン・クロスで買いエントリー
- 短期EMA(25期間)と長期EMA(75期間)のデッド・クロスで売りエントリー
- 利確は、70pips固定
- ロスカット(損切り)は、50pis固定
- 短期EMAおよび長期EMAの期間、利確pips、ロスカットpips、およびバックテストの開始日・終了日は、入力項目として後で変更可能とします
- バックテストの前提:
- 対象通貨ペア・時間足:ユーロドル・1時間足
- 対象期間: 2019年1月1日~2019年12月31日までの1年間
- 基準通貨:円
- 初期資金:100,000円
- オーダーサイズ:1,000通貨
- 手数料:1,000通貨のオーダーの1往復(エントリー・決済)で60円
- ピラミッディング:無し
- スリッページ:無し
バックテストの結果は、以下の通りでした。
- 純利益:8,865円
- 総トレード数:66
- プロフィットファクター(PF):1.734
上記の結果は、テスト期間が1年だけでトレード数も少なすぎ、プロフィットファクターが良すぎなので、実用に耐えうるストラテジーに改良するためには、ここから長い検討が必要です。
サンプル・ストラテジーの「手動」最適化
上記のサンプル・ストラテジーについて、最適化の対象として変更できるパラメータは、以下の通りです。
- バックテストの対象期間(変数は、開始年・開始月・終了年・終了月の4つ)
- 短期EMAの期間(初期値は25)
- 長期EMAの期間(初期値は75)
- 利確の固定pips(初期値は70)※ポイント表示のため700
- ロスカットの固定pips(初期値は50)※ポイント表示のため500
ここでMetaTraderでは、変更するパラメータの開始値・増減値・終了値を設定して自動最適化を行います。(バックテストの対象期間や通貨ペアや時間足などは、別途設定します。)
一方、TradingViewでは、以下の図のように、設定ダイアログの入力値を手動で増減させることで、即時に、純利益やプロフィットファクターの変化を確認できます。
まず、各種パラメータ(短期・長期EMAの期間や利確・損切りのPips数など)を設定ダイアログ上で増減させると(上図の①)、その都度、純利益やプロフィット・ファクターの変動を即座に確認できます(上図の④)。また、通貨ペアの変更(②)や時間足(③)を画面上で変更しても、同様に純利益やプロフィット・ファクターの変動を即座に確認できます。
この「手動のパラメータ変更と即時の結果確認」は、MetaTraderには無い新鮮な感覚があります。パラメータのあらゆる組み合わせは試せなくても、俯瞰的で簡易的な最適化は可能です。また、ストラテジー(EA)の開発に特化せずに「過去データの検証」という観点では、むしろTradingViewの方が可能性があるように思います。
今回のサンプル・ストラテジーについては、以下のような俯瞰的・簡易的な最適化を実施しました。赤い行が最もパフォーマンスが良い結果となりました。
通貨ペア | 時間足 | 短期EMA 期間 | 長期EMA 期間 | 利確 pips | 損切 pips | 純利益 | トレード数 | プロフィットファクター |
EURUSD (初期値) | H1 | 25 | 75 | 70 | 50 | 8,865 | 66 | 1.734 |
EURUSD | H1 | 10 | 75 | 70 | 50 | 4,508 | 106 | 1.248 |
EURUSD | H1 | 25 | 150 | 70 | 50 | 3.150 | 56 | 1.266 |
EURUSD | H1 | 25 | 75 | 90 | 40 | 12,331 | 66 | 2.068 |
GBPUSD | H1 | 25 | 75 | 70 | 50 | 2,580 | 74 | 1.133 |
GBPUSD | H1 | 25 | 75 | 90 | 50 | 8,279 | 74 | 1.424 |
USDJPY | H1 | 25 | 75 | 70 | 50 | -117 | 88 | 0.993 |
EURJPY | H1 | 25 | 75 | 70 | 50 | -657 | 79 | 0.966 |
ユーロドルは最も流動性が大きいので、テクニカル指標が最も効きます。単純なロジックでも、いろいろな検証ができると思います。
なお、パラメータを大量に設定した複雑なストラテジー(EA)を作って、MT5で数万~数10万個の組み合わせから最適化したとしても、「過剰最適化(カーブフィッティング)」という状態に陥ると、過去のある特定の期間だけ通用して、未来の期間には通用しない、ということがよくあります。
TradingViewとMT5の併用
あるロジックを思いついたら、まずはTradingViewのストラテジーをつくって大枠の有効性を検証して、いけそうであれば、MetaTrader(特にMT5)でさらに詳細の開発・最適化を行う、といった方法もありではないかと思います。