Yves Hilpisch『Pythonによるファイナンス 第2版 データ駆動型アプローチに向けて』まとめ

Yves Hilpisch『Pythonによるファイナンス 第2版 データ駆動型アプローチに向けて』(黒川利明訳、中妻照雄技術監修、オライリージャパン)が去年の末に発売されたので、元日から約三週間かけて読みました。そのあと放置していたのですが、今回その内容を章ごとに要約したので参考にしてください。

 

作者のYves Hilpisch(イーブ・ヒルピシュ)氏は、投資銀行クオンツとしてPythonを用いたパッケージの開発で金融業界に貢献してきた方で、現在はThe Python Quants GmbHおよびThe AI MachineのCEOを務めています。本書でも後半は彼の手による価格付けライブラリ「DX」で用いられているコードが解説されます。

 

概要

本書は五部構成になっていて、それぞれ次のようなタイトルになっています。

このうち第1部(の1章)はファイナンス分野におけるPythonおよびプログラミング利用の概略、第2部はPythonの文法および各種パッケージについての解説、第3部はファイナンスに用いられる数学的手法や物理学モデルの解説および応用、第4部はより実践的な投資戦略の実装と解説、そして第5部はDXパッケージに実装されているコードの紹介となっています。

したがって、Pythonによるファイナンスという観点から言えば、第1部および第4部がこの本のエッセンスとなります。しかし第3部の数学や物理学のツールについての解説とPythonによるそれらの実装を理解していないと、それらを組み合わせた第4部の内容を理解するのは難しいかもしれません。Pythonの基本的な知識がある方なら第2部は飛ばしても問題ないですし、数学や物理学に精通している方なら第3部の前半も既知の内容かと思います。第5部はパッケージで実装されているコードの紹介となるため、読んで身に付く類のものではないです。

また、本書ではファイナンスおよび投資に関するテクニカルタームが頻出します。ボラティリティポートフォリオデリバティブ、オプションといった専門用語が特に断りなく用いられます。モンテカルロシミュレーションオイラー法といった数学的技法および物理学的モデルについては数式を用いて詳しく解説されますが、正規分布や局所最適化のような統計学および数学の概念については必ずしも説明されません。

私は数学や物理学に関する学部レベルの知識があるのと、本書を読むまでに投資運用に関する一般書および投資手法についての解説書をすでに読んでいたので、この辺りの知識については身についていました。特に、いわゆる「ロケット科学者」がどのような経緯でファイナンス分野に物理学や数学の手法を持ち込むに至ったか知っていると、本書が面白く読めるのではないかと思います。こちらの書籍が参考になります。

scrapbox.io

scrapbox.io

 

ちなみに、上記の内容からわかる通り、本書は投資銀行で用いられているPythonコードの実装について述べられた本であって、実務的な内容ではあるものの必ずしも実用的な書籍ではありません。すなわちこの本を買ったからといってすぐさま投資に使えるコードが手に入るわけではないです。なお、本書で用いられるコードはJupyter Notebookで利用可能な形式でインターネット上に公開されています。

py4fi.pqp.io

 

それでは以下、各章ごとの要約です。

 

第1部 Pythonファイナンス

1章 なぜファイナンスPythonを使うのか

インタープリタ、動的型付け、インデントなどの言語そのものの特徴に加え、Numpy、SciPy、Matplotlib、pandasなどの科学スタックを含むエコシステムにより、Pythonファイナンス分野において理想的なテクノロジーフレームワークとなった。というのも ITテクノロジーは世界の金融機関で競争力の源となっており、テクノロジーの進歩がイノベーションや効率改善をもたらす反面、リスク管理や規制を困難なものにしつつあったからだ。今日の開発ではリアルタイム分析やビッグデータ解析に耐え、かつモデル開発の素早さが保守性・信頼性の高さと同時に求められる。Pythonは数式に近い構文や、プロトタイプからプロダクションまで一貫した開発が可能であることからこれらに適していた。さらに機械学習や深層学習用の言語でもあるPythonは、これらの手法をファイナンス問題に適用するのも容易である。以上のような観点から、Pythonはデータ駆動型ファイナンスとAIファーストファイナンスというトレンドのための言語と言える。

 

