バックテスト・フォワードテストを行う(strategy)
バックテスト用スクリプトを作成する
strategy(ストラテジー)とは、売買の注文を出すためのPineScriptの機能です。注文を後から変更・キャンセルすることも可能です。インジケーターはstudy関数を使いましたが、ストラテジーはstrategy関数を使います。インジケーター(study)で使用できる関数の大半はストラテジーでも使用できます。plot関数でインジケーターを描くことも可能です。
バックテストとフォワードテスト
過去のローソク足を使ってバックテストができる他、リアルタイムのデータを使ったフォワードテストを行うこともできます。Pineエディタタブの右隣にある「ストラテジーテスター」タブから、バックテスト結果を見る事ができます。 スクリプトをチャートに追加すると、自動的にバックテストが始まります。どの足で売買したかがチャート上に表示されます。フォワードテストを行うためには、ティックごとに再計算する必要があります。strategy関数の引数calc_on_every_tickをtrueに設定するか、ストラテジーの設定のプロパティ内から設定する必要があります。 なお、バックテストやフォワードテストはローソク足以外の足(平均足や練行足等)では正しく計算されないため、非推奨となっています。
ストラテジーの簡単なサンプル1
移動平均線のゴールデンクロスで買い、デッドクロスで売る簡単なサンプルを示します。
ソースコード
//@version=5
strategy("strategyサンプル", overlay = true)
// 移動平均線の計算
MA_Short = ta.sma(close, 30)
MA_Long = ta.sma(close, 100)
// 売買の注文
strategy.entry(id = "Entry", direction = strategy.long, when = ta.crossover(MA_Short, MA_Long))
strategy.exit(id = "Exit", from_entry = "Entry", when = ta.crossover(MA_Long, MA_Short), stop = MA_Long)
コード解説
2行目
strategy関数で、ストラテジーのプロパティを設定します。
4~5行目
売買ポイントを作成するための移動平均線を計算します。
7行目
strategy.entry関数で注文指示を出します。whenで設定した足の翌足始値で成行注文。
8行目
strategy.exit関数で決済指示を出します。whenで設定した足に到達した後、stopの値に到達したら決済します。
買い(エントリー)の関数
買い注文はstrategy.entry()関数またはstrategy.order()関数で行います。保有中に更に購入または空売りする場合はstrategy.entry()関数を使います。
関数 | strategy.entry() strategy.order() |
機能 | 注文指示を出す strategy.entry():ピラミッティングあり strategy.order():ピラミッティングなし |
戻り値 | なし |
引数 | id(必須) 注文の識別子 direction(必須) strategy.long:買い strategy.short:空売り qty(必須) 株数 when 注文する。 後述のlimitとstopのどちらも指定しない場合、 trueの足の翌足始値で購入する limit 指値注文の価格。whenがtrueになった足に注文が行われる。 stop 逆指値注文の価格。whenがtrueになった足に注文が行われる。 |
売り(エグジット)の関数
関数 | strategy.exit() |
機能 | エグジット指示を出す |
戻り値 | なし |
引数 | id(必須) エグジットの識別子 from_entry(必須) エントリー関数で指定した識別子 profit(必須) 利確までの価格幅 loss(必須) 損切までの価格幅 limit 利確する価格。 stop 損切する価格。 |
ストラテジーの簡単なサンプル2
RSI30未満から30以上となったら100株買い、買値から10%上昇したら50株売り、20%上昇したら残り50株売り、買値から5%下落したら全て損切り。
ソースコード
//@version=5
strategy("ストラテジーテスト")
// RSI
RSI = ta.rsi(close, 30)
plot(RSI)
// 注文処理
strategy.entry("Buy", strategy.long, 100, when = 30 < RSI[2] and RSI[1] < 30)
// エグジット
ProfitTakePrice1 = strategy.position_avg_price * 1.1
ProfitTakePrice2 = strategy.position_avg_price * 1.2
LossCutPrice = strategy.position_avg_price * 0.95
// 決済処理
strategy.exit("Sell1", "Buy", 50, limit = ProfitTakePrice1, stop = LossCutPrice)
strategy.exit("Sell2", "Buy", 50, limit = ProfitTakePrice2, stop = LossCutPrice)
コード解説
2行目
strategy関数で、ストラテジーのプロパティを設定します。
6~7行目
注文処理を行います。RSI30未満から30以上となったら100株買います。
8~11行目
決済する価格を求めます。購入価格はstrategy.position_avg_priceで取得できます。二段階にわけて利食いを行います。
12~14行目
決済処理を行います。