Reinforcement Learning + FX Trading Strategy

This post is based on my previous article written in Japanese.(http://nekopuni.holy.jp/?p=1231)

Summary

– Applying reinforcement learning to trading strategy in fx market
– Estimating Q-value by Monte Carlo(MC) simulation
– Employing first-visit MC for simplicity
– Using short-term and long-term Sharpe-ratio of the strategy itself as a state variable, to test momentum strategy
– Using epsilon-greedy method to decide the action

First-visit MC

1. Calculate the state at day t(state = Sharpe ratio one day before day t)
2. Decide the action according to the state(long position, no position or short position)
3. Update rewards matrix based on the reward obtained at next time step t+1
4. Update Q matrix once t is equal to the last time step T
Loop above procedure until you feel happy

Python code

This time daily USDJPY from FRED is used for simulation.
So-called swap point and any transaction costs are not included in this code so far.

Results

Still this code takes huge computation time for me so the results(Q matrix) below is done by only 1000 iterations.

For long position(action = 0)
140824_mc1000_long_top

For flat position(action = 1)
140824_mc1000_flat_top

For short position(action = 2)
140824_mc1000_short_top

As seen in the figures above, the Q-value is lower if we have relatively extreme medium-term Sharpe ratio(lower than -1 and higher than 1)
For long position the Q-value is highest if short-term Sharpe is somewhere between 0.5 and 1.0 whilst between -0.5 and -1.0 is the highest area for short position.
Presumably this code could be seen as modest momentum strategy although I think this is depending on the sample period

140824_average_cumulative_return

Figure above is the average of cumulative return for each episode with expanding window.
This seems to be converging a certain level.idk..

Further task

– Out of sample
See if this reinforce learning has explanatory power

– other market data such as other currency pairs

– improvement of the computation time
this code is very far from online-learning

強化学習+為替トレード戦略

概要

・強化学習をトレード戦略に適用するとこんな感じになるのかなというテスト。我流なので何やってんのpgrという場合も生暖かい眼で何卒よろしくお願いします(ヘッジ文言^^)
・モンテカルロをぶん回すことでQ-valueを推定します。
・今回は簡単のために初回訪問モンテカルロ(逐一訪問はめんどいのお)
・モメンタム戦略を試すため、状態として過去の自分自身のシャープレシオ(1ヶ月と3ヶ月)を使用しています。
・行動決定にはEpsilon-Greedy法

初回訪問モンテカルロ

いかんせん強化学習の学習自体が何をどう考えて良いか門外漢のため五里霧中+Pythonも同じく門外漢のため五里霧中のため、自身の勉強方法も探索しっぱなしという^^;;
これであってんのですかねえ

詳しくは参考文献[1]のP.134を見てケロというかんじなのですが、
・現在での状態を確認(状態=過去のシャープレシオ)

・その状態における行動価値をもとに行動決定(Epsilon-Greedy法)
・今回はロングポジション・ショートポジション・フラットの3つの行動から選ぶ

・次の期に得られる報酬をもとに、Rewardsマトリックスを更新

・エピソード終端まで来たら各状態行動対のQ値を更新

というフローを何回も繰り返し、Q値を推定していきます。

コード

Pythonは行列計算させたほうが良いとばっちゃも言ってますように、速度が断然違いますな(1つ1つfor文をネストして各要素にアクセスしていたのは内緒)

今回はドル円日次レートを用いています。RLMomentumのインスタンスを作成するときにファイルパスを指定してます。
当然のことながら、所謂スワップポイントや、取引コストは考慮していません。

とりあえずの結果

まだ計算が遅い(私の環境だとモンテカルロ1回しで1秒強くらい)ので、モンテカルロの回数を増やすと大変なことに。。
モンテカルロ1000回で、それぞれの行動に対するQ値を見てみると以下

・ロングポジションに対して
140824_mc1000_long

・フラットポジションに対して
140824_mc1000_flat

・ショートポジションに対して
140824_mc1000_short

3Dグラフを書くとどこかの業界から殴りこみが来そうな気がするので(^^)簡易的にz軸上から見下ろした感じでグラフを書いてみると以下
・ロングポジションに対して
140824_mc1000_long_top

・フラットポジションに対して
140824_mc1000_flat_top

・ショートポジションに対して
140824_mc1000_short_top

結果を概観すると(シミュレーションが正しいとすると(ここ肝心ですよ!!))、3ヶ月のシャープレシオが-1以下、もしくは1以上のときのQ値が相対的に低いですな。
ロングポジションに対してだと、1ヶ月のシャープレシオがやや高い(0.5~1.0)のときに、最もQ値が高くなっています。
一方で、ショートポジションに対しては逆に1ヶ月のシャープレシオがやや低い(-0.5~-1.0)ときにショートすると最もQ値が大きくなると判断しているようですね。

やや控えめなトレンド戦略という感じでしょうか。
期間にも寄ると思いますが。

140824_average_cumulative_return

で、申し訳程度に各エピソードの累積リターンの平均をexpanding windowで取っていくとこんな感じで、まあ収束しているような気がしなくもないのですがどうなんでしょうか。。。

今後の課題

・アウトオブサンプル
上記コード中のコメントアウトを外すと、学習期間と同じ期間に対して当該戦略を適用した場合のパフォーマンスが見られます。
ただ肝心なのはアウトオブサンプルでどうなのよという話

・ドル円以外の為替

・計算速度の向上
計算が遅すぎてオンライン学習にはまだまだほど遠いですなあ

まだ確認すべきことは盛り沢山ですがとりあえず本日は以上(― ―)

参考文献

Amazon.co.jp: 強化学習: Richard S.Sutton, Andrew G.Barto, 三上 貞芳, 皆川 雅章: 本
http://www.amazon.co.jp/dp/4627826613

O’Reilly Japan – バンディットアルゴリズムによる最適化手法
http://www.oreilly.co.jp/books/9784873116273/

mplot3d tutorial — Matplotlib 1.3.1 documentation
http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html

メモ: Online Algorithms in High-Frequency Trading

Online Algorithms in High-frequency Trading – ACM Queue
http://queue.acm.org/detail.cfm?id=2534976

内容としては、HFTで用いられているone-pass algorithmsというものの紹介。
HFTで使われている一般的な方法を、私は全く知らないのでこの記事の内容が正しいのかどうかはわからないですが。

NYSEでは1秒間に215,000回もクオートが更新されるらしく、それを適切にインプットしてトレードのための意思決定を行なわなければならない。かつ、それらを高速に処理する必要がある。

そのためには以下の計算が主に重要だとか。
・時系列平均のオンライン推定
・ボラティリティのオンライン推定
・単回帰の回帰推定のオンライン推定

日次データを元に計算するというタイムスケールではなく、マイクロ秒ごと(かは知らんが)に計算する必要があるので、過去データをいちいち読みに行ってはメモリが足らんし計算も遅いぞなもしとのことで、再帰的に計算できるように通常の移動平均などの計算式を少し変えておりますな。
また、メモリ上に保存する値も最小限にすると。
再帰的に計算できるようにすることで、過去データの情報は全て1つの値に集約させているというイメージですな。

HFTが具体的にどうやって実装されているのか情報が中々手にはいらないので、たとえ古い情報であったとしてもなかなか参考になるお話ということでした。

まあ最近は
高頻度取引事業が表舞台に-米バーチュがIPO申請 – Bloomberg
http://www.bloomberg.co.jp/news/123-N2AQC16JTSF201.html

高頻度トレーディングをNY州が調査、不当な優位性が焦点 – Bloomberg
http://www.bloomberg.co.jp/news/123-N2MZ8J6K50YJ01.html

といったお話もあり時々ニュースにもなるHFT業界ということで。
FOMCステートメント発表の数秒前に米債だか為替が反応するとかいうこともあるとかないとかw

参考

Online Algorithms in High-frequency Trading – ACM Queue
http://queue.acm.org/detail.cfm?id=2534976

HFT における Online one-pass algorithm – Sparsegraph DotCom
http://i.ho.lc/blog/2014/03/online-onepass-algorithm-in-hft/