xiangze's sparse blog

機械学習、ベイズ統計、コンピュータビジョンと関連する数学について

Python for Financeという本

ipython notebookを使って出版されたらしいPython for Financeという本を読みました。
numpy, scipy, pandas, PyMC3をはじめとしたPython数値計算、解析系のパッケージを使った金融工学の計算事例と自作ライブラリについての紹介になっています。


Python for Finance: Analyze Big Financial Data

Python for Finance: Analyze Big Financial Data

http://shop.oreilly.com/product/0636920032441.do
https://books.google.co.jp/books?id=7tzSBQAAQBAJ&printsec=frontcover&hl=ja&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false

著者Yves Hilpischさんは金融業界向けに特化したPythonの実行環境Python Quant,
http://www.pythonquants.com/
とライブラリDX Analysis
http://dx-analytics.com/
の作者でその紹介、説明としての側面があります。
コードは
https://oreilly.quant-platform.com
にあります(ダウンロードに登録が必要なようです)。

内容

1〜3章はPythonそのものとNumpyなどのよく使われるライブラリの紹介
4〜14章では数値計算モデリングと結果の可視化に使われるライブラリの紹介
15〜18章では DXライブラリでのオプションの価格とリスク計算の実例が説明されています。

1〜3章

Pythonが選択される理由として科学技術計算ライブラリの豊富さとipython notebookでの情報共有を挙げています。
色々なライブラリを一気にインストールでき、自動でアップデートしてくれるAnadoncdaの環境が推奨されています。

4章 データの型

金融業界においては1円( ¢1?)単位で誤差がでない計算が重要視されていると聞いたことがあります。そのような用途においては何も指定しないと数値が浮動小数点として扱われてしまうPythonの様な言語は不適とされそうですが、任意精度の整数が使えるdecimalモジュールを使用することが出来るとしています。numpy arrayのC,fortran formatの違いと計算速度への影響など渋い題材を取り上げています。

5章 可視化

matplotlibの基本的な使い方です。
matplotlib.financeでろうそくチャートが描けます。

6章 金融時系列

pandasはヘッジファンドに勤めていた人が開発したもので、金融時系列を扱うのが特に得意なようです。
pandasはYahoo! Finance, Google Finance等からのデータが読めます*1
pandas.DatetimeIndexでデータの周期(営業日、月、分など)が指定できます。データセットの中にはある日突然フォーマットが変わってしまったりしてるものがあって大変そうです。

7章 データ入出力

pandasはcsv,SQL,xls,json,htmlなど多彩な入出力が出来ます。
pytablesはHDF5ファイルを扱うことが出来、メモリに載らないデータも処理できるそうです。numexprを使うとIOと同時にデータへ変換を行うことが出来ます。

8章 performance

Cython,numexpr, Numba(pro), Ipython.parallel, multiprocessingなどのライブラリが紹介されています*2
Numba proでのGPU乱数生成とCPUの結果との比較が行われていて10万サンプル以上になるとGPUのほうが効率が良くなるようです。

9章 数学

numpyの使い方、特にpolyfitによるregressionやスプライン補間(np.polyfit)が紹介されています。
また最適化問題を解く為のscipy.optimizeがあります。

10章 確率

numpyでの乱数生成で 色々な確率過程(幾何的ブラウン運動、Stochastic volatility model, Jump diffuion)に基づいたpathの生成、表示を行っています。アメリカンオプションの価格計算もしています。

11章 統計

確率のところではモデリングとシミュレーションの話だけでしたが、実データを使った解析です。
scipy.stats, statsmodels.apiを用いた検定、現代ポートフォリオ理論(Wikipedia)のnumpy実装と実データへの適用、フロンティア(最適な収益とボラティリティーの関係)の可視化、
PCAを使った ドイツの証券取引所の全銘柄の主成分と30銘柄によるindexの価格変動の比較、
PyMC3を使ったベイズ回帰モデルの説明がされています。PyMC3のサブモジュールのひとつGaussianRandomWalkを使って確率過程をモデル化しており、回帰係数の時間的変動を取り出す為にベイズモデリングが使われているようです。find_MAPにscipy.optimizeの関数fimn_l_bfgs_bを指定することが出来ます。

12章 Excelとの連携

openpyxl,xlswriterなどが紹介されています。

13章 オブジェクト指向プログラミング

traitsというライブラリを使うとJavaのSwingや.NETのように気軽にGUIが使えるようです。

14章 Webとの連携

bokehが紹介されています。flaskは便利そうです。オプションの価格計算サービスの実装が例として紹介されています。

15〜18章

複雑なモデルに従ったオプションの価格のsimulation, valuationの行程を行えるVXライブラリの仕組み、内部実装の話です。前の章より高度なモデルが扱われているようです。
https://github.com/yhilpisch/dx

その他、感想

金融時系列を扱っていますが、単位根検定やARモデルの話はありませんでした。予測の話もないのですぐにお小遣いを回収することはできませんでした。

ほとんどの部分はおそらく
http://ipython.org/ipython-doc/1/interactive/nbconvert.html
の方法を使ってipython notebookの記述をそのまま電子書籍化したようですが、コードと実行結果が地の文に含まれるようなスタイルが題材に非常に合っていて違和感がありませんでした。図や数式も効率的に挿入できているようです。Juliaなら確率過程のモデリングのコーディングの所はさらに自然な記述に出来そうです。
しかしKindle paperwhiteではプロットが白黒で判別できない情報がある。数式が一行の場合は大きすぎ、地の文に埋め込まれている場合は小さすぎる。表示できない文字もあると結構致命的な問題があります。Kindle Fireに課金してしまいそうです。紙の本も出ているのでそちらでは問題ないかもしれません。

一方Rでは

Rを金融時系列を扱う場合は

金融データ解析の基礎 (シリーズ Useful R 8)

金融データ解析の基礎 (シリーズ Useful R 8)

メモリに載らない規模のデータを扱ったり並列計算を行ったりする場合は
Rによるハイパフォーマンスコンピューティング

Rによるハイパフォーマンスコンピューティング

http://www.socym.co.jp/book/935

が参考になりそうです。

Reference

stochastic_volatility.ipynb

Python pandas で日本の株価情報取得とローソク足チャート描画 - StatsFragments
http://python-financial-engineering.com/entry/20140829_Python_Mathematical_Optimization.html

ボラティリティー一定の場合しかなかったと記憶していますが、確率過程や確率微分方程式の解をこの本で学びました。

確率微分方程式―入門から応用まで

確率微分方程式―入門から応用まで

*1:日本の株式市場のデータの取得は Python pandas で日本の株価情報取得とローソク足チャート描画 - StatsFragments が参考になります

*2:日本語では iPython notebookで研究開発生活 - Qiitaがとても参考になります