PineスクリプトでMACDを使ったバックテストを実行する
Pineスクリプトの書き方について、これまでの記事で一通り解説してきました。
今回はこれまでの復習もかねてMACDを使ったバックテストを実行するコードを作成してみましょう。
バックテストの内容
以下内容のバックテストを実行するコードを作成します。
・バックテスト期間を設定画面から変更できるようにする
・売買方向を設定画面から指定できるようにする
・買いポジションはMACDとシグナルのゴールデンクロス
・売りポジションはMACDとシグナルのデッドクロス
・決済は上記条件でドテン
・MACDに使用する期間は設定画面から変更できるようにする
・MACDをチャート上に表示させる
Pineスクリプトの完成コード
以下が完成したコードになります。Pineエディタにそのままコピペして実行するとバックテストの結果を確認できます。
//@version=4
strategy("MACD backtest", overlay=false, default_qty_type=strategy.fixed, default_qty_value=1, currency=currency.JPY)
//期間設定用入力値------------------------------------------------
startYear = input(2000, minval = 1900, maxval = 2100, title = "開始 年")
startMonth = input(01, minval = 01, maxval = 12, title = "開始 月")
startDay = input(01, minval = 01, maxval = 31, title = "開始 日")
endYear = input(2020, minval = 1900, maxval = 2100, title = "終了 年")
endMonth = input(01, minval = 01, maxval = 12, title = "終了 月")
endDay = input(01, minval = 01, maxval = 31, title = "終了 日")
//開始日時-------------------------------
test_start = timestamp(startYear, startMonth, startDay, 00, 00)
//終了日時------------------------------------------------
test_end = timestamp(endYear, endMonth, endDay, 00, 00)
//テスト期間の指定------------------------------------------------
is_test = test_start <= time and time <= test_end
//売買方向の設定----------------------------------------------
direction = input(0, title="売買方向", minval = -1, maxval = 1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long ))
//インプット設定-----------------------------------------------
fast_len = input(12, title="短期")
slow_len = input(26, title="長期")
signal_len = input(9, title="シグナル")
//MACD---------------------------------------------------------
MACD = ema(close, fast_len) - ema(close, slow_len)
signal = ema(MACD, signal_len)
//ポジショニング条件-------------------------------------------
long_condition = crossover(MACD, signal)
short_condition = crossunder(MACD, signal)
//エントリー条件-----------------------------------------------
if(is_test)
if (long_condition)
strategy.entry("LongEntry", strategy.long)
if (short_condition)
strategy.entry("ShortEntry", strategy.short)
// 確認用の表示 ------------------------------------------------
p1=plot(MACD, color=color.red, title="MACDline")
p2=plot(signal, color=color.blue, title="signalline")
plot(0, color=color.white, title="baseline")
//ライン間の背景色変更-----------------------------------------
fill(p1, p2, color = MACD > signal ? color.green : color.white, transp = 70)
Pineスクリプトのコード詳細
それでは一つずつコードの詳細を解説していきます。より詳しい解説はリンクをそれぞれ張っておくのでそちらを参照してください。
ストラテジーの定義
//@version=4
strategy("MACD backtest", overlay=false, default_qty_type=strategy.fixed, default_qty_value=1, currency=currency.JPY)
まず始めに「バージョンの指定」「ストラテジーの定義」を書く必要があります。
バージョンは現時点で最新のもの//@version=4を使用しましょう。次に今回はバックテストを行うので、ストラテジーstrategyを定義する必要があります(インジケーター作成はstudyです)。ストラテジーは必要最低限タイトルを書けば実行可能です。
今回はMACDをチャート外に表示させたいためoverlay=false、発注数量=1、バックテスト結果の金額表示を円表記にしました。
バックテスト期間の設定する
//期間設定用入力値------------------------------------------------
startYear = input(2000, minval = 1900, maxval = 2100, title = "開始 年")
startMonth = input(01, minval = 01, maxval = 12, title = "開始 月")
startDay = input(01, minval = 01, maxval = 31, title = "開始 日")
endYear = input(2020, minval = 1900, maxval = 2100, title = "終了 年")
endMonth = input(01, minval = 01, maxval = 12, title = "終了 月")
endDay = input(01, minval = 01, maxval = 31, title = "終了 日")
//開始日時-------------------------------
test_start = timestamp(startYear, startMonth, startDay, 00, 00)
//終了日時------------------------------------------------
test_end = timestamp(endYear, endMonth, endDay, 00, 00)
//テスト期間の指定------------------------------------------------
is_test = test_start <= time and time <= test_end
バックテストを実行する期間を設定します。
期間は後で簡単に変更できるよう、inputを使って変数を設定します。変数は開始年月日、終了年月日のそれそれ設定します(期間設定入力値の部分)。
設定した変数を使ってバックテスト開始日(開始日時の部分)を指定する変数test_start、終了日(終了日時の部分)を指定する変数test_endを時間に換算するtimestampを使って作ります。
最後に開始日、終了日の変数を組み合わせてバックテストの期間を指定する変数を作成します(テスト期間の指定の部分)。
売買方向(買い、売り、両方)を決定する
//売買方向の設定----------------------------------------------
direction = input(0, title="売買方向", minval = -1, maxval = 1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long ))
売買方向を指定するコードを作成します。
売買方向は設定画面で変更できるよう、inputを使い、「0」が売り買い両方、「‐1」が売りのみ、「1」が買いのみとなるように作成するため、最小値minvalは「‐1」、最大値maxval「1」とします。
売買方向の指定にはstrategy.risk.allow_entry_inを使います。三項条件演算子を使って「0」が売り買い両方、「‐1」が売りのみ、「1」が買いのみとなるようにコードを作成します。
MACD計算式
//インプット設定-----------------------------------------------
fast_len = input(12, title="短期")
slow_len = input(26, title="長期")
signal_len = input(9, title="シグナル")
//MACD---------------------------------------------------------
MACD = ema(close, fast_len) - ema(close, slow_len)
signal = ema(MACD, signal_len)
バックテストに使うMACDを設定します。
Pineスクリプトには計算を省くため主要なインジケーターの関数があらかじめ設定されています。もちろんMACDの関数もありますが、今回はMACDとシグナルのクロスを売買指標とするためMACD関数を使うとコードが書きにくくなります。したがってMACDの計算式を分解して作成します。
MACDの設定値は後で簡単に変更できるようinputを使い、短期fast_len、長期slow_len、シグナルsignal_lenの変数を作成します。
設定した変数を使って、MACD、シグナルを算出するコードをインジケーター関数のemaを使って作成します。MACD計算式の詳細は以下の記事を参照ください。
ポジショニング条件を設定する
//ポジショニング条件-------------------------------------------
long_condition = crossover(MACD, signal)
short_condition = crossunder(MACD, signal)
ポジショニング条件を指定します。
買いポジションはMACDがシグナルを上抜けした場合なので、crossoverを使います。
売りポジションはMACDがシグナルを下抜けした場合なので、crossunderを使います。
エントリー条件を設定する
//エントリー条件-----------------------------------------------
if(is_test)
if (long_condition)
strategy.entry("LongEntry", strategy.long)
if (short_condition)
strategy.entry("ShortEntry", strategy.short)
エントリー条件を設定します。
まずはバックテストの期間を指定するために作成した変数is_testとif文を使ってエントリー対象とする期間を指定します。
ポジションのエントリーはif文を使って、ポジショニング条件で設定した条件(long_condition,short_condition)に当てはまる場合にエントリーを実行させます。エントリーにはstrategy.entryを使います。
チャート上にMACDラインを表示する
// 確認用の表示 ------------------------------------------------
p1=plot(MACD, color=color.red, title="MACDline")
p2=plot(signal, color=color.blue, title="signalline")
plot(0, color=color.white, title="baseline")
//ライン間の背景色変更-----------------------------------------
fill(p1, p2, color = MACD > signal ? color.green : color.white, transp = 70)
最後に確認用のMACDをチャート下に表示させます。
plotを使い、MACD線は赤色、シグナルは青色、0中心線は白色で表示させます。
また、クロスしている期間が視認しやすいようにMACD線とシグナル線の間を塗りつぶします。売りポジションの場合は白色、買いポジションの場合は黄緑色に設定しました。
Pineスクリプトで作成したストラテジーを実行する
コードの作成が完了したら、「チャートに追加」をクリックしてバックテストを実行してみましょう。
バックテストの結果が表示されました。
テスト期間、MACDの設定を変えてバックテストを実行する
テスト期間やMACDの設定を変更するには歯車マークをクリックします。
設定画面が表示されます。ここで表示されているパラメータはinputを使って設定した項目です。必要に応じてバックテストの実行期間、MACDのパラメータを変更します。パラメータを変更すると即座にバックテストの結果に反映されます。
時間足を変更してバックテストを実行する
バックテストに使用する時間足を変更したい場合は、チャート上にある時間足変更のボタンをクリックするだけです。時間足を変更すると即座にバックテストの結果に反映されます。このように簡単にバックテストの条件を変更できる点もPineスクリプトの魅力です。
通貨ペア、銘柄を変更してバックテストを実行する
バックテストに使用する通貨ペア、銘柄の変更もとても簡単です。チャート右のウォッチリストからバックテストを実行したい通貨ペアを選択するだけで、バックテストの結果に即座に反映されます。同じストラテジーを使って異なる通貨ペア、銘柄の結果を比較したい場合もPineスクリプトを使えば効率的です!
口座とアカウントを作成する
Trading View
本記事で使用しているトレーディングビューはPineスクリプトでバックテストを行う以外にも、自分のオリジナルインジケーターを作成したり、世界中のトレーダーが作成したオリジナルのインジケーターを使うことも可能です。
FX、株、ETF、コモディティなど国内外問わず様々な銘柄に対応しています。
OANDA JAPAN
OANDA JAPANはトレーディングビューを使って直接取引できる数少ないFX業者です。他にもMT4、MT5にも対応しています。
コメント