このページでは、Pythonで作成したFX自動売買ツールのバックテストを行う方法をご紹介しています。
Pythonでバックテストを行うメリットは以下の通りです。
- MT4やMT5のバックテストでは確認することが難しかった細かいところまで手が届くオリジナルのバックテストツールを作成できる。
- バックテスト結果を簡単にグラフ化やデータ分析を行なって可視化できる。
この記事は、以下の前回の記事の続きです。
ローソク足チャートの作成
Pythonでは、mplfinanceを用いることで簡単にローソク足チャートを作成することが可能です。そこでこの記事では、MT5から過去データ(チャートバー情報)を取得してローソク足を作成し、そのローソク足に取引履歴をプロットする、ということを手順を追って説明します。
まずは、前回の続きになります。以下のグラフから始めます。
df = pd.read_pickle('/content/drive/My Drive/backtest/df_M15.pkl')
mpf.plot(df, type = 'candle', figsize=(16,8), tight_layout=True, datetime_format='%-H:%M' )
mplfinanceでは、addplotという機能を使って、描いたローソク足の上にプロットしていくことが可能です。
addplotでローソク足にプロット
例えば、前回の記事で作成したdf_buy_orders(buyポジションの取引履歴)から、以下の部分を抜粋して、こちらをローソク足グラフ上にプロットしてみたいと思います。
なお、ローソク足作成に使用したdf(データフレーム)は、以下の通りです。
df[‘plot’]の追加
まずは、このdfにplotというカラムを追加します。
import numpy as np
df['plot'] = np.nan
ここでは、numpyというライブラリをインポートしています。
そして、’plot’というカラムに、NaNを代入しています。
NaNとは、「Not a Number」の略です。つまり、非数(数字ではない)です。
dfは以下のようになります。
plotにNaN値が入っているのが確認出来ます。
プロット時間帯の確認
次に、プロットしたい時間帯を確認してみます。
df['2022-11-07 11:00:00':'2022-11-07 11:15:00']
11:03、11:08、11:25という時間の取引履歴をプロットしようとしていたので、15分足の場合は、11:00と11:15の足が対象になります。
df[‘plot’]に入力
まずは、わかりやすい以下の二つの注文(first_buy→buy_close)を取り上げます。
これをプロットするには、以下のようにdf[‘plot’]に入力します。
df.at['2022-11-07 11:00:00', 'plot'] = 1678.08
df.at['2022-11-07 11:15:00', 'plot'] = 1679.25
上記のように、df.atを使うことで、特定の位置の値を直接入力することが可能です。dfは以下のようになります。
ここで、plot用の値はbid値を採用しています。基本的にローソク足のグラフはbid値をベースに描かれています。実際は、buy注文の際はask値、sell(buy_close)注文の際はbid値が使われますが、ローソク足についてはbuyもsellもbidということが多いです。そこで、ここでプロットする場合も、常にbid値を使うことにします。
add_plotの設定
以上のdfを用意した状態で、以下のようにadd_plotを設定します。
add_plot =[mpf.make_addplot(
df['plot'],
color='b',
type='scatter',
marker='o',
markersize=20,
panel=0,
secondary_y=False
)]
mpf.plot(
df, #読み込むdf(データフレーム)
type = 'candle', #チャートタイプ(ローソク足)
figsize=(16,8), #グラフのサイズ
tight_layout=True, #タイトレイアウト
datetime_format='%-H:%M', #時間表記の設定
addplot=add_plot #add_plotの設定
)
11:00の陽線とその隣の11:15の陽線に青い点がプロットされているのが分かるでしょうか。
かなり細かく丁寧に解説しましたが、これがaddplotの使い方です。
破線の追加
さらに、点だけでなく線を描くことも可能です。add_plotに以下のように追記します。
add_plot =[
mpf.make_addplot(df['plot'], color='b', type='scatter', marker='o', markersize=20, panel=0,secondary_y=False),
mpf.make_addplot(df['plot'], color='b', width=1, linestyle="dashed", panel=0, secondary_y=False)
]
これで、青い点と破線をつなぐことが出来ました。
MT5の仕様に近づける
さらに少しアレンジします。
df['buy'] = np.nan
df['buy_close'] = np.nan
df.at['2022-11-07 11:00:00', 'buy'] = 1678.08
df.at['2022-11-07 11:15:00', 'buy_close'] = 1679.25
‘buy’と’buy_close’というカラムも用意して、エントリー注文とクローズ注文を分けました。
add_plot =[
mpf.make_addplot(df['buy'], color='b', type='scatter', marker='^', markersize=20, panel=0,secondary_y=False),
mpf.make_addplot(df['buy_close'], color='r', type='scatter', marker='v', markersize=20, panel=0,secondary_y=False),
mpf.make_addplot(df['plot'], color='b', width=1, linestyle="dashed", panel=0, secondary_y=False)
]
buy注文を青い▲、sell注文を赤い▼、buyとcloseを青い破線でつなぐことが出来ました。MT5で見られる取引履歴に近い仕様です。
numbaで高速化
Pythonでバックテストする方法について、numbaによる高速化も取り入れてより効率的に行える仕組みついてまとめました。是非あわせてご覧ください。