多層NNを用いたオーバーフィッティング改善の試み（１）


#はじめに
オーバーフィッティングの原因として次のようなものがある。

・相場において大きな値動きが発生した場合、それを捉えるように最適化を行うとそれ以降の相場において同様の値動きが発生しない限り、大きな損失を引き落とす

今回は多層ニューラルネットワーク（以降多層NN）を使い、上記の事象による最適化を減らす事に注目してオーバーフィッティングの改善に取り組んでいきます。

#従来手法と提案手法
従来手法と提案手法の概要を図1、図2に示します。


![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/137627/8f9e4df6-65ee-c3be-ffc2-7bf6f95ad329.png)
　　　　　　　　　　　　　　　　　　　　　図1: 従来手法の概要

![キャプチャ１.PNG](https://qiita-image-store.s3.amazonaws.com/0/137627/6d9f9394-2ab7-1193-9bda-9121e999bba6.png)
　　　　　　　　　　　　　　　　　　　　　図2: 提案手法の概要

図1は過去直近1年間を最適化期間として適応度が一番高い取引戦略を選択、その取引戦略を使い1年間で取引を行っていくという方法です。[前々回の記事](http://qiita.com/KUKDfhia/items/531131a61ee83db6ae69)におけるシミュレーションをそのまま1年間に拡張したものと考えてもらえたら分かりやすいと思います。

一方、図2の方は過去直近1年間を最適化期間にするのは変わりませんが、1年間を1ヶ月×12に分け、それぞれの期間で最適化を行い適応度の高い取引戦略を出していきます。そのため、計12個の取引戦略とそれに対応する適応度が算出されるので、それを多層NNを用いて学習させます。学習後は学習結果である結合荷重の値を使い最も適応度が高い取引戦略を選出、その取引戦略を使い、1年間で取引を行っていきます。

#多層NNを用いる意図
多層NNを用いて学習させる事の意味ですが、これはパターン学習により過剰に最適化を行ってしまった取引戦略の適応度を平滑化する事を狙いとしています。相場の多くは動きが緩やかなレンジ相場であるため、その相場で最適化を行っても取引戦略の適応度はそれほど高くはありませんが、トレンド相場で最適化を行うと、取引戦略の適応度はものすごく高くなります。通常の最適化ではトレンド相場で最適化を行った取引戦略が選ばれるのに対し、多層NNでレンジ相場における取引戦略の最適化も加味する事で全体で平滑化、場合によってはレンジ相場での取引戦略が選択されるようになります。レンジ相場はトレード期間においても発生する可能性が高いため、その取引戦略を用いる事でオーバーフィッティングを改善出来ると考えました。

![キャプチャ８.PNG](https://qiita-image-store.s3.amazonaws.com/0/137627/9fce2fec-92a7-98db-5872-6f6a2c0c8f86.png)
　　　　　　　　　　　　　　　　　　図3: 多層NNを用いた取引戦略選択の概要



#使用する取引戦略
今回、使用する取引戦略ですが、[前々回の記事](http://qiita.com/KUKDfhia/items/531131a61ee83db6ae69)で用いた取引戦略にフィルタとしてエンベロープを追加したものを使う事にします。フィルタは必ず取引戦略に使用するものとし、テクニカル指標で用いるパラメータは全て固定したものを扱います。詳細は以下の通りです。

　　　　　　　　表1: テクニカル指標で用いたパラメータ

|指標|パラメータ|
|:-----------:|:------------:|
移動平均（SMA）|短期:13　長期:26|
RSI | 日数:14 |
チャンネルブレイクアウト |仕掛け時の日数:20　手仕舞い時の日数：10|
ボリンジャーバンド |日数:21　係数:2.0|
エンベロープ |日数:50　係数:0.1|

　　　　　　　　　　　　　表2: テクニカル指標を使った取引戦略のシグナル

|指標|仕掛けシグナル|手仕舞いシグナル|
:---:|:---:|:---:
移動平均（SMA） | ゴールデンクロスで買いポジション、デッドクロスで売りポジション | ゴールデンクロスで買い決済、デッドクロスで売り決済  |
RSI | RSIが70以上で買いポジション、30以下で売りポジション | RSIが70以上で買い決済、30以下で売り決済 |
チャンネルブレイクアウト | 現在の価格が過去n日間の高値を上回った時に買いポジジョン、現在の価格が過去n日間の安値を下回った時に売りポジジョン | 現在の価格が過去n日間の高値を上回った時に買い決済、現在の価格が過去n日間の安値を下回った時に売り決済 |
ボリンジャーバンド | バンド上限を上回った時に売りポジション、バンド下限を下回った時に買いポジジョン | バンド上限を上回った時に売り決済、バンド下限を下回った時に買い決済  |

　　　　　　　　　　　　　　　　　　　表3: フィルタで用いた条件

|指標|買い条件|売り条件|
:---:|:---:|:---:
エンベロープ | 2本前の終値が下位線を下回った時に仕掛け（買い）シグナルと手仕舞い（買い）シグナル適用 | 2本前の終値が上位線を上回った時に仕掛け（売り）シグナルと手仕舞い（売り）シグナル適用  |


#評価方法
最適化の評価方法ですが、今回は従来手法、提案手法共に取引回数と損益と最大ドローダウン（以降最大DD）を合わせた次の指標を用います。理由は損益だけではトレード期間の最終結果しか見ていないため、取引途中に大きな下落があったとしても良い評価になってしまうのを避けるためです。

Fitness=((損益/最大DD)+1)*C(t)

ここでC(t)は取引回数が少なく利益が上げられている取引戦略に対して適応度を補正する関数です。Tkを取引回数、Tminを予め決めておいた取引回数の下限とし、次式のように定義する事にします。

C(t)=1　(Tk>Tmin)
C(t)=Tk/Tmin　(Tk<Tmin)

#シミュレーション設定
今回は取引戦略のパラメータが固定されている事もあり、組み合わせは4*4=16通りであるため、MT4で全ティックを選択し、総当たりで最適化を行っていきます。また、最適化期間（提案手法であれば学習も含める）で行うシミュレーションをバックテスト（以降BT）、トレード期間で行うシミュレーションをフォワードテスト（以降FT）と呼ぶ事にします。シミュレーションを行う条件は以下の通りになります。

　　 表4: シミュレーション条件（従来手法）

|項目|内容|
|:-----------:|:------------:|
通貨ペア|USD/JPY|
売買ロット|1万米ドル|
許容スリップページ|0|
時間足|30分足|
Tmin|60|
期間1(BT)|2011/01/01～2011/12/31|
期間1(FT)|2012/01/01～2012/12/31|
期間2(BT)|2012/01/01～2012/12/31|
期間2(FT)|2013/01/01～2013/12/31|
期間3(BT)|2013/01/01～2013/12/31|
期間3(FT)|2014/01/01～2014/12/31|

　　　　　　　　 表5: シミュレーション条件（提案手法）

|項目|内容|
|:-----------:|:------------:|
通貨ペア|USD/JPY|
売買ロット|1万米ドル|
許容スリップページ|0|
時間足|30分足|
Tmin|5|
期間1(BT)|2011年の相場を1ヶ月毎に区切って最適化、学習|
期間1(FT)|2012/01/01～2012/12/31|
期間2(BT)|2012年の相場を1ヶ月毎に区切って最適化、学習|
期間2(FT)|2013/01/01～2013/12/31|
期間3(BT)|2013年の相場を1ヶ月毎に区切って最適化、学習|
期間3(FT)|2014/01/01～2014/12/31|

#シミュレーション結果
従来手法と提案手法で選択された取引戦略を表6と表7、その取引戦略を用いて取引を行った結果を表8と表9に示す事にします。

　　　　　　　　　　　　　　　　　表6: 選択された取引戦略（従来手法）

|---|期間1(BT)|期間2(BT)|期間3(BT)|
|:-----------:|:------------:|:------------:|:------------:|:------------:|
仕掛けシグナル|RSI|チャンネルブレイクアウト|移動平均|
手仕舞いシグナル|チャンネルブレイクアウト|ボリンジャーバンド|チャンネルブレイクアウト|

　　　　　　　　　表7: 選択された取引戦略（提案手法）

|---|期間1(BT)|期間2(BT)|期間3(BT)|
|:-----------:|:------------:|:------------:|:------------:|:------------:|
仕掛けシグナル|移動平均|チャンネルブレイクアウト|移動平均|
手仕舞いシグナル|RSI|ボリンジャーバンド|移動平均|


　　　　　　　　 表8: 従来手法の取引結果

|---|期間1(FT)|期間2(FT)|期間3(FT)|
|:-----------:|:------------:|:------------:|:------------:|:------------:|
取引回数[回]|90|108|52|
損益[$] |-65.70|-1382.80|-773.72|
最大DD[$] |719.67|1476.78|1003.81|
勝率[%]|58.89|71.30|51.92|
RF(=損益/最大DD)[%]|-0.091|0.936|-0.771|


　　　　　　　　 表9: 提案手法の取引結果

|---|期間1(FT)|期間2(FT)|期間3(FT)|
|:-----------:|:------------:|:------------:|:------------:|:------------:|
取引回数[回]|65|108|38|
損益[$] |-727.71|-1382.80|-1112.42|
最大DD[$] |903.74|1476.78|1382.66|
勝率[%]|56.92|71.30|52.63|
RF(=損益/最大DD)[%]|-0.805|0.936|-0.805|

表6と表7を比較してみると、期間2以外は従来手法と提案手法で別の取引戦略が選択されている事が分かると思います。学習によりトレンド相場に対して過剰に最適化された取引戦略の適応度が平滑化されている事の証拠であるため、狙い通りの学習が出来ました。しかし、実際にその取引戦略を用いて取引を行っても利益が得る事はありませんでした。利益が出なかった原因としては次の事が考えられます。

・レンジ相場では底と天井の差が小さいため、大きな利益が得られない
・トレンド相場で大きな損失を出してしまっている
・パラメータが固定されている

上記の中でも特に強調したい点がパラメータが固定されている事です。どのような取引戦略においてもパラメータが固定されていればそのパラメータによって適した相場、適さない相場があるため、トレード期間を通して効率よく利益を上げるためにはパラメータを変化させる必要があると思いました。逆にパラメータを固定してこのやり方を通す場合は取引戦略の種類をもっと増やす必要があると思います。仕掛けシグナル、手仕舞いシグナルはもちろんの事、フィルタやリミット（利食い）、ロスカット（損切り）等も最適化の対象にすれば多少は利益の向上が見られると考えます。


#むすび
今回は取引戦略の選択に多層NNを用いてオーバーフィッティングの改善に取り組んできました。結論を言うと、今回のやり方ではオーバーフィッティングを改善する事が出来なかったため、次はテクニカル指標のパラメータに注目、出来れば再び多層NNを用いて引き続きオーバーフィッティングの改善に取り組んでいこうと思います。

#使用したプログラム
今回は多層NNのプログラム2つ（学習用と予測用）とMT4のプログラム（取引戦略）を用いました。多層NNの方は[前回の記事](http://qiita.com/KUKDfhia/items/3732bc3542a0bf7802d5)で使ったプログラムをそのまま使用しているため、[前回の記事](http://qiita.com/KUKDfhia/items/3732bc3542a0bf7802d5)を参照してください。MT4のプログラムは以下にアップロードしているので興味のある人は見てください。

https://gist.github.com/KUKDfhia/8ae498a2ca5ce2bfd4e05dd2df26d1ed