Pythonによるファイナンス 第2版 データ駆動型アプローチに向けて
https://images-na.ssl-images-amazon.com/images/I/519lk47aNXL._SX389_BO1,204,203,200_.jpg
2020/1/1
2020/1/22
Yves Hilpisch『Pythonによるファイナンス 第2版 データ駆動型アプローチに向けて』(黒川利明訳、中妻照雄監修、オライリー・ジャパン)読了。投資の本読んだ知識があったので第三部まではなんとか理解できたがそこから先はさっぱり。投資銀行がどういうモデルや数式を使っているのか勉強になった。
内容紹介
さまざまな分野で威力を発揮するPythonは、ファイナンスの分野でも重要なテクノロジーとして急成長を遂げています。
本書は、Pythonを使った金融工学の初歩的な基本事項からアルゴリズム取引やデリバティブ分析までカバーし、必要なプログラミング、機械学習や深層学習を利用したデータ分析、統計などについて、数理と実用面から詳しく解説します。
「データ駆動型アプローチ」と「AIファーストファイナンス」を軸に、これからのファイナンスに必要な戦略と実践力を体得できることを目的とします。
内容(「BOOK」データベースより)
さまざまな分野で威力を発揮するPythonは、ファイナンスの分野でも重要なテクノロジーとして急成長を遂げています。本書は、Pythonを使った金融工学の初歩的な基本事項からアルゴリズム取引やデリバティブ分析までカバーし、必要なプログラミング、機械学習や深層学習を利用したデータ分析、統計などについて、数理と実用面から詳しく解説します。「データ駆動型アプローチ」と「AIファーストファイナンス」を軸に、これからのファイナンスに必要な戦略と実践力を体得できることを目的とします。
著者について
Yves J. Hilpisch(イーブ・ヒルピシュ):金融データサイエンス、AI、アルゴリズム取引、金融工学用のオープンソース技術を専門とするThe Python Quantsの創立者兼パートナー。自前の戦略実行アルゴリズムによって人工知能を活用する企業The AI MachineのCEO。本書の他に『Derivatives Analytics with Python』(Wiley, 2015)と『Listed Volatility and Variance Derivatives』(Wiley, 2017)の著者である。金融工学についてのCQF、アルゴリズム取引についてのEPATという2つのオンライン講座の講師も勤めている。Python for Algorithmic Tradingの最初のオンライン大学認証機関のディレクター。金融分析ライブラリDX Analyticsの著者で、ロンドン、フランクフルト、ベルリン、パリ、ニューヨークで開催される「Pythonによる定量分析ファイナンスとアルゴリズム取引」のミートアップ、会議、ブートキャンプのオーガナイザー。米国、ヨーロッパ、アジアで開かれた学術会議のキーノートスピーカーを務めた。
著者略歴 (「BOOK著者紹介情報」より)
ヒルピシュ,イーブ
金融データサイエンス、AI、アルゴリズム取引、金融工学用のオープンソース技術を専門とするThe Python Quantsの創立者兼パートナー。自前の戦略実行アルゴリズムによって人工知能を活用する企業The AI MachineのCEO。金融工学についてのCQF、アルゴリズム取引についてのEPATという2つのオンライン講座の講師も勤めている。Python for Algorithmic Tradingの最初のオンライン大学認証機関のディレクター。金融分析ライブラリDX Analyticsの著者で、ロンドン、フランクフルト、ベルリン、パリ、ニューヨークで開催される「Pythonによる定量分析ファイナンスとアルゴリズム取引」のミートアップ、会議、ブートキャンプのオーガナイザー。米国、ヨーロッパ、アジアで開かれた学術会議のキーノートスピーカーを務めた
黒川/利明
1972年、東京大学教養学部基礎科学科卒。東芝(株)、新世代コンピュータ技術開発機構、日本IBM、(株)CSK(現SCSK(株))、金沢工業大学を経て、2013年よりデザイン思考教育研究所主宰。過去に文部科学省科学技術政策研究所客員研究官として、ICT人材育成やビッグデータ、クラウド・コンピューティングに関わり、現在情報規格調査会SC22 C#、CLI、スクリプト系言語SG主査として、C#、CLI、ECMAScript、JSONなどのJIS作成、標準化に携わっている。他に、IEEE SOFTWARE Advisory Boardメンバー、日本規格協会規格開発エキスパート、標準化アドバイザー、町田市介護予防サポーター、次世代サポーター、カルノ(株)データサイエンティスト、ICES創立メンバー、画像電子学会国際標準化教育研究会委員長として、データサイエンティスト教育、デザイン思考教育、標準化人材育成、地域学習支援活動などに関わる
中妻/照雄
1968年徳島県に生まれる。1991年筑波大学第三学群(現・理工学群)社会工学類卒業。1998年ラトガーズ大学大学院経済学研究科博士課程修了。現在、慶應義塾大学経済学部経済学科教授。Ph.D.(経済学)(本データはこの書籍が刊行された当時に掲載されていたものです)
まえがき
本書で用いるJupyter NotebookとコードをQuant Platformで利用
資料
アルゴリズム取引のPython資格プログラム
サンプルコードの使い方
ダウンロード
第1部 Pythonとファイナンス
1章 なぜファイナンスにPythonを使うのか
1.1 プログラミング言語Python
Pythonは以下の特徴により幅広く使われるようになった。
オープンソース
インタープリタ
マルチパラダイム
汎用性
クロスプラットホーム
動的型付け
インデント
ガベージコレクション
構文についてはZen of Pythonを import this で見よ。
1.1.1 Pythonの大まかな歴史
1.1.2 Pythonエコシステム
Python標準ライブラリ
math
対話環境(IPython)
シェル版
ブラウザ版(Notebook)
Jupyter
1.1.3 Pythonのユーザー層
1.1.4 科学スタック
科学スタック
Numpy
SciPy
Matplotlib
pandas
scikit-learn
PyTables
Rubyにはない
1.2 ファイナンスにおけるITテクノロジー
ITテクノロジーは世界の金融機関で主要アセット、競争力の源に
1.2.1 ITテクノロジーコスト
金融業ではITテクノロジーに多大な経費
既存システムの保守
新システム開発
巨大投資銀行ではIT投資予算が年間数十億ドルに
1.2.2 エネーブラーとしてのITテクノロジー
デジタル化の名のもと、ファイナンス分野のイノベーションや効率改善
効率性向上の反面、競争優位性は複雑な製品やトランザクションを追求
リスクを増大、リスク管理や規制を困難に
2007年、2008年のファイナンス危機
ファイナンス市場の潜在的リスク
2010年のフラッシュクラッシュ
1.2.3 参入障壁としてのテクノロジーと人材
テクノロジーの進歩はコストを下げると同時に、シェア獲得と地位保持のために多大の投資を要する
本格的なデリバティブ分析ライブラリの構築に要する時間とコスト
Pythonエコシステムが開発され、この10年で大幅に減った
LTCM(Long-Term Capital Management)の破綻
当時何百万ドルもかかったコンピューターパワーは今日数千ドルで購入、あるいはクラウドでレンタルできる
巨大金融機関にとっては複雑
1.2.4 限りなく増加する速度、頻度、データ量
ファイナンストランザクションの執行と約定の速度と頻度
フラッシュトレーディング
次のような課題が生じた
データ処理
分析の速度
理論基盤
テクノロジーによってしか解決できない
1.2.5 リアルタイム分析の勃興
金融データ分析の重要性と課題
ビッグデータ
リアルタイムエコノミー
1.3. ファイナンスのためのPython
これらの課題にPythonが役に立つ
1.3.1 ファイナンスとPythonの構文
アルゴリズムが既知の問題を解くのにPythonが選ばれる
構文が科学的な問題や金融アルゴリズムを記述する数学の構文と類似
モンテカルロシミュレーションでヨーロピアンオプションの評価を行う金融アルゴリズム
BSM(Black-Scholes-Merton)モデル
オプションのリスク因子は幾何ブラウン運動に従う
次の点で便利
構文
解釈
ベクトル化
英語・数式と一緒に使える
つまり科学を記述するために必要な言語は次の三つ
英語
数学
Python
擬似コード
1.3.2 Pythonによる効率と生産性
Pythonを使う利点は次の3つの次元で測られる
効率
生産性
品質
1.3.2.1 より短期間で結果を出す
対話的データ分析で効率性が明白
IPython
Jupyter Notebook
pandas
S&P 500株価指数について次のことが簡単にできる
ウェブから株価指数データを取得
対数収益率(ログ・リターン)の移動標準偏差(ボラティリティ)を計算
株価指数とボラティリティをプロット
テクノロジーの詳細を気にせず専門分野に集中できる
価値ある予測がほとんどリアルタイムで得られ、競合を出し抜ける
1.3.2.2 高性能を担保する
構文が簡潔で、コーティングが効率的にできる
インタープリタ方式なので計算主体のファイナンス業務には時間がかかるという偏見
次の戦略を区別すること
イディオムとパラダイム
コンパイル
並列化
簡単だが現実的な例
NumPyを使う
1.3.3 プロトタイプからプロダクションへ
対話的分析の効率性と実行速度の性能
プロトタイプからプロダクションまで全面的に使える
今日でもファイナンス開発は2段階の別々のプロセスになっている
定量分析アナリスト(クオンツ)によるモデル開発とプロトタイプ作成
MATLABやR
IT部門の開発者による信頼性・保守性の高いプロダクションコードへの変換
C++やJava
2段階プロセスにより生じる意図しなかった結果
非効率
スキルの分散
レガシーコード
Pythonでは最初の対話的プロトタイプからこう信頼で高性能かつ保守可能なプロダクションまで一貫したプロセスが可能
1.4 データ駆動型ファイナンスとAIファーストファイナンス
ファイナンスそのものを根本的に変える2つのトレンド
1.4.1 データ駆動型ファイナンス
MPTやCAPMのような重要なファイナンス理論
経験的に実証されず、理論的な結論が反証されている
数学的な美しさから広く受け入れられてもいる
物理学の科学的手法
実験や観察によるデータ収集
仮説や理論の提出
データと付き合わせての検証
結果が良ければ仮説と理論を改訂
結果が悪ければ仮説と理論が棄却、新たな探索
定量分析ファイナンスの歴史は科学的方法に違反してきた
金融データが現在のようには取得できなかった
Eikon Data APIをサブスクリプションする例
標準化された効率的な方法で取得できる
1.4.2 AIファ0ストファイナンス
人工知能()AI手法、特に機械学習や深層学習手法をアルゴリズム取引のようなファイナンス問題に適用するのが容易
PythonはAI界でも主要言語
TensorFlow
scikit-learn
機械学習の分類アルゴリズムが市場価格の将来動向の予測に使える例
1.5 結論
言語としてエコシステムとして、Pythonはファイナンス分野において理想的なテクノロジーフレームワーク
人工言語全般と機械学習/深層学習用の言語でもある
Pythonはデータ駆動型ファイナンスとAIファーストファイナンスというトレンドの言語
1.6 さらに学ぶために
アルゴリズム取引
2章 Pythonインフラストラクチャ
環境整備に役立つ
パッケージマネージャ
仮想環境マネージャ
コンテナ
クラウドインスタンス
2.1 パッケージマネージャ conda
2.2 仮想環境マネージャとしてのconda
2.3 Dockerコンテナを使う
2.4 クラウドインスタンスを使う
2.5 結論
2.6 さらに学ぶために
Pythonパッケージの管理
仮想環境
Dockerコンテナ
Jupyter Notebook公開サーバーをセキュアに実行
JupyterHub
第2部 基本の習得
3章 データ型とデータ構造
3.1 基本データ型
3.1.1 整数
3.1.2 float(浮動小数点数)
3.1.3 ブール値(真偽値、論理値)
3.1.4 文字列3
3.1.5 トピックス:フォーマット出力
3.1.6 トピックス:正規表現
3.2 基本データ構造
3.2.1 タプル
3.2.2 リスト
3.2.3 トピックス:制御構造
3.2.4 トピックス:関数型プログラミング
3.2.5 dict(辞書)
3.2.6 set(集合)
3.3 結論
3.4 さらに学ぶために
4章 NumPyによる数値計算
4.1 データ配列
4.1.1 Pythonのリストによる配列
4.1.2 Pythonの配列クラス
4.2 通常のNumPy配列
4.2.1 基本操作
4.2.2 多次元配列
4.2.3 メタ情報
4.2.4 形とサイズの変更
4.2.5 ブール値配列
4.2.6 速度の比較
4.3 NumPyの構造化配列
列(カラム)ごとに異なるdtypeを持つ構造化ndarrayとレコードrecarrayオブジェクト
4.4 ベクトル化コード
4.4.1 基本のベクトル化
4.4.2 メモリ配置
4.5 結論
4.6 さらに学ぶために
5章 pandasによるデータ分析
5.1 DataFrameクラス
5.1.1 DataFrameクラスの第1ステップ
5.1.2 DataFrameクラスの第2ステップ
5.2 基本的な分析
5.3 基本的な可視化
5.4 Seriesクラス
5.5 GroupBy演算
5.6 複合選択
5.7 連結、結合、マージ
5.7.1 連結
5.7.2 結合
5.7.3 マージ
5.8 性能について
5.9 結論
5.10 さらに学ぶために
6章 オブジェクト指向プログラミング
重要な概念
クラス
オブジェクト
属性
メソッド
引数
インスタンス化
人間に適したところ
自然な考え方
複雑さを減らす
より良いユーザインタフェース
Pythonicなモデル化
技術面
抽象化
モジュール化
継承
集約
コンポジション(合成)
ポリモーフィズム
カプセル化
再利用性
非常調整
6.1 Pythonオブジェクトのオブジェクト指向
6.1.1 int
6.1.2 list
6.1.3 ndarray
6.1.4 DataFrame
6.2 Pythonクラスの基本
6.3 Pythonデータモデル
6.4 データクラス
6.5 結論
6.6 さらに学ぶために
第3部 金融データサイエンス
7章 データ可視化
MatplotLib
可視化ツール
Plotly
D3.jsプロットを作る
7.1 静的2Dプロット
plt.plot()
x値
y値
listまたは配列
plt.axis()
plt.xlim()/plt.ylim()
plt.title()/plt.xlabel()/plt.ylabel()
7.1.2 2次元データセット
NumPyのndarrayオブジェクト
plt.legend()
再スケール
plt.subplots()
7.1.3 他のプロットスタイル
散布図
plt.scatter()
ヒストグラム
plt.hist()
箱ひげ図
plt.setp()
7.2 静的3Dプロット
ボラティリティサーフェスの表示
権利行使価格
満期
np.meshgrid()
plt.plot_surface()
view_init()
7.3 インタラクティブ2Dプロット
D3.js標準に基づいたインタラクティブプロットを作る
Plotly
pandasのDataFrameオブジェクトやラッパーパッケージCufflinksと組み合わせると便利
Cufflinks
7.3.1 基本プロット
Jupyter Notebookでインポートとノートブックモードをオン
df.iplot()
7.3.2 ファイナンスのプロット
Cufflinksのファイナンス用プロット作成専用機能
相対力指数(RSI)のような典型的な金融チャート要素を追加できる
永続QuantFigオブジェクトを作る
EUR/USD為替レート時系列データ(FXCM Forex Capital Markets Ltd.)を用いる
qf.iplot()
7.4 結論
Pythonのデータ可視化ではMatplotlibが基準
NumPyやpandasと組み合わせて利用
Matplotlibの2D/3Dプロットの基本関数
CufflinksおよびPlotly
DataFrameオブジェクトのメソッド呼び出し一つでインタラクティブD3.jsができる
典型的なファイナンス用プロットをQuantfigオブジェクトで簡単に作成
7.5 さらに学ぶために
8章 金融時系列データ
金融時系列データ
インデックスが日や時刻
株価
為替レート
pandas
作者で主開発者のWes McKinneyが大手ヘッジファンドAQR Capital Managementのアナリストのとき開発
カンマ区切り値(CSV)ファイルのデータセット
8.1 金融データ
パッケージのインポートとカスタマイズ
code:python
import numpy as np
import pandas as pd
from pylab import mpl, plt
plt.style.use('seaborn')
%matplotlib inline
8.1.1 データのインポート
pd.read_csv()
CSVファイルから時系列データセットをインポート
data = pd.read_csv(filename, index_col=0, parse_dates=True)
可視化
data.head()/data.tail()
data.plot(figsize=(10, 12), subplots=True);
Thomson Reuters(TR)EikonデータAPIで取得したデータ
ロイター商品コード(RIC)
8.1.2 要約統計量
DataFrameオブジェクトのメタ情報
data.info()
列ごとに役立つ標準統計量を表示
data.describe()
列ごとの平均値
data.mean()
列ごとの最小値、平均値、標準偏差、中央値、最大値
data.aggregate([min, np.mean, np.std, np.median, max])
aggregate()メソッドでカスタム関数を渡せる
8.1.3 時間の経過に伴う変化
2つの行の差分
data.diff()
data.diff().mean()
列ごとの価格変化率(単純リターン)を計算
data.pct_change()
2つのインデックス値の価格変化率を計算
data.pct_change().mean().plot(kind='bar', figsize=(10, 6));
結果の平均値を棒グラフで可視化
累積対数収益率
rets = np.log(data / data.shift(1))
対数収益率
rets.cumsum().apply(np.exp).plot(figsize=(10, 6));
8.1.4 リサンプリング
ダウンサンプリング
ティックデータ時系列を1分間隔に
日時時系列を週次、月次に
EODデータを週次に
data.resample('1w', label='right').last().head()
月次に
data.resample('1m', label='right').last().head()
累積対数収益率のプロット
rets.cumsum().apply(np.exp).resample('1m', label='right').last().plot(figsize=(10, 6));
8.2 ローリング統計
ローリング統計
罫線分析者やテクニカルトレーダーの基本ツール
8.2.1 概観
ロールフォワード
rolling(window=window)
より専門的なファイナンス指標を得るには追加パッケージが必要
Cufflinksによるファイナンス用プロット
apply()メソッドによるカスタム指標の使用
8.2.2 テクニカル分析の例
株価テクニカル分析の主要ツール
2つの単純移動平均(SMA)
短期SMA>長期SMAならロング、逆ならショート
1でロング、-1でショートを可視化
data['positions'] = np.where(data['SMA1'] > data['SMA2'], 1, -1)
8.3 相関分析
S&P 500株価指数とVIXボラティリティ指数
S&P 500が上がるとVIXが下がり、逆も生じるという定型化された事実
強い負の相関であり、因果関係ではない
8.3.1 データ
8.3.2 対数収益率
「ボラティリティクラスタ」が見られる
scatter_matrix()
8.3.3 OLS回帰
最小二乗法(OLS)による回帰分析
対数収益率の散布図と点群上の線形回帰直線
8.3.4 相関
相関尺度
全てのデータの静的尺度
一定期間の相関を示すローリング尺度
8.4 高頻度データ
ティックデータ
リサンプリングした5分足の4本値データ
アルゴリズム取引戦略のバックテストやテクニカル分析の実装に使える
8.5 結論
pandas
ファイナンスの時系列を扱える
効率的なデータ分析
可視化
様々なソースからのデータセットの読み込み
様々なファイルフォーマットへのエクスポート
8.6 さらに学ぶために
9章 入出力操作
入出力(I/O)操作は金融アプリケーションやデータ指向アプリケーション一般に重要な操作
金融分析では一般に「ミッド」データカテゴリのサブデータセットを用いる
大半で100GB以下、一般に数GB以下
Numpy、pandas、PyTablesのような科学スタックライブラリのスイートスポット
9.1 Pythonの基本I/O
9.1.1 ディスクへのオブジェクト書き出し
Pythonオブジェクトをディスクに格納
pickleモジュール
シリアライズ
pickle.dump()
デシリアライズ
pickle.load()
先入先出(FIFO)法で格納
前もって知るためのメタ情報がない
オブジェクトを含んだdictオブジェクトを格納することで回避
9.1.2 テキストファイルの読み書き
strオブジェクト
fileオブジェクト
.readline()/.readlines()
csvモジュール
.reader()
.DictReader()
9.1.3 SQLデータベースの処理
SWL(構造化照会言語)データベースとNoSQLデータベースを扱える
関係データベースにSQLite3
9.1.4 NumPy配列の読み書き
NumPyそのものにndarrayオブジェクトを性能よく便利に読み書きする関数がある
9.2 pandasのI/O
次のような様々なデータフォーマットの読み書きをネイティブに行える
CSV(カンマ区切り値)
SQL(構造化照会言語)
XLS/XSLX(Microsoft Excelファイル)
JSON(JavaScript Object Notation)
HTML(HyperText Markup Language)
9.2.1 SQLデータベースの処理
.executemany()
9.2.2 SQLからpandasへの変換
1桁以上の速度上昇
9.2.3 CSVファイルの処理
9.2.4 Excelファイルの処理
かなり時間がかかる
スプレッドシート構造がオーバーヘッド
9.3 PyTablesを使ったI/O
HDF5データベース標準のPythonバインディング
code:python
import tables as tb
import datetime as dt
9.3.1 テーブル処理
Tableオブジェクト
NumPy構造化ndarrayオブジェクトと同じように振る舞う
メモリ上のNumPyやpandasオブジェクトと構文および性能の観点で同様に扱える
9.3.2 圧縮テーブルの処理
ファイルサイズが大幅に減る
ストレージコストが減る
バックアップコストが減る
ネットワークトラフィックが減る
ネットワーク速度が向上する
CPU利用率が増えてI/Oボトルネックを克服
9.3.3 配列の処理
多くの便利な機能
9.3.4 メモリ外計算
EArrayクラス
9.4 TsTablesのI/O
PyTablesを使い、時系列データ用高性能ストレージを作る
「一度書いて、何度も取得せよ」
9.4.1 サンプルデータ
幾何ブラウン運動のシミュレーション
9.4.2 データストレージ
TsTablesでは金融時系列データを、チャk=ん句を基にした構造に格納
9.4.3 データの取得
DataFrameオブジェクトを返す
9.5 結論
SQLに基づいた関係データベースにも複雑なデータ構造を表示できる利点
ファイナンスや科学の多くの王要領いいでは一般に配列に基づいたデータモデル方式が活躍
分析の要件に最も適合するハードウェアアーキテクチャかどうか注意して検討すべき
次のような点でハードウェア/ソフトウェアアーキテクチャを決定すべき
スケールアウト
スケールアップ
9.6 さらに学ぶために
10章 高性能Python
ファイナンスにおける典型的な業務やアルゴリズムの高速化
賢明なデータ構造の選択
正しいイディオム/パラダイムの実装
正しい性能関連のパッケージの使用
コンパイルもできる
コードの高速化の方法
ベクトル化
動的コンパイル
静的コンパイル
マルチプロセス
10.1 ループ
Pythonでは遅い
10.1.1 Python
10.1.2 NumPy
ベクトル化機能
10.1.3 Numba
ピュアPythonコードを動的コンパイル
10.1.4 Cython
Pythonコードを静的コンパイル
10.2 アルゴリズム
10.2.1 素数
10.2.1.4 マルチプロセス
mp.Poolオブジェクトに複数のプロセスを割り当て
チェックする素数に実行関数をマップ
10.2.2 フィボナッチ数
1, 1, 2, 3, 5, 8, 13, 21, ...
10.2.2.1 再帰アルゴリズム
再帰関数実装はも比較的遅い
静的型宣言だけで大幅に速度向上
10.2.2.2 反復アルゴリズム
Pythonでは基本的に任意の大きな数を扱えるが、一般にコンパイル言語では成り立たない
10.2.3 円周率
モンテカルロシミュレーションに基づいたアルゴリズム
π = A / r^2
10.3 二項ツリー
二項オプション価格付けモデル
オプション評価の一般的な数値計算方法
資産の将来の変動可能性を(再結合)木で表す
リスク資産と無リスク資産を前提
10.4 モンテカルロシミュレーション
金融工学に不可欠な数値計算手法
株価や指数の変動をモデル化する確率過程の幾何的ブラウン運動のモンテカルロシミュレーションを分析
とりわけBlack-Scholes-Merton(1973)のオプション価格決定理論
評価オプションの原資産は確率微分方程式(SDE)に従う
dS(t) = rS(t)dt + σS(t)dZ(t)
この確率微分方程式は等時間間隔で離散化で、オイラー法でシミュレーションできる
S(t) = S(t-Δt) • exp((r- σ^2/2)Δt + σ√Δtz)
ヨーロピアンコールオプションのモンテカルロ評価
C(0) = e^(=-rT) • 1/I Σ(I) max (S(T)(i) - K,0)
10.5 再帰pandasアルゴリズム
pandasのDataFrameオブジェクトに格納された金融時系列データの再帰関数の実装
関数化が不可能なもの
DataFrameオブジェクトを遅いPythonのループで実行するしかない
指数加重移動平均(EWMA)を単純形式で実装
EWMA(0) = S(0)
EWMA(t) = αS(t) + (1 - α)EWMA(t-1),t ∈ {1, ..., T}
本質的に単純で実装が簡単だが早くない
10.6 結論
コードの性能改善に用意されている方法
イディオム/パラダイム
パッケージ
コンパイル
並列化
10.7 さらに学ぶために
11章 数学ツール
1980-1990年代のいわゆるウォール街のロケット科学者の登場
ファイナンスは応用数学の一分野へと進化
11.1 近似
関数を近似
code:python
def f(x):
return np.sin(x) + 0.5 * x
11.1.1 回帰
基底関数 b(d), d ∈ {1, ..., D} の集合に対して、最適パラメータ α(1)*, ..., α(D)* を求める
i ∈ {1, ..., I} 観測点に対して y(i) ≡ f(x(i))
x(i)は独立観測
y(i)は従属観測
回帰の最小化問題に従って
min(α(1), ..., α(D)) 1/I Σ(I, i=1) (y(i) - Σ(D, d=1) α(d) × b(d)(x(i)))^2
11.1.1 単項式の基底関数
典型的なベクトル化
np.polyfit()/np.polyval()
11.1.2 個別基底関数
個別基底関数を行列で定義
中心にある関数は np.linalg.lstsq()
sin部分があることを使う
11.1.3 ノイズのあるデータ
ある意味で平均回帰はノイズを除去する
11.1.4 未ソートデータ
回帰は未ソートデータをシームレスに扱える
11.1.5 多次元
最小二乗回帰は簡単に多次元に拡張できる
11.1.2 補間
データ点が結果の部分ごとに定義された補間関数に完全に合致
関数がデータ点で連続微分可能なように2つの隣接データ点の回帰を行う
スプライン補間
sci.splrep()
元の観測に含まれない独立データ点の従属値推定によく使われる
11.2 凸最適化
ファイナンスや経済学で重要な役割
オプション価格付けモデルの市場データでのキャリブレーション
エージェントの効用関数最適化
11.2.1 大域最適化
大域最小化と局所最小化を実装
scipy.optimize 中の sco.brute() / sco.fmin()
11.2.2 局所最適化
大域最適化の結果を使う
sco.fmin()
局所凸最適化アルゴリズムはより良い局所最小値/大域最小値を完全に無視して局所最小に捉えられてしまう
抜け出すには「ベイズン・ホッピング」が必要
11.2.3 制約付き最適化
等式や不等式で表される制約
リスクの高い証券2つに投資する投資家の効用最大化(期待効用最大化)問題
両方の証券のコストは現在 q(a) = q(b) = 10 USD
1年後、状態 u でそれぞれ 15 USD と 5 USD、状態 d でそれぞれ 5 USB と 12 USB で清算される
2証券の生産ベクトルはそれぞれ r(a) と r(b)
投資家には w(0) = 100 USD の投資資金があり、効用関数 u(w) = √w に従って効用を引き出す
w は得られる富(USD)
最大化問題の式(a, b は投資家が購入した証券の個数)
max(a, b) E(u(w(1))) = p√w(1u) + (1 - p)√w(1d)
w(1u) = ar(a) + br(b)
w0 ≧ aq(a) + bq(b)
a, b ≧ 0
すべての数値を代入
負期待効用最小化に変わっている
scipy.optimize.minimize()
入力として関数の他に等式と不等式の条件と引数の区間を取る
11.3 積分
オプション価格の決定/評価に必要
デリバティブのリスク中立値が一般にリスク中立すなわちマルチンゲール測度の下でペイオフの割引期待値として表現されるという事実に基づく
離散なら和、連続なら積分
scipi.integrate()
11.3.1 数値積分
数学関数を積分区間で数値積分する関数
固定ガウス求積法
sci.fixed_quad()
適応求積法
sci.quad()
ロンバーグ積分
sci.romberg()
関数値や入力値のlistやndarrayオブジェクトを入力に取る関数
台形公式
sci.trapz()
シンプソン公式
sci.simps()
11.3.2 シミュレーション積分
モンテカルロシミュレーション
オプションやデリバティブの評価は積分がシミュレーションで求められることを根拠
モンテカルロ評価積分値
11.4 記号計算
記号計算(数式処理、式の計算)
11.4.1 基本
SymPyのSymbolクラス
import sympy as sy
普通のpPythonコードとの違い
sy.sqrt(x) は数式の一部
以下の数式レンダリング
LaTeXベース
Unicodeベース
ASCIIベース
11.4.2 方程式
x^2 - 1 = 0 を解ける
sy.solve(x ** 2 - 1)
11.4.3 微積分
微積分を記号的および数値的に厳密に解ける
a, b = sy.symbols('a b')
I = sy.Integral(sy.sin(x) + 0.5 * x, (x, a, b))
11.4.4 微分
不定積分の導関数は一般に元の関数
sy.diff()
凸最適化問題の厳密な解のために使える
関数を記号的に定義、偏微分を計算、根を求める
11.5 結論
ファイナンスに重要な話題とツール
関数近似
凸最適化技法
数値積分
SymPyによる記号計算
11.6 さらに学ぶために
SciPy
12章 ストキャスティクス
現在、ファイナンスで最も重要な数学/数値計算業務
株価の「売られ過ぎ」、「買われ過ぎ」を判断するための指標の一つ
ブックにあるデリバティブすべてに関する一貫した評価
柔軟で効率的な数値計算によってのみ遂行可能
一般に確率計算、特にモンテカルロシミュレーション
12.1 乱数
乱数
numpy.randomサブパッケージ
分布
(標準)正規分布
ファイナンスの多くのモデルが正規分布や対数正規分布に基づいている
直接(対数)正規仮定に基づかないファイナンスモデルの多くが離散化できてシミュレーション目的では正規分布を使って近似される
12.2 シミュレーション
モンテカルロシミュレーション(MCS)
12.2.1 確率変数
オプション価格決定のブラック・ショールズ・マートンモデル
行使期日Tの株価S(T)は、現在のS(0)から次の式によって求まる
S(t) = S(0) exp((r- σ^2/2)T + σ√T z)
table: BSM
S(T) Tにおける指数
r 定数無リスク短期金利
σ Sの定数ボラティリティ(=収益の標準偏差)
z 標準正規分布確率変数
対数正規分布である
npr.lognormal() で離散
12.2.2 確率過程
確率過程
確率変数のシーケンス
確率過程のシミュレーションは確率変数の反復シーケンス
ファイナンスで使われる確率過程はマルコフ性を示す
その過程での明日の値は今日の状態にのみ依存し、「過去」の状態に依存しない
経路依存性がまったくない
無記憶性
12.2.2.1 幾何ブラウン運動
確率微分方程式(SDE)で記述されるブラック・ショールズ・マートンモデルの動的シミュレーション
dS(t) = rs(t)dt + σS(t)dZ(t)
ブラック・ショールズ・マートンモデルの確率微分方程式
Z(t)が標準ブラウン運動
S(t)の値は対数正規分布
通常dS(t)/S(t)が(限界)収益
オイラー法による離散化
S(t) = S(t-Δt) exp((r- σ^2/2)Δt + σ√Δt z)
Δtは固定離散化区間
z(t)が標準正規分布確率変数
12.2.2.2 平方根拡散
平均回帰性過程
短期金利やボラティリティ過程のモデル化
平方根拡散
dχ(t) = κ(θ - χ(t))dt + σ√χ(t) dZ(t)
カイ二乗分布
数値的・計算上の都合からオイラー法による離散
完全切断法
12.2.2.3 確率的ボラティリティ
BSMモデルの主な単純化過程は定数ボラティリティ
しかしボラティリティは一般に確率的
確率的ボラティリティモデルの導入
ヘストン確率的ボラティリティモデル
レバレッジ効果と呼ばれる定型化された事実を示す
ボラティリティがストレス時(下降市場)に上がり、ブル・マーケット(上昇市場)で下がる
平方根拡散にオイラー法を使う別の利点
標準正規分布に従う乱数なので相関を簡単かつ一貫して考慮できる
12.2.2.4 ジャンプ拡散
資産価格やボラティリティにはジャンプが存在する
Mertonのジャンプ拡散モデル
12.2.3 分散現象法
擬似乱数を生成してもサンプルサイズの変動により期待した/望ましい値に十分近い統計量が得られない場合
実装容易でジェネリックな分散現象法
負相関変量法
乱数を本来の半分だけしか使わず、あとで符号を反転した同じ集合を追加
データセットの平均値は0
モーメントマッチング
12.3 評価
派生証券の評価
オプション、デリバティブ、ハイブリッド商品など
オプション
指定満期日または指定期間に
ヨーロピアン(指定日)
アメリカン(特定の期間内の任意のタイミング)
バミューダ
指定価格で
権利行使価格
売買
購入する権利(コール)
売却する権利(プット)
12.3.1 ヨーロピアンオプション
満期日での指数のヨーロピアンコールオプションのペイオフは
h(s(T)) ≡ max(S(T) - K,0)
S(T)が満期日Tの指数
Kが権利行使価格
リスク中立期待値による価格決定
リスク中立モンテカルロ評価
幾何ブラウン運動のパラメーターを設定し、評価関数 gbm_mcs_stat()
動的シミュレーション方式
ある範囲の権利行使価格についてオプション値/推定を生成
12.3.2 アメリカンオプション
ヨーロピアンオプションより複雑
オプションの評価額を求めるには最適停止問題を解かねばならないから
定式化は数値シミュレーション方式に使う離散時間格子に基づく
バミューダ方式によるオプション価格の方がより正確
時間感覚が0に収束すると、バミューダオプション価格はアメリカンオプションの価格に収束
最小二乗モンテカルロ(LSM)
ヨーロピアンオプションの価格はアメリカンオプションの下限
相違は一般に期限前行使プレミアムと呼ばれる
12.4 リスク尺度
リスク管理
12.4.1 バリューあっとリスク(VaR)
通貨単位で表され、ある期間内の信頼水準(確率)を超えない損失
テールリスクの捕捉能力が限られているとの批判も
12.4.2 信用評価調整
信用VaR(CVaR)
契約相手の債務不履行(デフォルト)から生じうるリスクの測度
デフォルト確率
(平均)損失水準
信用評価調整(CVA)
CVaRから導出
12.5 Pythonスクリプト
実装
12.6 結論
モンテカルロシミュレーションに重要となるメソッドと技法
ギリなん数の精製方法
確率変数や確率過程のシミュレーション
ヨーロピアン/アメリカンタイプの評価、VaRや信用評価調整のようなリスク尺度推定
PythonとNumPyの組み合わせは計算の多い業務の実装にも適している
大半がCで実装
ベクトル化演算で結果のコードが簡潔で読みやすい
12.7 さらに学ぶために
13章 統計
13.1 正規性検定
次のファイナンス基礎理論は金融商品の収益が正規分布に従っているという仮定に基づく
ポートフォリオ理論
(期待)平均収益と収益の分散(ボラティリティ)および株式間の共分散だけが投資意思決定に関係
資本資産格付けモデル
個別資産と市場指数の連動尺度β
効率的市場仮説
価格が入手可能な全情報を反映する市場とする
オプション価格付け理論
ブラウン運動は金融商品のランダムな価格変動をモデルかするための代表的なベンチマークモデル
13.1.1 ベンチマークケース
幾何ブラウン運動の経路特性
正規対数収益率
時間 0 < s < t の対数収益率 log S(t)/S(S) = log S(t) - log S(S) は正規分布に従う
対数正規値
任意の時刻 t > 0 において、値S(t)は対数正規分布に従う
プロット設定
scipy.stats や statsmodels.api のインポート
gen_path() を使って幾何ブラウン運動のモンテカルロ経路サンプルを生成
検定手続き normality_tests()
歪度検定(skewtest())
サンプルデータの歪みが「正規」か
尖度検定(kurtosistest())
サンプルデータの尖度が「正規」か
正規性検定(normaltest())
上記二つを組み合わせる
13.1.2 実世界データ
2つのテクノロジー株と2つのETF(上場投資信託)の過去の金融時系列を分析
非正規性を示す
ファットテール
サンプルデータセットが正規分布という検定仮説を強く棄却
13.2 ポートフォリオ最適化
現代ポートフォリオ理論(平均-分散ポートフォリオ理論)MPT
ファイナンス理論の土台
13.2.1 データ
基本的な考え方は分散化
所与の目標収益レベルで最小ポートフォリオリスク
または所与のリスクレベルで最大ポートフォリオ収益を達成
より多くの資産を分散して正しく組み合わせて持つことに分散効果
共分散行列
pandas
13.2.2 基本理論
投資家は金融商品でショートポジションは取れないと仮定
投資家資産の100%が、全ポジションがロング(正)かつポジションを足し合わせると100%になるように、投資可能な金融商品に分散
重みは足すと1になる
Σ(I)w(i) = 1
Iは金融商品の個数
w(i) > 0 が金融商品iの重み
期待ポートフォリオ収益の公式
μ(p) = E(Σ(I) w(i)r(i)) = Σ(I) w(i)E(r(i)) = Σ(I) w(i)μ(i) = w{T} μ
r(i)は状態に充足する将来の収益
μ(i)は証券iの期待収益
w{T} は転置重みベクトル
μは証券の期待収益のベクトル
期待ポートフォリオ分散
2つの証券の共分散は σ(ij) = σ(ji) = E(r(i) - μ(i)) (r(j) - μ(j))
1つの証券の分散は自分自身との共分散 σ(ji)^2 = E(r(i) - μ(i))^2
ポートフォリオ共分散行列を使うと
σ(p)^2 = w{T} Σw
モンテカルロシミュレーションを実装
ポートフォリオ集合は効率的フロンティアに
13.2.3 最適ポートフォリオ
この最小化関数はきわめて一般的でパラメータに等価制約、不等価制約、数値限界を課す
シャープ・レシオ最大化
シャープ・レシオの負値を最小化
ポートフォリオの分散最小化
ボラティリティの最小化と同じ
いわゆる最小ボラティリティすなわち最小分散ポートフォリオ
13.2.4 効率的フロンティア
最適ポートフォリオすべてを求める
先の最適化に似ている
効率的フロンティア
絶対最小分散ポートフォリオより高収益な全最適ポートフォリオ
所与のリスクレベルでの期待収益に関して他のすべてのポートフォリオより優位
13.2.5 資本市場線
現金や現預金という普遍的な無リスク投資
勘定に入れると、投資家の効率的な投資機会の集合をかなり強化できる
投資家がリスク資産の効率的ポートフォリオをまず決定、次に無リスク資産を加える
リスク-収益特性が無リスク資産と効率的ポートフォリオの間(リスク-収益空間)で直線になる
最適投資
その接線が無リスクポートフォリオのリスク-収益点を通る、効率的フロンティア上のポートフォリオ
13.3 ベイズ統計
エンピリカルファイナンスで広く使われている
13.3.1 ベイズの公式
通時的解釈
平均収益の時系列のように時間が経てば対象である変数やパラメータについて新たな情報が学べる
ベイズの公式
p(H|D) = ( p(H) p(D|H) ) / p(D)
Hは仮説の事象
Dは実験または実世界のデータ
table:ベイズの公式
p(H) 事前確率
p(D) 正規化関数と呼ばれる、仮説の下でのデータの確率
p(D|H) 仮説Hの下でのデータの尤度(すなわち確率)
p(H|D) 事後確率(すなわちデータを得た後の確率)
二つの箱B1とB2
箱B1には30の黒い玉と60の赤い玉
箱B2には60の黒い玉と30の赤い玉
2つの箱から1つの玉を無作為抽出
玉が黒だと仮定
仮説「H1:玉が箱B1から」「H2:玉が箱B2から」のそれぞれの確率は
事前確率:p(H1) = 1/2
正規化定数:p(D) = 1/2 × 1/3 + 1/2 × 2/3 = 1/2
尤度:p(D|H1) = 1/3
H1の更新された確率は、p(H1|D) = (1/2 × 1/3 ) / 1/2 = 1/3
H2はH1の2倍高い
13.3.2 ベイズ回帰
PyMC3
ベイズ統計と確率的プログラミングを実装
マルコフ連鎖モンテカルロ(MCMC)法
13.3.3 2つの金融商品
2つのETF、GLDとGDXの時系列データ
回帰方式の欠点
時間の経過に伴う進化を反映できない
最新で0たが最古のデータと同じように扱われる
13.3.4 時間の経過に伴う推定更新
通時的解釈
時間経過後の新データが更新や学習によりよい回帰や推定をもたらす
次のような仮定 回帰パラメータが、ある分布でランダムであるだけでなく、時間の経過に伴いランダムウォークする
13.4 機械学習
機械学習
自分自身で関係、パターンなどを生データから学ぶ様々な種類のアルゴリズム
取引戦略のアルゴリズムに話題を絞る
教師あり学習
教師なし学習
scikit-learn
機械学習アルゴリズムの実装だけでなく有用な前後処理のツールを多数備える
13.4.1 教師なし学習
機械学習アルゴリズムが生データからガイドなしに洞察を得る
k平均法
生データセットを複数サブセットにクラスタリングして、各サブセットにラベルをつける
混合ガウスモデル
13.4.1.1 データ
機械学習問題用サンプルデータセットを作成
13.4.1.2 k平均法
標準APIが利用できるk平均法の基本ステップ
モデルクラスインポート
モデルオブジェクトインスタンス化
モデルオブジェクトをデータに当てはめ
データの適合モデルの結果を予測
13.4.1.3 混合ガウス
13.4.2 教師あり学習
基地の結果または観測データを使った機械学習
生データにはすでに機械学習アルゴリズムが学習することが含まれる
推定問題ではなく分類問題に話を絞る
特徴量の組み合わせに対して比較的小さな集合に属するクラス(整数値)を割り当てる
教師あり学習ではカテゴリラベルをつけて、アルゴリズムが特徴量とカテゴリ(クラス)の関係を学ぶ
当てはめで所与の特徴量値の組み合わせから正しいクラスを見分ける
13.4.2.1 データ
13.4.2.2 ガウシアン・ナイーブ・ベイズ
GNB
様々な分類問題に対する基準アルゴリズムとして適切
13.4.2.3 ロジスティック回帰
LR
高速でスケーラブルな分類アルゴリズム
13.4.2.4 決定木
DT
よくスケールする
13.4.2.5 深層ニューラルネットワーク
DNN
推定と分類療法で最も強力な(同時に大量の計算が必要な)アルゴリズム
GoogleによるTensorFlow
複雑な非線形関係の学習とモデル化が可能
最近、大規模な実用化が可能に
深層学習
大量の反復ステップでパラメータ(重み)を調整、結果をデータと比較
モンテカルロシミュレ0ションに似ている
13.4.2.6 scikit-learnのDNN
2つの隠れ層だけで完全な結果に
13.4.2.7 TensorFlowのDNN
DNNClasifierクラス
13.4.2.8 特徴量変換
13.4.2.9 訓練と試験の分離とサポートベクターマシン
訓練、学習、予測すべてに同じデータを使っている
異なるデータ(サブ)セットの1つを訓練と学習に、別のを試験に使うことで品質向上
train_test_split()
サポートベクターマシン(SVM)
13.5 結論
正規性
ポートフォリオ最適化
ベイズ統計
機械学習
13.6 さらに学ぶために
第4部 アルゴリズム取引
14章 FXCMトレーディングプラットフォーム
FXCM Group, LLCのトレーディングプラットフォーム
RESTfulなストリームAPIとPythonラッパーパッケージfxcmpyとともに紹介
個人投資家や機関投資家に伝統的な取引アプリケーションとAPIによるプログラム取引ができる多数の金融商品を提供
主力商品は通貨ペアと主な株価指数と商品の差金決済取引(CFD)
14.1 開始
FXCM APIのドキュメント
fxcmpyのインストール
pip install fxcmpy
fxcmpyのドキュメント
デモアカウントは日本では使えない
14.2 データの取得
14.2.1 ティックデータの取得
14.2.2 ローソク足データの取得
14.3 APIを使う
14.3.1 過去のデータの取得
14.3.2 ストリームデータの取得
リアルタイムまたはストリームデータ処理のユーザー定義関数を使える
コールバック関数
14.3.3 発注
14.3.4 口座情報
14.4 結論
FXCMのREST APIでできること
APIを使うための設定
過去のティックデータの取得
過去のローソク足データの取得
ストリームデータをリアルタイム取得
市場に売買注文を出す
口座情報を調べる
14.5 さらに学ぶために
15章 取引戦略
アルゴリズム取引戦略
ロング、ショート、中立のポジションを取るよう設計されたアルゴリズムhに基づき人間の介在なしに行う
新たなデータを使い、金融商品の売買のためにポジションをロングと中立に切り替える
ベクトル化バックテスト方式
データを格納しているNumPyのndarrayとpandasのDataFrameオブジェクトにベクトル化演算を行い、一般に処理
深層学習と機械学習アルゴリズム
分類アルゴリズムを過去のデータで訓練
15.1 単純移動平均
単純移動平均(SMA)
15.1.1 データインポート
15.1.2 取引戦略
短期SMAが長期SMAより上ならロング(= +1)
短期SMAが長期SMAより下ならショート(= -1)
data['Position'] = np,where(data['SMA1'] < data['SMA2'], 1, -1)
15.1.3 ベクトル化バックテスト
実装
対数収益率を計算
+1 か -1 かで表されるポジションに対応する対応収益率を掛ける
15.1.4 最適化
総当たり方式で、さまざまなパラメータの組み合わせでベクトル化バックテストを単純に繰り返し、ランク付け
過剰適合の危険
15.2 ランダムウォーク仮説
上記の例はランダムウォーク仮説(RWH)とは対照的
金融市場の価格はランダムウォーク、すなわち連続時間でドリフトのない算
全く価値がないことに術ブラウン運動に従うと仮定
株価予測のさまざまな「テクニカル」や「チャーティスト」手続きには全く価値がないとする
RWHは効率的市場仮説(EMH)に合致
市場価格は「入手可能な全情報」を反映する
効率性の程度が弱、半強、強のように区分、何が「入手可能な全情報」かを具体的に定義
理論上は情報集合概念に基づく
ラグ付きの市場価格を作成し、OLS回帰で市場価格を予測
RWHとHMHがある程度支持できる
アルゴリズム取引戦略の価値を示すハードルは高い
15.3 線形最小二乗法
過去の対数収益率に基づき市場の方向性を予測
第1特徴量は金融時系列の1日分のラグを付けた対数収益率
第2特徴量は2日分
対数収益率は価格とは対照的に安定、適用の必要条件を満たす
収益予測に役立つ情報になる
「平均回帰性」、「モメンタム」や「トレンド」
15.3.1 データ
為替レートの過去の日時対数収益率為替レートの度数分布
15.3.2 回帰
最小二乗法を使用
対数収益率を使用
方向データだけを回帰の依存変数とする
15.4 クラスタリング
k平均法を使い、取引戦略策定に使うクラスタを自動生成
何らかのアルゴリズムで上方変動または下方変動を予測する特徴量値の2クラスタを識別
ガイド(教師)がなくてヒット率(全予測に対する正しい予測の個数)が50%を下回る
15.5 頻度アプローチ
金融市場の変動方向予測に頻度アプローチを実装
2つの実際の値の特徴量を二値特徴量に変換、それぞれの確率を二値特徴量の取りうる組み合わせ4つに対し評価
((0, 0), (0, 1), (1, 0), (1, 1))
pandas
15.6 分類
15.6.1 2つの二値特徴量
15.6.2 5つの二値特徴量
15.6.3 5つの離散か特徴りょう
15.6.4 逐次訓練と試験のぶんり
ある時点までのデータが入手できてそれで機械学習アルゴリズムを訓練する状況のシミュレーション
15.6.5 ランダム訓練と試験の分離
暗黙にパターンの予測能力が時間永続すると仮定
データ時系列を訓練と試験に分割できる
ランダム訓練と試験を分離し、標本外のデータを使って分類アルゴリズムのパフォーマンスをテスト
新しいデータに直面
15.7 深層ニューラルネットワーク
DNNは人間の脳の機能をエミュレーション
入力層(特徴量)、出力層(ラベル)、複数の隠れ層からなる
隠れ層の存在が深層に
より複雑な関係を学習して複数の種類の問題に対するパフォーマンスを上げる
15.7.1 scikit-learnのDNN
MLPClassifierアルゴリズム
パフォーマンスが良すぎる
強過剰適合を示唆
ランダム訓練と試験の分離を適用
15.7.2 TensorFlowのDNN
15.8 結論
アルゴリズム取引戦略
ランダムウォーク仮説
機械学習
15.9 さらに学ぶために
16章 自動取引
16.1 資本管理
全資本のうち何割の資本をアルゴリズム取引戦略に投じるか
取引で達成する主目的に依存
長期資産の最大化
ケリー基準
16.1.1 二項設定のケリー基準
コイントス
1/2 < p < 1, q = 1 - p < 1/2
b > 0 を賭ける
賭けB(確率関数)
EB = pb - qb = (p - q)b > 0 無限に資金のあるリスク中立ギャンブラーは、期待収益が最大になるよう可能な限り大きな額を賭ける
金融市場の取引は繰り返す
b(i)が日付iの賭け金、c(0)が初期資本
1日目の終わりの資本c(1)はその日の賭けの結果に依存
c(0) + b(1) または c(0) - b(1)に
n回の賭けの期待値
EB^n = c(0) + Σ(n, i=i) (p - q) b(i) 古典経済理論ではリスク中立、期待効用最大化エージェントでこの式を最大化
b(i) = C(i-1) で最大化 or 破産
長期資産の最大化にならない
ケリー基準が登場
1回ごとの賭け金の、利用可能資本に対する最適配分f*
c(n) = c(0) (1 + f)^h (1 - f)^t
hがn回の賭けで表の出る回数
tが裏の出る回数
n = h + t
長期資本最大化
賭け事の平均幾何成長率の最大化に帰着
期待平均成長率を最大化する最適なfの選択と定式化される
結果、1回ごとの賭けにf* = p - qで投資配分するのが最適
シミュレーション
16.1.2 株式と指数のケリー基準
今日の対象株式(指数)の値が与えられたとき、そこから1年後に2つの値しか取らない
実際の株式市場に近い形
実世界の例
単純なS&P 500指数のパッシブロングポジション
最適ケリーレバレッジはエクイティポジションに不安定な変動をもたらす
16.2 機械学習に基づいた取引戦略
機械学習を使用して市場価格の動く方向を予測するアプローとFXCMのREST APIを使って取得した過去データを組み合わせ、EUR/USD通貨ペアを使ってアルゴリズム取引戦略のあバックテスト
ベクトル化バックテストを使い、ビッド・アスク・スプレッドを比例取引コストとして勘定に入れる
16.2.1 ベクトル化バックテスト
日中データに基づく
5分足の4本値データ
機械学習を用いた戦略
二値化した収益データにラグを付けたものに基づく
特徴量とラベルデータを用い、さまざまな教師あり学習アルゴリズムを適用
scikit-learnのサポートベクターマシンアルゴリズム
逐次「訓練-試験」を分離して訓練およびテスト
精度スコアの代わりにヒット率(取引中の買った取引回数)を使うことも
他にも役立つ知見
重要な取引を正しく行うこと
取引戦略に含まれる取引コスト
16.2.2 最適レバレッジ
ケリー基準による最適レバレッジを求めるために平均と分散を計算
「半ケリー」基準
16.2.3 リスク分析
最大ドローダウン
直近高値からの最大損失(ディップ)
最長ドローダウン期間
取引戦略が直近高値に戻るまでの最長期間
バリューアットリスク(VaR)
ある取引期間と信頼期間における期待最大損失
16.2.4 モデルオブジェクトの最大化
のちに運用に使うため永続化
16.3 オンラインアルゴリズム
これまでテストしたのはオフラインアルゴリズム
完全データセットを使って問題解決
SVMアルゴリズムを二値化特徴量データと方向ラベルデータに基づいて訓練
実際には次々と到着するデータを処理、次の期間(足)の市場変動の方向を予測しなければならない
ストリームデータ環境
処理する問題
ティックデータ
リサンプリング
予測
注文
16.4 インフラストラクチャと運用
実際のファンドで運用するには適切なインフラストラクチャが必要
高信頼性
パフォーマンス
セキュリティ
16.5 ロギングと監視
アルゴリズムトレーダーの観点から必要なもの
ロギング
情報とイベントをのちの検査用にディスクに残す
リアルタイム監視
ソケット経由で重要なファイナンス情報の定常リアルタイムストリームが作られ、ローカルコンピューターで取得/処理できる
16.6 結論
ケリー基準による資本管理
パフォーマンスとリスクのベクトル化バックテスト
オフラインからオンライン取引アルゴリズムへの変換
運用に適したインフラストラクチャ
運用中のロギングと監視
16.7 Pythonスクリプト
16.7.1 自動取引戦略
16.7.2 戦略監視
16.8 さらに学ぶためにお
第5部 デリバティブ分析
価格付けライブラリDX
モデル化
シミュレーション
評価
リスク管理
アプリケーション
17章 評価フレームワーク
DXライブラリの開発フレームワーク
資産価格付けの基本定理
日付処理とリスク中立割引
定数短期割引の最も単純な場合
市場環境
17.1 資産価格付けの基本定理
資産価格付けの基本定理
マルチンゲール測度
割引リスク要因(確率過程)からドリフトを除去する確率測度
マルチンゲール測度の下では、全リスク要因が無リスク短期金利でドリフトし、無リスク短期金利へのリスクプレミアムを含む市場金利ではない
17.1.1 簡単な例
リスクに対する株式のリスクプレミアム
「株式」というリスク資産
今日 10 USBで、確率60%と40%で明日の株価が 20 USB と 0 USB に
「債権」という無リスク資産
今日も明日も10 USB
債権の無リスク収益は0
株式の期待収益は
(0.6 × 20 + 0.4 × 0) / 10 - 1 = 0.2
つまり20%
行使価格 15 USD のコールオプション
60%の確率で 5 USD、他は 0 USD 支払う
期待値は 0.6 × 5 - 3 USD
取引有価証券のポートフォリオによるオプションのペイオフ複製
実世界確立速度の期待値はオプションの過大評価
期待からコールオプションの価格を得る
リスク資産の株式が無リスク短期金利0でドリフトするよう確率を変え「さえ」すればよい
2.5 USD
17.1.2 一般的な結果
離散時間一般市場モデルM
資産価格付けの基本定理の定式化
資産価格付けの基本定理によれば次の3つは等しい
市場モデルMには裁定取引機会がない
P等価マルチンゲール測度の集合Qは空ではない
無矛盾線形価格システムの集合Pは空ではない
マルチンゲール方式またはリスク中立評価法
一般市場モデルの市場の完備性
17.2 リスク中立割引
該当日付のモデル化と処理
17.2.1 日付のモデル化と処理
17.2.2 定数短期金利
短期金利が時間を通して一定な場合
具体的日付または年の日割り表現
年の日割り表現がある日の始まり(0 a.m.)になることはめったににない
これらはほ等しい
ゼロクーポン債券(ZCB)
17.3 市場環境
抽象化
次のようなデータとPythonオブジェクトを格納する3つの辞書
定数
リスト
曲線
オブジェクト指向モデル化方式の利点
dx.constant_short_rateクラスのインスタンスが複数環境で生存できること
17.4 結論
モンテカルロシミュレーションで評価するPythonパッケージを構築する大プロジェクトの基本フレームワーク
リスク中立割引のために資産価格付けの基本定理の数学を数値活用するPythonクラス
モデル化、シミュレーション、評価や他の目的に該当データやPythonオブジェクトを集めたジェネリックなdx.market_environmentクラス
__init__.py
17.5 さらに学ために
18章 ファイナンスモデルのシミュレーション
DXパッケージの中心要素のシミュレーションクラスを実装
18.1 乱数の生成
標準正規分布
分散減少法
負相関経路
モーメントマッチング
18.2 ジェネリックシミュレーションクラス
他のすべてのシミュレーションクラスはこれらを共有し、それぞれがシミュレーションする確率過程の具体的な要素に専念
シミュレーションクラスのオブジェクトインスタンス化には次の3属性だけ
name
mar_env
corr
市場環境の役割
18.3 幾何ブラウン運動
18.3.1 シミュレーションクラス
GTMモデルの具象クラス
18.3.2 ユースケース
18.4 ジャンプ拡散
Mertonのジャンプ拡散モデル
18.4.1 シミュレーションクラス
18.4.2 ユースケース
18.5 平方根拡散
18.5.1 シユレーションクラス
18.5.2 ユースケース
18.6 結論
確率過程
幾何ブラウン運動
ジャンプ拡散
平方根拡散
標準正規分布に従う乱数生成の便利な関数
ジェンエリックモデルシミュレーションクラス
dx_simulation,py
19章 デリバティブ評価
オプションとデリバティブは長らくいわゆるウォール街のロケット科学者の専門領域だった
物理学などで高度な数学を使いこなすPhDを持った人々
モンテカルロシミュレーションのような数値計算手法によるモデルへの適用
理論モデルそのものより少しだけ簡単になった
ヨーロピアンタイムのオプションとデリバティブの評価について成り立つ
アメリカンオプション評価では最小二乗モンテカルロ(LSM)アルゴリズム
ジェネリック評価クラス
デルタとベガの数値評価
リスク管理
19.1 ジェネリック評価クラス
初期化
name
underlying
mar_env
payoff_func
メソッド
update()
delta()
vega()
デルタ
オプション値の数値モンテカルロ評価量の1階偏微分
ベガ
現在(瞬時)ボラティリティσ(0)に関するボラティリティの1階偏微分
19.2 ヨーロピアンタイプ
オプション値のモンテカルロ推定量を生成する単純化した手法
該当原資産リスク要因Sをリスク中立測度のしたでI回シミュレーションして、オプション満期Tにおける原資産のシミュレーションをできるだけ多く取得
すなわちS‾(T), i ∈ {1, 2, ..., I}
オプション満期のペイオフh(T)を原資産のすべてのシミュレーション値について計算
h(T)(S‾(T)(i)), i ∈ {1, 2, ..., I}
オプションの現在価値のモンテカルロ推定量を V(0)‾ ≡ e^(-rT) 1/I Σ(I, i=1) h(T)(S‾(T)(i))として求める
19.2.1 評価クラス
present_value()
generate_payoff()
19.2.2 ユースケース
19.3 アメリカンタイプ
ヨーロピアンタイプと比べるとはるかに複雑
評価クラスに進む前に評価理論が必要
19.3.1 最小二乗モンテカルロ
Longstaff-Schwartz(2001)方式だけが満足に解ける
MCSそれ自身が前進アルゴリズムなのに、アメリカンオプションの評価は一般に後退帰納法による
満期から初めて現在に後戻りするアメリカンオプションの連続値評価
連続値評価に最小二乗回帰を使う
原資産のシミュレーション値
オプションの価値
経路での実際の連続値
離散時間ではバミューダオプション(極限でアメリカンオプション)の値は最適停止問題
19.3.2 評価クラス
present_value()メソッドの最適決定ステップ
その決定に基づいてLSMアルゴリズムが推定連続値ではなく、内在価値が実際の連続値を取る
19.3.3 ユースケース
数学的に正しいアメリカンオプションの下限になる
双対評価が上限を与える
19.4 結論
モンテカルロシミュレーションに基づくヨーロピアン/アメリカンオプションの数値評価
dx.valuation_class()
ギリシャ手法(デルタ、ベガ)評価手法
dx.valuation_mcs_europian
リスク中立評価法と期待値項の数値見積評価
dx.valuation_mcs_american
最小二乗モンテカルロ(LSM)
DXデリバティブ分析パッケージの方式により手軽に次のような特徴量の評価
単一リスク要因
ヨーロピアン/アメリカンタイプ
任意のペイオフ
dx_valuationn.py
19.5 さらに学ぶために
20章 ポートフォリオ分析
モンテカルロシミュレーションだけを数値計算手法として採用
分析パッケージをほぼ完全にモジュール化
割引
関連データ
シミュレーションオブジェクト
評価オブジェクト
ポートフォリオの評価
非冗長性
相関
ポジション
単一通貨建てと仮定
20.1 デリバティプポジション
評価オブジェクトとモデル化した商品の数量の組み合わせ
20.1.2 クラス
20.1.2 ユースケース
20.2 デリバティブポートフォリオ
対象市場は主として該当リスク要因(原資産)とその相関および評価されるデリバティブとデリバティブオプションからなる
一般市場モデルM
資産価格付けの基本定理
20.2.1 クラス
複数該当リスク要因と複数デリバティブポジションを考慮した資産価格付けの基本定理に基づくポートフォリオ評価を実装
20.2.2 ユースケース
ポートフォリオ現在価値度数分布
20.3 結論
複数のリスク要因(相関可)に依存する複数デリバティブポジションのポートフォリオ評価とリスク管理
derivatives_position
より複雑な業務を実装するderivatives_portfolio
リスク要因間の相関
シミュレションオブジェクトのインスタンス化
ポートフォリオ統計量生成
20.4 さらに学ぶために
21章 市場に基づいた評価
活発に取引されていないオプションの価格付けを行う
活発に取引されているオプションの市場価格の価格付けモデルをキャリブレーションして求めたモデルで行う
DAX 30株価指数に基づいたケーススタディ
21.1 オプションデータ
21.2 モデルキャリブレーション
21.2.1 該当市場データ
21.2.2 オプションのモデル化
21.2.3 キャリブレーション手続き
オプション価格付けモデルのキャリブレーションは一般的に凸最適化問題
オプションの市場価格とモデルから得られるオプション価格との平均二乗誤差(MSE)
総当たり最小化
21.3 ポートフォリオ評価
DAX 30指数のアメリカンプットオプションポートフォリオ
21.3.1 オプションポジションのモデル化
21.3.2 オプションポートフォリオ
21.4 Pythonコード
21.5 結論
実世界デリバティブ分析アプリケーション
データの取得
モデルキャリブレーション
ポートフォリオ評価
21.5.6 さらに学ぶために
付録A 日付と時刻
付録B BSMオプションクラス