バックテストの実施
決定木アルゴリズムを使って、取りあえず明日の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。)
正答率(上昇時): 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。)
資金上昇率が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。)
正答率(上昇時): 56.8%と50%を超えますが、資金上昇率: 87.0%とBTC価格上昇率: 121.8%よりも下回っています。
現物を所持し続けたほうがよかったという結果です。
ちなみにスプレット0.3%で1年バックテストを実施すると資金はマイナスになってしまいます。
長期で見ると万能というわけではありません。
学習パラメータ("トレーニングデータ数"と、"トレーニングデータと教師データのセット数")を定期的に最適化する必要がありそうです。
ただ、よく見るとレンジ相場で下がってますし、単純に上昇トレンドに乗っているだけのようにも見えますね。
結局フォワードテストしてみないとよく分からないです。
Metatrader4のEAに組み込んでデモ口座で簡単にフォワードテストができればいいのですが。。。
BTC-eなんかはMetatrader4に対応していますし、少し調べて見ようかと思います。