2章 Pythonインフラストラクチャ

環境整備に役立つPythonインフラストラクチャを紹介する。パッケージマネージャconda、仮想環境マネージャDocker、そしてクラウドインスタンスの導入について説明する。

 

第2部 基本の習得

3章 データ型とデータ構造

int(整数)、float(浮動小数点数)、ブール値、文字列などの基本データ型と、タプル、リスト、dict(辞書)、set(集合)などの基本データ構造について説明する。


4章 NumPyによる数値計算

Pythonのリストや配列クラスによるデータ配列と、NumPyを用いた多次元配列やブール値配列、形とサイズの変更について、またNumPyの構造化配列、構造化ndarrayやベクトル化コードについて説明する。


5章 pandasによるデータ分析

pandasのDataFrameクラスと、それを用いた基本的な分析および可視化について、またSeriesクラスを用いたGroupBy演算、複合選択、連結、結合、マージについて説明する。


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

Pythonによるファイナンスにおけるオブジェクト指向プログラミングの重要な概念としては、クラス、オブジェクト、属性、メソッド、引数、インスタンス化が、また人間に適したところとしては、自然な考え方、複雑さを減らす、より良いユーザインタフェース、Pythonicなモデル化が、そして技術面としては、抽象化、モジュール化、継承、集約、コンポジション(合成)、ポリモーフィズムカプセル化、再利用性、非常調整が重要である。Pythonオブジェクトのオブジェクト指向として、int、list、ndarrayおよびDataFrameの利用法と、Pythonクラスの基本、Pythonデータモデル、データクラスについて説明する。

 
第3部 金融データサイエンス

7章 データ可視化

Pythonのデータ可視化ではMatplotlibが基準であり、NumPyやpandasと組み合わせて利用される。静的2Dプロットおよび3Dプロットの基本関数と、PlotlyにpandasのDataFrameオブジェクトやラッパーパッケージCufflinksを組み合わせた、D3.jnに基づくインタラクティブ2Dプロットの作成について説明する。


8章 金融時系列データ

株価や為替レートなどの金融時系列データを、pandasを用いてカンマ区切り値(CSV)ファイルのデータセットとして効率的に分析・可視化する方法について述べる。ローリング統計によるテクニカル分析S&P 500株価指数とVIXボラティリティ指数の相関分析、ティックデータなどの高頻度データを例として取り扱う。


 9章 入出力操作

入出力(I/O)操作は金融アプリケーションやデータ指向アプリケーション一般に重要な操作である。PythonではSQLに基づいた関係データベースも扱えるが、ファイナンスや科学の多くの応用領域では一般に配列に基づいたデータモデル方式、NumPyのndarrayオブジェクトやPyTablesのTableオブジェクト、TsTablesのDataFrameオブジェクトなどが活躍する。スケールアウトやスケールアップの観点から、分析の要件に最も適合するハードウェアアーキテクチャかどうか注意して検討すべきである。


10章 高性能Python

ファイナンスにおける典型的な業務やアルゴリズムの高速化には、賢明なデータ構造の選択、正しいイディオム/パラダイムの実装、正しい性能関連のパッケージの使用が求められる。Pythonにおける高速化の方法としては、NumPyやpandasによるベクトル化、Numbaを用いた動的コンパイル、Cythonを用いた静的コンパイル、そしてマルチプロセスといった選択肢がある。これらを用いて、ループや再帰関数、モンテカルロシミュレーションなどを実装する。


11章 数学ツール

1980-1990年代のいわゆるウォール街のロケット科学者の登場により、ファイナンス応用数学の一分野へと進化した。回帰や補間といった関数近似にはじまり、凸最適化は市場における効用最適化といったキャリブレーションに、積分はオプション価格の決定や評価のためのシミュレーションに必要である。記号計算パッケージSymPyを使えば、微積分が記号的および数値的に厳密に解ける。


