このページでは、Pythonで作成したFX自動売買ツールのバックテストを行う方法をご紹介しています。
Pythonでバックテストを行うメリットは以下の通りです。
- MT4やMT5のバックテストでは確認することが難しかった細かいところまで手が届くオリジナルのバックテストツールを作成できる。
- バックテスト結果を簡単にグラフ化やデータ分析を行なって可視化できる。
この記事は、以下の前回の記事の続きです。
取引履歴データの呼び出し
前回の記事では、df_ordersという取引履歴データを作成しました。
まずはこれを呼び出す処理から始めます。(前回までの処理で、「df_orders.pkl」という出力ファイルを保存していた前提です。)
df_orders = pd.read_pickle('/content/drive/My Drive/backtest/df_orders.pkl')
データは以下のようになっています。
buyポジションのみ抽出
df_ordersは、buy側、sell側、両方の取引履歴を保存しているデータでしたので、これをbuyポジション側のみのデータに加工します。わかりやすくするために、ひとまずbuyポジション側だけで処理を進めます。
df = df_orders
df_buy_orders = df[df['type'].str.contains('buy')]
この処理の説明ですが、「’type’というカラム(項目)の中で、’buy’という文字列が含まれるものを抽出する」という処理です。
ちなみにこの処理は、以下のように記載することも可能です。
df_buy_orders = df_orders[df_orders['type'].str.contains('buy')]
こちらの方が1行で書けるので分かりやすいという面もあるかもしれませんが、df(データフレーム)を加工する際は、いったんインプットのデータフレームをdfという名前で読み込んで、dfを加工する、という手続きを踏んだ方が、記載がシンプルでわかりやすくなります。(特にdfが何回も出てくる場合)
つまり、データフレームを加工している間は常にdfを使うということです。
加工した結果、df_buy_ordersは以下のようになります。
first_buy、nanpin_buy、buy_closeのみが取り出されていることが確認できます。
利益(profit)の確認
続いて、利益(profit)を確認してみます。
以下のように’buy_close’だけを取り出してみます。
ちなみに、これだけでも情報量は結構多いです。
例えば以下のレコードを確認してみると、
合計ロット数は0.19(lot=0.19)、平均価格は1673.59(price=1673.59)で、
現在価格が1673.91(bid=1673.91)で含み益が894円に到達した(profit=894)ので、
ポジションをクローズした。その時の利益は894円(profit=894)ということです。
df = df_buy_orders
df['profit'].sum()
損益グラフの確認
続いて、損益をグラフで確認してみます。
まずはシンプルに、以下の通り実行してみます。
df['profit'].plot()
1回のポジションクローズあたりの利益が何となく把握できるかと思います。160〜170円前後のものが多く、大きめだと800円を超えたものがあります。
続いて、累計損益グラフを作成してみます。
df = df_buy_orders
df['total_profit'] = df['profit'].cumsum()
df['total_profit'].plot()
ご覧の通り、右肩上がりのグラフが作成できました。1日を通して、利益を積み重ねていき、累計損益が8,801円になるまでの動きを表しています。
ただし、ここで注意しなければならないのは横軸が時間ではなく、オーダー(注文の回数)になっているというところです。
そこで、これをさらに整形していく工程に入ります。