このページでは、Pythonで作成したFX自動売買ツールのバックテストを行う方法をご紹介しています。
Pythonでバックテストを行うメリットは以下の通りです。
- MT4やMT5のバックテストでは確認することが難しかった細かいところまで手が届くオリジナルのバックテストツールを作成できる。
- バックテスト結果を簡単にグラフ化やデータ分析を行なって可視化できる。
この記事は、以下の前回の記事の続きです。
「backtest_sample.ipynb」の作成
Colabは、Jupyterノートブック形式ですので、各セルごとに実行して実行結果を確認しながら進めることが可能です。
前回作成した「GOLD_tick.pkl」を呼び出すところから進めます。
Googleドライブに接続
ランタイム接続を一度解除したりすると、Colabの場合はこれまで行なった処理が初期化されてしまいますので、その前提で、今回は再び、Googleドライブの接続処理から行います。
from google.colab import drive
drive.mount('/content/drive')
インポート処理
Pythonの御作法です。これもランタイムが初期化されたら、再びインポートします。
import pandas as pd
from datetime import datetime
インプットデータの読み込み
ここは、ドライブに保存した「GOLD_tick.pkl」を読み込めば良いのです。
df = pd.read_pickle('/content/drive/My Drive/backtest/GOLD_tick.pkl')
「GOLD_tick.csv」を読み込む必要はありません。これが、Colabを扱う上で効率化のポイントです。データは基本的に.pkl形式で一度Googleドライブに保存しておきましょう。
読み込んだ結果は、以下の通りです。
ティックデータを取引時間に限定
MT5からダウンロードしたティックデータは、取引時間外にもティックが存在しています。
バックテストを行う上で、取引時間外に取引を行うというあり得ない事象は排除しておいた方が良さそうなので、ここの部分もデータを少し調整します。
ゴールド(XAU/USD)の取引時間は基本的に、
キプロス時間で1:05~23:55(金曜日のみ23:50閉場)です。
日本時間(夏時間)では、7:05~翌日5:55(金曜日のみ翌日5:50)です。
日本時間(冬時間)では、8:05~翌日6:55(金曜日のみ翌日6:50)です。
今回は2022年11月7日(月)のデータを抽出したので、取引時間は、1:05~23:55です。
そこで、以下のように時間範囲でデータ抽出を行います。
df_tick = df [ '2022-11-07 01:05:00' : '2022-11-07 23:54:59' ]
こうすることで、以下の通り、取引時間外も存在していたティックデータから、取引時間内だけのティックデータに加工することが出来ました。
ティックデータのNaNを穴埋め
直前のデータを見てもわかる通り、このティックデータにはNaNとなっていて数値が入っていないレコードが存在します。
これは何かと言うと、実際の取引データなので、bidだけ取引が発生して、askは発生しない時間が存在するわけです。
従って、ティックデータとしてはこれで正しいのですが、バックテストを行う上では、数値が抜けてしまっているのは不都合が起こるので、この数値を穴埋めしておきます。
以下のコードで実行します。
df_tick = df_tick.fillna(method='ffill')
これはPandasでNaN値を穴埋めする関数です。method='ffill'
とすることによって、NaN値を一つ前の数値で埋めることが出来ます。時系列的に、一つ前の数値は直前の価格なので、妥当と考えてこちらを採用します。
加工結果は、以下の通りになります。
インデックスをリセットしておく
ここで、以下の通りインデックスをリセットしておきます。
df_tick = df_tick.reset_index()
すると、df_tickは以下のようになります。こうしておいて、後の工程のループ処理部分で、timeとbidとaskを1レコードずつ取り出していくことになります。
df_tickをpickleファイルへ保存しておく
ここまで加工したdf_tickを、pickle形式で保存しておきます。
df_tick.to_pickle('/content/drive/My Drive/backtest/df_tick.pkl')
こうしておくことで、これまでの工程を繰り返す必要がなくなります。
次に始める場合は、以下の通りdf_tickを呼び出すだけでOKです。
df_tick = pd.read_pickle('/content/drive/My Drive/backtest/df_tick.pkl')
続きの記事
以上で、インプットデータ(ティックデータ)の準備が完了しました。
次からは、いよいよEAのバックテスト用ロジックを構築していく工程に入ります。
numbaで高速化
Pythonでバックテストする方法について、numbaによる高速化も取り入れてより効率的に行える仕組みついてまとめました。是非あわせてご覧ください。