12章 ストキャスティクス

ストキャスティクス(株価の「売られ過ぎ」「買われ過ぎ」を判断するための一指標)は、ブック上のデリバティブすべてに関する一貫した評価を求める今日のファイナンスにおいて最も重要な数学・数値計算業務である。乱数はファイナンスの多くのモデルが基づく正規分布や対数正規分布においても、また正規仮定に基づかないモデルを離散化しての近似に際しても用いられる。正規分布などの確率変数、幾何ブラウン運動や確率的ボラティリティモデルといった確率過程、分散現象法により調整された擬似乱数を用いて、ブラック・ショールズ・マートン(BSM)モデルやジャンプ拡散モデルといった、モンテカルロシミュレーションに重要となるメソッドや技法を実装する。ヨーロピアン(指定日)およびアメリカン(特定の期間内の任意のタイミング)オプションをはじめとする派生証券の評価、最後にバリューアットリスクVaRや信用評価調整のようなリスク尺度推定を実装する。


13章 統計

ポートフォリオ理論や資本資産格付けモデル、効率的市場仮説、オプション価格付け理論などのファイナンス基礎理論は金融商品の収益が正規分布に従っているという仮定に基づいているが、実世界データの正規性検定はその検定仮説を強く棄却する。

現代ポートフォリオ理論(平均-分散ポートフォリオ理論、MPT)はファイナンス理論の土台で、ポートフォリオ最適化は多くの資産を分散して正しく組み合わせて持つことで分散効果を期待するものである。ポートフォリオ共分散行列を使ってモンテカルロシミュレーションを実装する。シャープ・レシオ最大化、ポートフォリオの分散最小化といった制約のもと、最適ポートフォリオは最小ボラティリティすなわち最小分散ポートフォリオを最適ポートフォリオすべてでシミュレーションすると、他のすべてのポートフォリオより優位であるところの効率的フロンティアが示される。そこに無リスク資産を勘定に入れると、その接線が無リスクポートフォリオのリスク-収益点を通る、効率的フロンティアの折線上のポートフォリオが最適投資となる。

ベイズ統計は通時的解釈、すなわち時間が経てば対象である変数やパラメータについて新たな情報が学べるというエージェントの信念更新を組み入れた統計手法で、こうした推定更新にはscikit-learnやTensorFlowを用いた機械学習が応用できる。k平均法や混合ガウスモデルといった教師なし学習と、ガウシアン・ナイーブ・ベイズ(GNB)、ロジスティック回帰、決定木、深層ニューラルネットワーク(DNN)など各種分類手法の教師あり学習について例証する。サポートベクターマシンSVM)においては訓練と試験の分離も有用である。

 

第4部 アルゴリズム取引

14章 FXCMトレーディングプラットフォーム

FXCM Group, LLCのトレーディングプラットフォームがプログラム取引のためのRESTfulなストリームAPIを提供しているので、Pythonラッパーパッケージfxcmpyを用いてこれを利用する。ティックデータやローソク足データを取得し、ストリームデータ処理や売買注文をリアルタイムに行う。

 

15章 取引戦略

ロング、ショート、中立のポジションを取るよう設計されたアルゴリズム取引戦略を、NumPyのndarrayオブジェクトととpandasのDataFrameオブジェクトを用いたベクトル化バックテスト方式で最適化する。まずは単純移動平均(SMA)による取引戦略とその最適化を取り扱う。しかし金融市場の価格は連続時間でドリフトしないというランダムウォーク仮説(RWH)、および市場価格はが「入手可能な全情報」を反映するという効率的市場仮説(EMH)に従えば、こうしたテクニカル分析は全く価値がないことになる。線形最小二乗法による過去の対数収益率に基づく市場の方向性の予測、k平均法を使った取引戦略のクラスタリング、金融市場の変動方向予測に対する頻度アプローチの適用、過去のデータで訓練した機械学習アルゴリズムによる分類、深層ニューラルネットワーク(DNN)によるパフォーマンス向上などを例証する。

  

