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

概要

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