メモ: multiprocessingを使うまで

概要

・並列処理が可能なMultiprocessingモジュールの使い方をメモる

Pythonコード

cpu_count()でコア数を取得できる。コア数4で計算。
apply_async()でタスクを渡して、get()で実行結果を取得する。
asyncという名前が付いているように、終わり次第その結果を取得するようだ。ただしget()で結果を抽出するとタスクを渡している順番に結果が帰ってきてるように見える。

実行結果

ということで5.97秒の処理が3.23秒に短縮されている。

参考

Parallel Programming in Python
http://sebastianraschka.com/Articles/2014_multiprocessing_intro.html

Pythonのmultiprocessing.PoolでExceptionを受け取る – conta’s diary
http://conta.hatenablog.com/entry/2013/12/20/231430

強化学習を使って迷路を学習

概要

・迷路の状態価値を学習させるよくあるパターン
・Q学習を使って学習、政策の選択(どっちの方向に移動するか)はとりあえずランダム
・学習してるっぽいのでRのanimationパッケージを使って学習の様子を可視化
・エージェントかわいい

やってること

久しぶりの強化学習シリーズ。書いている本人もすっかり内容を忘れているので、思い出しがてら迷路を探索してみる。
基本的には迷路内をランダムに移動しながらゴールを目指す。ゴールに到達すると大きな報酬(rewardGoal)がもらえる。それ以外のマスでは1マス歩くごとに-1の報酬(懲罰)がもらえる。これにより、より早くゴールに達することができるマスの状態価値は高いと学習されるはず。

移動方法はとりあえずランダム。壁にぶつかる方向に進まないように無理矢理調整しているがそれ以外はランダム。
本来ならば、学習した状態価値を元に、最適と思われる方向に進むGreedy法(もしくはEpsilon-Greedy法)の方が良いのだろうけど、とりあえず年末休暇で蜘蛛の巣が張っている自分の脳みそにリハビリが必要なのでここは次回以降手を加える予定

最後に、学習している過程を可視化するためにanimationパッケージを使って状態価値の推移をanimation gifで出力する。

使った迷路

下記コードにあるisWallを適当にプロットしたもの。コの字型になっている迷路。
右下の角をスタート地点、左下の地点をゴール地点に設定しています。
R内のマトリックスの行列の方向と、プロットの縦横の方向が異なるので見づらい(つらい)
141227_meiro

Rコード

animationパッケージはImageMagickが必要なので、適宜インストール。
このコードはMacで作成したので、パスの設定もそれ用になっています。
状態価値が更新されなくなったら学習終了と判断し、ループをbreakしています。
一応、迷路の形とスタート・ゴールを正しく指定すれば任意の形で動くはず。。。

結果

ということで、学習終了後の状態価値をプロットしたのが以下。
左下のマスがゴールだったので、その周辺のマスの価値が高いことを表しています。
(ゴールのマスに終了したら終了なので、ゴールマスの状態価値はゼロのまま)

学習回数は10回もせずに終了するイメージ。ランダムウォークなので場合によりますが。
141227_result

アニメーション

ゴール手前からバックワードに学習されているのが分かります。
エージェントかわいい
141227_animation

参考

強化学習をベイズで理解する
https://www.sat.t.u-tokyo.ac.jp/~mak/20140319-makino.pdf

二次元ヒートカーネル(熱核)の時間発展の可視化 – My Life as a Mock Quant
http://d.hatena.ne.jp/teramonagi/20141226/1419590864
-> animationパッケージの参考

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

Bloombergで取得したデータをxts形式に変換

概要

・Bloombergで取得したヒストリカルデータ(csvに保存)をxts形式に変換する

Rコード

Bloombergで取得した(date, value)のマトリックスをRで使うときにいつもググりながら適当にやっている気がするのでメモ。
dateはexcelのシリアル型で入っているので、それもxtsが扱えるように変換する

xtsの日付を指定する際にoriginを設定するのがミソの模様。
さらにライブラリのlubridateを使うと日付の処理で更に幸せになれるけどそれはまた別のお話。

SABRモデルのボラティリティスマイルwebアプリを作る

概要

・SABRパラメータとボラティリティ・スマイルの関係をインタラクティブに分かるように
・ShinyのwebアプリホスティングサービスのShinyAppsを使ってみる

Shinyapps

Shinyの使い方については既に様々なサイト・資料様で解説されておりますので割愛。私は参考1を参考に今回のコードを組んでいます。

で、

Shinyは基本的にはスタンドアローンなwebアプリを作るもので、お気楽に世間様に公開することができません(知らないだけ?)。そんなときに使えるのがShinyappsとなるわけですな。

ShinyApps.io
https://www.shinyapps.io/

無料で使用する場合には50 Active Hoursという制限があるようなのですが、まあ個人で試してみる程度なのでキニシナイ。
サインアップ後に

と言った感じにRでコマンドを打っていくとShinyAppsを使う環境が整います。というかサインアップ後にログインするとそういう指示が書かれてる。

Rコード

Apps自体のアップ先はこちら
http://nekopuni.shinyapps.io/141206_sabr

ui.r

server.r

実行用スクリプト

実行用スクリプトを実行すると、別ウィンドウで以下の画像のようなページが表示されます。
(macならRStudioの別ページ、windowsならブラウザの新規タブか何かで開くようです。)
ページ左のスライドでSABRモデルのパラメータを動かすと、右側のボラティリティ・スマイルも更新されます。
141214_1

ちなみにShinyをローカルで使用するには

で起動することができます。

パラメータとスマイルの関係

・Alpha
→ スポットのボラティリティということで、Alphaが大きくなるほどスマイルも全体的に上方に移動

・Volatility of volatility
→ 原資産のボラティリティがどの程度変動するか。volvolが大きいほどスマイルのウィングが上方に移動。
感覚的には、volvolが大きいほど、OTMになりやすくなるからという感じですかなあ
OTMのvolga(ボラティリティの2階微分)が正であることと対応してるという理解

・Rho
→ 原資産とボラティリティの相関。一般的には原資産が下落する局面でボラティリティが上昇するので相関は負を取りやすい。スマイルのスキューに対応し、グリークスで言うvannaに対応

・Beta
→ betaが1でlognormal volatility、beta が0でnormal volatilityとなる。ベータが大きいほどスマイルは上方に移動する。

参考

はじめてのShiny
http://www.slideshare.net/wdkz/shiny-16178934

ggplot in a function #rstats

Summary

– ggplot in a function doesn’t work properly in a default fashion
– you need to use cbind.data.frame in making dataframe instead of data.frame

R code

Probably this code is a natural way of making ggplot figure:

Of course this returns the figure correctly.
141210_1

However once you embedded the similar code into a function, it returns the error

This returns:

It seems ggplot() cannot access the column properly when in a function. To avoid this issue, you’d better use cbind.data.frame instead.

141210_2
Now you have got the right figure.