LoginSignup
74
93

More than 5 years have passed since last update.

機械学習を用いたオレオレFXシステムトレーディングプログラムのロジック解説

Last updated at Posted at 2016-07-29

"xgboostによる決定木アンサンブル学習でFXのシステムトレードするコードを書いた"
http://qiita.com/ryo_grid/private/757fa93fc479439b2676

の解説をまともにやってなかったのでロジックを解説します。
この内容は、

"ディープラーニングでFXのシステムトレーディングをするコードを書いた"
http://qiita.com/ryo_grid/items/7746528f8cae8026b936

とも基本的には共通(ただ回帰を行うアルゴリズムが異なるだけ)です。

ソースコードは以下です。
https://github.com/ryogrid/fx_systrade/blob/2ca1faf30620d65cf5768a5bd6353c656aeb51c5/xgboost_trade.py

■xgboostとは
こちらが詳しいです。
http://tjo.hatenablog.com/entry/2015/05/15/190000

要は、入力したデータ群から、「何か」を分類できる分類器ですね。
最近流行りの機械学習のライブラリです。
分類のルールを教師データから学習することができます。
なお、内部のアルゴリズムは決定木学習?をブースティング?でやっているらしいです。
ここらへんは私も勉強不足でそこまでちゃんと理解していません・・・。

■やっていること
テクニカル指標群+αを特徴量として入力し、回帰にって為替が上昇・下降するかの2値分類を行う。
この結果を主軸に、少し工夫してトレーディングを行っていく。

テクニカル指標群から予測を行うというアイデアですが、最初は移動平均線やボリンジャーバンドにタッチしたらうんぬんみたいなのを試していたのですが、うまくいかず、それであれば、わざわざ小難しいことしないで、過去の一定期間のチャートの情報を集約したテクニカル指標を見てやれば、チャートの動きも読めるのでは、と考えたのが経緯です。

■プログラムの流れ
1. 学習
過去の為替データからテクニカル指標群+αと入力期間から3足後が上昇するか下降するかを求めて、そのペアをたくさん作ってxgboostに学習させる。
過去に読んだ論文で、上下を反転させたチャートについても学習するとパフォーマンスが良くなると書いてあったので、そういうこともしています。

入力しているテクニカル指標群については下の記事で整理しています。
+αは、前日との差分や当日までのチャートのタイプ(私が定義したもの)です。

"シストレプログラムで特徴量として利用しているテクニカル指標を整理してみた"
http://qiita.com/ryo_grid/items/6bb1a95e47705c5ebdbb

チャートタイプの分類については下の記事を参照ください。

"オレオレアルゴリズムで時系列データ(為替データ)のおおまかな形状を分類してみた"
http://d.hatena.ne.jp/kanbayashi/20160301/p1

2.予測及びポジションの購入
学習の時と同じようにして入力データを作成し、予測を行います。予測結果はスカラ値として得られ、1に近いほど上昇する可能性が高く、0にちかいほど下降する可能性が高いことを示します。
この結果が閾値(High)より高ければ買いポジションを、閾値(Low)より低ければ売りポジションを持ちます。
これが基本的な考え方ですが、他にもボラリティが高い場合は見送る、現時点までのチャートタイプが大体単調での減少か、増加ではないと見送るといった条件が加えられています。買いポジションを持つ場合は過去のチャートが減少タイプでないとならず、売りはその逆といった条件になっているので、このロジックは逆張りを狙った動作をするものだと言えます。
なお、ポジションは全資産を用いて購入し(レバレッジ1倍)ます。このため、上記プログラムは複利で資産が変化します。
また、ある時点でポジションは最大1つしか持ちません。

3.決済
決済は購入後常に試みます。その際にチャートタイプが大体単調増加・減少であれば決済します。この際、勝ち負けは見ておらず、どちらであっても決済してしまいます。

■バックテストの結果(参考)
USDJPYで、スプレッド0.3銭、レバレッジ1倍、初期資金100万円で上記プログラムを動作させた結果が、資産推移は以下のようになりました。学習期間が2001年~2002年冒頭、バックテスト期間がそれから2008年末までです。データは5分足です。

ベースライン(同じタイミングで全て買いポジを購入した場合)
all_long.png

ベースライン(同じタイミングで全て売りポジを購入した場合)
all_short.png

xgboostで予測した方のポジを購入した場合
1093c81c770524e53e0ee4acc883d05e.png

■余談
一番上の記事のリンク先を見てもらえば分かりますが、試行錯誤の途中で意図しない動きをするコードを書いてしまった際に上記の決済ルールを見つけました。バグから有効なトレードルールが見つかるというのは興味深いですね。

■お願い
上記のgithubリポジトリをcloneしてきて、必要なライブラリをインストールすればすぐ動かせるようになっています。
改良してプルリク等もらえたら、うれしいです。
その他にも、コメント欄でのアドバイスやコメントなども歓迎します。
よろしくねがいいいたします。

■謎
動かしてみると買いポジ保有が圧倒的に多く、売りポジ保有が行われることはあまりありません。
これはなぜなのかは未だよくわからず。逆張りの場合、買いの方が読み易い傾向にあるってことなのかなあ。

74
93
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
74
93