<基礎学習>機械学習、DeepLearningを使わずにFXの分析をしてみた(2)

以下前回記事の続きです。
kurupical.hatenablog.com

概要

  • 未知のデータに対して予想できるようにした
  • 「次の日上がるか下がるか」ではなく、「N%上がるが先か下がるが先か」を当てるようにした
  • いろんなパラメータをグリッドサーチ(総当たり)した

目次

  1. 前回の反省
  2. 予想の対象を変更
  3. 与えるパラメータ
  4. 結果、考察
  5. 今後

1.前回の反省

前回の記事の「2-2.セグメントの組み合わせ」で正解率を出し、このトレードアルゴリズムは使えそうだ・・・と思ったのですが、初歩的なミスがありました。
「未知のデータに対する検証をしていない」ことです。

このアルゴリズムは未来においても有効なのか?を示す必要があります。

f:id:kurupical:20180418193502p:plain

前回の考え方は、集計に使うデータと性能評価に使うデータが同じでした。
そのため、その期間の値動きに特化した予想になってしまいます。たとえ、性能評価をして勝率が高かったからといって、未来(未知)の値動きに対応できるかは保証できません。

ですので、このような考え方にしました

f:id:kurupical:20180418193944p:plain

上記の図は、
(1) 2016/1〜2016/6のデータで集計をし、2016/7〜2016/9の値動きで性能評価を行う
(2) 2016/4〜2016/9のデータで集計をし、2016/10〜2016/12の値動きで性能評価を行う



と最新のデータまで続け、それぞれで行った性能評価を集計し、アルゴリズムの性能評価とします。
これで、「未知のデータに対する性能評価」を行うことができます。
・・・いろいろDeepLearningとか機械学習をやってるのに我ながら信じられないミスでした。笑

2. 予想の対象を変更

2-1. 前回までの予想対象とその難点

前回は、「過去の1時間足のチャートの各種データをクロス集計して、次の1時間で上がるか下がるか」を予想するプログラムでした。
このアルゴリズムには難点があります。

1時間足なので利幅が少ない→手数料負けしがち
以下を仮定します。

  • ドル円で1時間で動く値幅の平均が5pips(0.05円)だとします。
  • 取引にかかるコストは一定で、0.4pipsとスリップ幅0.6pipsみて1pips(0.01円)。

この場合、勝てば5 - 1 = +4pips、負ければ -5 -1 = -6pipsとなります。
期待値プラスになるための勝率を { \displaystyle p }と置くと、

{ \displaystyle
4*p + (-6) * (1-p) > 0
} を満たす必要があります。

これを解くと、{ \displaystyle p > 0.6 }が求まります。
60%の勝率を保ってイーブンというのはかなり厳しいですね。

2-2. あたらしい予想対象

なので、次の1時間であがるか下がるかではなく、「N%上がるかN%上がるかどっちが先か」を予想することにしました。
そうすることで、利幅を自分で決めることができます。
たとえば、

  • N=0.5%(ドル円だとおおよそ50pips(0.5円)

この場合、先ほどの計算を考えると、勝てば 50-1=+49pips、負ければ-50-1=-51pipsとなります。
同様に期待値がプラスになるための勝率を以下式により求めます。

{ \displaystyle
49*p + (-51) * (1-p) > 0
}

これを解くと、{ \displaystyle p > 0.51 }が求まります。
51%の勝率であればなんとかなりそうですね。

3.与えるパラメータ

あとは、パラメータを試行錯誤するだけです。
以下のパラメータを調整しました。

  • 前回記事2-1.優位性のありそうなセグメントの抽出
    • 必要なデータ量(前回記事のa)
    • クロス集計の偏り具合(前回記事のb) (e.g. MA25=0.9975/MA75=1.0025の場合60%の確率で「N%下がるが先」)
    • 組み合わせ数(前回記事のc)
  • 予想する値動き幅N%
  • 値動き集計、性能評価に使うデータの期間
  • チャートの足(15分足、30分足、1時間足、2時間足)

4. 結果と考察

4-1. 結果

1時間足で5年分検証した結果が下図です。
f:id:kurupical:20180418202101p:plain:w500
縦軸の黄色で塗りつぶしているのが「勝率」、その右隣が「取引件数」です。

4-2. 考察

4-2-1. 数字だけを見る

勝率が1(=100%)になっているものもありますが、取引件数が少なすぎるので信用できません。
大数の法則からも、1000件以上あるデータで上から探していくと...
赤文字で塗っている行が、なんと1420回取引して勝率79%。
む、無敵だ・・・

早速採用!!と思いましたが、11月に作ったDeepLearningのアルゴリズムをろくすっぽ検証もせず取引したらアルゴリズムの考え方がバグっていて、5000円を失ったことを思い出しました。。
今回は注意深く。
念のため、月ごとの取引件数を勝率を見てみました。

f:id:kurupical:20180418202817p:plain:w500

なんと。。2016年から全く取引してないです。
これじゃ使えませんね。(過学習とはいえ、2014/4〜2014/6で200回トレードの勝率100%なのは驚異的です。なんかバグってそう・・・)

他の勝率高いデータも確認してみましたが、特定月に取引が偏っているものが多く、実運用はできそうにないものが多かったです。
全部のデータについて取引の分布をしらみつぶしに見ていくのはしんどいので、集計に工夫をしました。

4-2-2. 取引件数のばらつきを考慮してアルゴリズムを選定する

集計を以下のようにしました。

f:id:kurupical:20180418204307p:plain:w500

右側に、月ごとの取引件数の平均と標準偏差を取りました。
標準偏差が低い=月ごとの取引件数にばらつきが少ないということになります。
このデータで、「勝率60%以上、取引件数1000件以上」で標準偏差が低い順に並べてみました。

上2つのデータについて、月ごとの取引回数を確認してみます。
f:id:kurupical:20180418204004p:plain:w500
[f:id:kurupical:20180418210021p:plain:w500
] 2個目は特になかなか安定してそうです。
1個目は利幅0.5%、2個目は利幅0.1%に設定しているので、2.で説明した「必要な勝率」が違うことに注意が必要です。
勝率やグラフは2個目のグラフがキレイですが、実際どちらが利益を生むかは別問題です。

5. 今後

いろいろなパラメータでチューニングして、「利幅」と「勝率/取引のばらつき」が一番良いものを選びたいと思います。
仮想通貨にも同じアルゴリズムを適用してどうなるかもあわせて検証しています。

あとは、「資金管理」についても考えていかなくては・・・。