16章 自動取引

資本管理について、全資本のうち何割の資本をアルゴリズム取引戦略に投じるかという長期資産の最大化を考える。1回ごとの賭け金の利用可能資本に対する最適配分を、コイントスを例に二項設定のケリー基準により求める。単純なS&P 500指数のパッシブロングポジションで検証した結果、最適ケリーレバレッジはエクイティポジションに不安定な変動をもたらす。

機械学習を使用して市場価格の動く方向を予測するアプローチとFXCMのREST APIを使って取得した過去データを組み合わせ、EUR/USD通貨ペアを使ってアルゴリズム取引戦略をバックテストし、最適レバレッジを求める。重要な取引を正しく行うことと、取引戦略に含まれる取引コストが知見として得られる。

これまで完全データセットを使って問題解決してきたオフラインアルゴリズムだけでなく、次々と到着するデータを処理して次の期間(足)の市場変動の方向を予測するために、オンラインアルゴリズムについても検討する。実際のファンドで運用する適切なインフラストラクチャとして必要なのは、高信頼性、パフォーマンス、セキュリティが挙げられ、アルゴリズムトレーダーの観点からはロギングと監視が求められる。
 

第5部 デリバティブ分析

価格付けライブラリDX  モデル化  シミュレーション  評価  リスク管理  アプリケーション

17章 評価フレームワーク

ここからはDXライブラリの開発フレームワークについて紹介する。資産価格付けの基本定理としては、割引リスク要因(確率過程)からドリフトを除去する確率測度であるマルチンゲール測度が挙げられ、リスクに対する株式のリスクプレミアムなどが評価できる。リスク中立割引に際しての該当日付のモデル化と処理、定数短期金利について検討する。 市場環境においては抽象化に加えて、定数、リスト、曲線といったデータとPythonオブジェクトを格納する3つの辞書が便利である。

 

18章 ファイナンスモデルのシミュレーション

DXパッケージの中心要素のシミュレーションクラスを実装する。標準正規分布、分散減少法といった乱数の生成、他のすべてのシミュレーションクラスが共有し、市場環境の役割を果たすジェネリックシミュレーションクラス、そして幾何ブラウン運動、ジャンプ拡散、平方根拡散などの実装を紹介する。

 

19章 デリバティブ評価

オプションとデリバティブは長らくいわゆるウォール街のロケット科学者、すなわち物理学などで高度な数学を使いこなすPhDを持った人々の専門領域だったが、モンテカルロシミュレーションのような数値計算手法によるモデルへの適用により、理論モデルそのものより少しだけ簡単になった。ヨーロピアンタイプにおけるオプション値の数値モンテカルロ評価量の1階偏微分デルタ、および現在(瞬時)ボラティリティσ(0)に関するボラティリティの1階偏微分ベガの数値評価について、また離散時間でのバミューダオプションの値の最適停止問題の極限であるところのアメリカンオプションの評価について、DXパッケージのコードを説明する。

 

20章 ポートフォリオ分析

モンテカルロシミュレーションだけを数値計算手法として採用し、分析パッケージをほぼ完全にモジュール化する。複数のリスク要因(相関可)に依存する複数デリバティブポジションのポートフォリオ評価とリスク管理、およびリスク要因間の相関、シミュレションオブジェクトのインスタンス化、ポートフォリオ統計量生成といった、より複雑な業務を実装する。

 

21章 市場に基づいた評価

活発に取引されていないオプションの価格付けを行ったものを利用して、活発に取引されているオプションの市場価格の価格付けモデルを凸最適化問題としてキャリブレーションして求めたモデルで行う。そのような例として、DAX 30指数のアメリカンプットオプションポートフォリオを実装したコードを紹介する。

 

メモ

要約する前のメモをこちらで公開しています。

scrapbox.io