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

メモ: タプルのリストから任意の列を返す

概要

・MySQL.connectorを使うと実行結果がタプルのリストとして返ってくる。その返り値から任意の列を抽出する方法

mapを使う

結論から言うとmapを使えばfor文を回さずに取得できる
mapは第2引数が対象となるリスト、第1引数に対象となるリストの各要素に対して実行する関数を指定する。
無名関数を使う場合はlambda式に書けばよい。下記は1列目を返す例。

参考

map, reduce, filterによるシーケンス操作 » Python Snippets
http://python.civic-apps.com/map-reduce-filter/

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

概要

・強化学習をトレード戦略に適用するとこんな感じになるのかなというテスト。我流なので何やってんの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

メモ: for文入れ子

概要

・複数のfor文を入れ子にせず、1行で書く方法

コード

実行結果は以下

参考

Python で組み合わせや順列を得るときは itertools を使う | CUBE SUGAR STORAGE
http://momijiame.tumblr.com/post/68655902597/python-itertools

10.1. itertools — 効率的なループ実行のためのイテレータ生成関数 — Python 3.4.1 ドキュメント
http://docs.python.jp/3/library/itertools.html#itertool-functions

Decompose option PnL into its greeks

Summary

– Decomposition option PnLs into its greeks by using Taylor expansion
– Major greeks attribute to daily PnL are delta, gamma, theta and vega

Taylor expansion

An arbitrary function \( f \left( x \right) \) can be written by below formula:

$$
f \left( x \right) = f \left( a \right) + f^{\left( 1 \right)} \left( a \right) \left( x – a \right) + \frac{f^{\left( 2 \right)} \left( a \right)}{2} \left( x – a \right)^2 + {\rm higher}.
$$

The option present value \( V_t \left( S_t, T, \sigma_t, r_t \right) \) is expressed with its derivatives(option greeks) in a similar manner:

$$
V_t \left( S_t, \tau_t, \sigma_t, r_t \right) = V_{t-1} \left( S_{t-1}, \tau_{t-1}, \sigma_{t-1}, r_{t-1} \right) + \\
\frac{{\partial}V}{{\partial}S_{t-1}}{\rm d}S + \frac{{\partial}V}{{\partial}\tau_{t-1}}{\rm d}\tau + \frac{{\partial}V}{{\partial}\sigma_{t-1}}{\rm d}\sigma + \frac{1}{2} \frac{{\partial}^2V}{{\partial}S_{t-1}^2}{\rm d}S^2 + {\rm residuals},
$$

where \( S_t \) is underlying, \( \tau \) is time to expiry, \( \sigma \) is volatility and \( r \) is interest rate respectively. Usually the effect of the interest rate sensitivity(rho, PV01 sensitivity for swaptions) is limited and included to the “residual” term as well as other higher derivatives.
Daily PnL \( R_t = V_t – V_{t-1} \) is hence written by below formula:

$$
R_t \approx \Delta_{t-1}{\rm d}S + \theta_{t-1}{\rm d}\tau + \nu_{t-1}{\rm d}\sigma + \frac{1}{2} \Gamma{\rm d}S^2.
$$

If you consider stochastic volatility model such as SABR, above equation also holds sensitivity terms to that parameters(volvol, beta, rho). Furthermore, other related greeks including forward-delta, forward-gamma, normal-vega can be applied above interchangeably.

Reference

Taylor series – Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Taylor_series

Riding the Swaption Curve by Johan G. Duyvesteyn, Gerben J. De Zwart :: SSRN
http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2008841