強化学習+為替トレード戦略(その2)

概要

・強化学習シリーズその2
・Epsilon-greedyのEpsilonに対する感度分析
→ とりあえずEpsilon=0.1でやろうと思うがQ値が収束していなさそう。。より早く収束させる方法が求められる
・学習させたQ値に対して汎化能力をテストできるようコードを追加
→ 学習期間と同じ期間に対してテストするも微妙な結果に

Epsilonに対する感度分析

相変わらずこのシミュレーション方法で合っているのかすら謎シリーズとも言いますが^^

・Epsilon = 0.5
Q値
赤マスはロングポジションが最適な状態、グレーはフラットポジション、青色はショートポジション。以下同様。
q_ep0.5

各エピソードの累積リターンのエルゴード平均(expanding window)
c_ep0.5

・Epsilon = 0.1
Q値
q_ep0.1

各エピソードの累積リターンのエルゴード平均(expanding window)
c_ep0.1

・Epsilon = 0.05
Q値
q_ep0.05

各エピソードの累積リターンのエルゴード平均(expanding window)
c_ep0.05

・Epsilon = 0.01
Q値
q_ep0.01

各エピソードの累積リターンのエルゴード平均(expanding window)
c_ep0.01

まあどれも累積リターンはなんとなく収束しているようなイメージですが、Q値がシミュレーションを回す度に変わるので、Q値がまだ収束していなさそうな雰囲気。ここは工夫が必要なんですかな。状態数が増えるとなおさらですし。

で、それぞれを比較してみると以下
ep_ret

ep_std

ep_ratio

上から、累積リターンの平均、標準偏差、平均/標準偏差を表しています。
リターンに関しては、探索の頻度(=Epsilon)を上げるほどある程度早く収束しているような気がしなくもない結果に。
ただし収束のレベルはEpsilonによってまちまちという感じ。
平均/標準偏差の比率でみると、0.1がもっとも高くなっておりまして、収束レベルが大きくかつそのばらつきもそれなりに小さい感じなんですかね。Epsilon=0.5とかにすると平均リターンも大きくなりますが、それのばらつきも大きくなってしまうということで比率に直すとそこまで良いというわけでもなく、ここはバランスなんですかな。

ということでEpsilon-Greedy以外のやり方もあるかとは思いますが、とりあえずEpsilon=0.1で今後は進めていこうと思います。

汎化能力のテスト

汎化能力と言いつつ、とりあえず学習期間と同様の期間にテストしてみます。
具体的にはモンテカルロを1000回まわしたあとに得られたQ値を元に、グリーティー方策で同じ期間を運用した場合の結果。

・2011年
testRet: 当該期間に買い持ちだった場合の結果
testMomentum: 当該期間に学習されたQ値を用いたグリーディー方策による結果
test2011

・2012年
test2012

・2013年
test2013

微妙ですな。

コード

loadData関数はFREDから対象ティッカー対象期間のデータを抽出するオレオレ関数です。
今回のシミュレーション対象もドル円(dexjpus)
複利型強化学習(参考文献2)なんてのもあるらしく、複利型でもシミュレーションできるようにしてますがまだうまく考察できてないのでペンディング。
self.isCompoundをTrueにすれば複利型になります。

メモ

やはりシミュレーションの度にQ値が変わるというのがやっかいでして、モンテカルロの回数を上げるというレベルを上げて物理で殴るという方法も考えられますが、もう少し見なおした方が良さそうですね。

また、状態に関してもとりあえず自分自身の長期と短期のシャープレシオを見ていますが、その背景の考えとしては、「今までワークしていた方法が今後もワークする」というまさに順張りのそれがありまして果たしてそれで十分かって話ですね。

今は20営業日と60営業日を見ていますが他のウィンドウで見ても良いですし、他の通貨ペアのパフォーマンスを見ても良いわけですしね。

参考文献

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

松井 藤五郎:複利型強化学習, 人工知能学会論文誌,
26(2):330–334 (2011)
https://www.jstage.jst.go.jp/article/tjsai/26/2/26_2_330/_pdf

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/