ストラテジーのテスト期間指定は必須
今回ご紹介する「テスト期間の指定」はPineスクリプトでバックテストを行う上で必須といっても過言ではありません。
なぜテスト期間の指定が必要なのか。理由は大きく分けて2つあります。
期間を指定しないとエラーになる可能性がある
一つ目は、Pineスクリプトのストラテジーは売買が2000件以上になるとエラーになってしまうこと。
2000件以上のテストを行いたい場合は、期間を区切って合計する必要があります。
テスト期間はバックテストの結果に大きく影響する
二つ目は、テストする期間によってバックテストの結果が大きく変わってしまうこと。
下の画像は同じストラテジーを使用した、1年間のバックテスト結果です。
トレードの件数は大きく変わりませんが、利益、勝率など大きく異なることがわかります。
このようにバックテストは実施する期間や時間足によって、結果が大きく異なる点は留意しなければなりません。
Pineスクリプトのテスト期間を指定する
それでは早速コードを書いてみましょう。
ストラテジーの新規作成
①タブ「Pineエディタ」を選択
②「新規作成」から「空のストラテジースクリプト」を選択
すると、下の画像のようにスクリプトが自動で表示されます。
今回はこのスクリプトにテスト期間を指定するコードを追加していきます。
自動的に生成されるスクリプト例は、単純移動平均線14、28がクロスしたときにエントリーするストラテジーです。
期間を指定したストラテジースクリプト
自動生成されたスクリプトにバックテストをの期間を指定したスクリプトが以下になります。
//@version=4
strategy("マイストラテジー", overlay=true)
//開始日時
test_start = timestamp(2018, 4, 1, 00, 00) //追加コード
//終了日時
test_end = timestamp(2019, 4, 1, 00, 00) //追加コード
//テスト期間の指定
is_test = test_start <= time and time <= test_end //追加コード
//ポジショニング条件
longCondition = crossover(sma(close, 14), sma(close, 28))
shortCondition = crossunder(sma(close, 14), sma(close, 28))
//エントリー条件
if (is_test) //追加コード
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
いかがでしょう?たった数行追加するだけなので簡単ですね!
それでは詳しく見ていきましょう。
スクリプト内の「//」から始まる部分はバックテストには反映されないコメントです。コメントを記載しておくことでスクリプトの構造が把握しやすくなります。
スクリプトの解説
冒頭の「バージョン、ストラテジーの定義」はこちらの記事を参考にしてください。
テスト開始日時の変数を宣言する
//開始日時
test_start = timestamp(2018, 4, 1, 00, 00)
上記を日本語に変換すると、「test_startという変数は、2018年4月1日0時0分の日時を示します」といった意味になります。
テストを開始する日時の変数をビルトイン変数の「timestamp」を使って宣言しましょう。
「timestamp」は指定された日時のUNIX時刻を返すビルトイン変数です。
timestamp(年,月,日,時,分) のように日時を指定します。
デフォルトではUNIX時間ですが、他のタイムゾーンを指定することもできます。
その場合は、 timestamp(タイムゾーン,年,月,日,時,分) のように記載し、「タイムゾーン」の箇所には 「Asia/Tokyo」または「GMT+9」にすることで日本時間に変更することができます。
テスト終了日時の変数を宣言する
//終了日時
test_end = timestamp(2019, 4, 1, 00, 00)
上記を日本語に変換すると、「test_endという変数は、2019年4月1日0時0分の日時を示します」といった意味になります。
テスト開始日時とほとんど同じなので簡単ですね!
注意点としては、テスト終了日時に使う変数なのでテスト開始日時以降の日時に設定しましょう。
テスト終了日時を未来の日時に設定すると自動的に現在までの期間となります。
例) timestapm(2099,1,1,00,00)
テスト期間を指定する変数を宣言する
//テスト期間の指定
is_test = test_start <= time and time <= test_end
上記を日本語に変換すると「is_testという変数は、test_start(変数)以降からtest_end(変数)までを現在選択している時間足で示します」といった意味になります。
「time」は現在選択している時間足をUNIX時間で返すビルトイン変数です。
ポジショニング条件の変数を宣言する
今回のテスト期間を指定するスクリプトとは直接関係ありませんが、一応説明しておきますね。
//ポジショニング条件
longCondition = crossover(sma(close, 14), sma(close, 28))
shortCondition = crossunder(sma(close, 14), sma(close, 28))
上記を日本語に変換すると、「lognConditionという変数は、単純移動平均線14(終値)が単純移動平均線28(終値)を上抜けすることを示します」「shortConditionという変数は、単純移動平均線14(終値)が単純移動平均線28(終値)をした抜けすることを示します」といった意味です。
単純移動平均線(SMA)以外のインジケーター関数についてはこちらの記事を参考にしてください。
エントリー条件を設定する
//エントリー条件
if (is_test)
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
上記を日本語に変換すると、「is_test(変数)の期間において、longCondition(変数)の条件を満たした場合、買い注文でエントリー(チャート上にMy Long Entry Idと表示)する」 「is_test(変数)の期間において、shortCondition(変数)の条件を満たした場合、売り注文でエントリー(チャート上にMy short Entry Idと表示)する」 といった意味になります。
if文の書き方はこちらの記事で詳しく解説しています。
strategy.entryの補足:引数にwhenを使う
先ほどはエントリー条件にif文を使ってコードを書きましたが、strategy.entryの引数にwhenを使っても同じ処理のコードを書くことができます。
先ほどのコードをwhenを使って書いてみます。
//エントリー条件
strategy.entry("My Long Entry Id", strategy.long, when = is_test and longCondition)
strategy.entry("My Short Entry Id", strategy.short, when = is_test and shortCondition)
whenはstrategy.entryのオプションパラメータで条件がTrueの場合発注、Falseの場合は発注しません。
引数にwhenを使えばif文を省略できる場合もあるので、whenを使ったほうがコードがすっきりしましたね。
スクリプトの説明は以上です。
バックテスト結果を確認する
スクリプトが完成したら「チャートに追加」をクリックします。
スクリプトにエラーが発生せず、正常に処理されれば結果の概要が表示されます。
トレード一覧をクリックすると、各売買の詳細が確認できます。
バックテストの結果を表示させた状態で、チャートの時間足を変更すると時間足毎の結果が表示されます。
今回のまとめ
今回はPineスクリプトのストラテジーでバックテストを行う期間を指定する方法をご説明しました。
完全に理解しいなくても、今回ご紹介したスクリプトをコピペして日付の部分を変えるだけでも使用できます!
今回は以上です。ありがとうございました。
コメント