Pythonと機械学習

Pythonも機械学習も初心者ですが、頑張ってこのブログで勉強してこうと思います。

バックテストの実施

決定木アルゴリズムを使って、取りあえず明日のBitcoin価格を予想することはできますが、本当にそれで利益を出すことができるのでしょうか?

過去のBTC価格データで検証してみました。
以下がバックテストを実施するコードです。


初期資金として$1000ある状態で、過去60日間のバックテスト結果です。
上昇シグナルが出た場合に手持ちの資金全額でBitcoinを購入し、下降シグナルが出た場合は何もしません。
ポジションは1日ごとに決裁します。また、スプレット(手数料等)は考慮していません。
バックテスト用のパラメータは、main関数内の以下で指定しています。

# --バックテストパラメータ
plotGraphFlag = 1  # バックテスト結果の資金グラフをプロットしますか?yes:1。no:0 
initialFund = 1000  # 初期資金
spread = 0  #取引スプレット(手数料)
backTestDays = 30*2 # バックテスト期間(日)

実行すると以下バックテスト結果と資金推移、BTC価格推移グラフを出力します。

-----------------------------------------
バックテストの実施
-----------------------------------------
※過去のデータから資金上昇率を算出します。上昇シグナル時に現物で買い。下降シグナル時は何もしません。ポジションは1日ごとに決裁します。
・トレーニングデータ数: 29
・トレーニングデータと教師データのセット数: 30
・バックテスト期間: 過去60日
・正答率(上昇時): 58.3%
・正答率(下降時): 54.2%
・資金上昇率: 43.2% (初期資金は$1000。最終資金は$1432.26078789。)
・BTC価格上昇率: 16.2% (初期BTC価格は$534.4530179。最終BTC価格は$621.11001143。)


f:id:darden:20160802223155p:plain

正答率(上昇時): 58.3%と悪くありません、答率(下降時): 54.2%も50%を超えています。資金上昇率: 43.2%とBTC価格上昇率: 16.2%よりも上回っています。
過去60日の結果では、BTCを保持し続けるよりも、このシグナルで取引した方が良かったという結果です。


スプレットを0.3%に設定して見ましょう。

-----------------------------------------
バックテストの実施
-----------------------------------------
※過去のデータから資金上昇率を算出します。上昇シグナル時に現物で買い。下降シグナル時は何もしません。ポジションは1日ごとに決裁します。
・トレーニングデータ数: 29
・トレーニングデータと教師データのセット数: 30
・バックテスト期間: 過去60日
・正答率(上昇時): 61.3%
・正答率(下降時): 55.2%
・資金上昇率: 27.2% (初期資金は$1000。最終資金は$1272.11808768。)
・BTC価格上昇率: 16.2% (初期BTC価格は$534.4530179。最終BTC価格は$621.11001143。)

f:id:darden:20160802223902p:plain

資金上昇率が27.2%と下がってしまいましたが、まだ行けそうです。

今度はもっと長期間(1年)で試してみましょう。スプレットは0%とします。

-----------------------------------------
バックテストの実施
-----------------------------------------
※過去のデータから資金上昇率を算出します。上昇シグナル時に現物で買い。下降シグナル時は何もしません。ポジションは1日ごとに決裁します。
・トレーニングデータ数: 29
・トレーニングデータと教師データのセット数: 30
・バックテスト期間: 過去365日
・正答率(上昇時): 56.8%
・正答率(下降時): 43.4%
・資金上昇率: 87.0% (初期資金は$1000。最終資金は$1870.22284971。)
・BTC価格上昇率: 121.8% (初期BTC価格は$280。最終BTC価格は$621.11001143。)

f:id:darden:20160802224356p:plain

正答率(上昇時): 56.8%と50%を超えますが、資金上昇率: 87.0%とBTC価格上昇率: 121.8%よりも下回っています。
現物を所持し続けたほうがよかったという結果です。

ちなみにスプレット0.3%で1年バックテストを実施すると資金はマイナスになってしまいます。
長期で見ると万能というわけではありません。

学習パラメータ("トレーニングデータ数"と、"トレーニングデータと教師データのセット数")を定期的に最適化する必要がありそうです。

ただ、よく見るとレンジ相場で下がってますし、単純に上昇トレンドに乗っているだけのようにも見えますね。

結局フォワードテストしてみないとよく分からないです。

Metatrader4のEAに組み込んでデモ口座で簡単にフォワードテストができればいいのですが。。。
BTC-eなんかはMetatrader4に対応していますし、少し調べて見ようかと思います。