虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

Pythonによるファイナンス(第2版)を読んだ感想

こんにちは!虎の穴ラボのNSSです。

虎の穴ラボではオライリー・ジャパン社の定期購読サービスを利用しており、
毎月新刊をいち早く読めるようになっています。
今回は12/24に刊行された「Pythonによるファイナンス(第2版)」を読んだ感想を共有したいと思います。

f:id:toranoana-lab:20200331174959j:plain

www.oreilly.co.jp

読もうと思ったきっかけ

数年前から少しだけ投資をしていたので、タイトルから興味を惹かれました。 Pythonを使って自分の投資ポートフォリオを評価したり、自動取引ができたら楽しそうだと思いました。

目次

目次

日本語版まえがき
まえがき

第1部  Pythonとファイナンス

1章 なぜファイナンスにPythonを使うのか
    1.1 プログラミング言語Python
        1.1.1 Pythonの大まかな歴史
        1.1.2 Pythonエコシステム
        1.1.3 Pythonのユーザ層
        1.1.4 科学スタック
    1.2 ファイナンスにおけるITテクノロジー
        1.2.1 ITテクノロジーコスト
        1.2.2 エネーブラーとしてのITテクノロジー
        1.2.3 参入障壁としてのテクノロジーと人材
        1.2.4 限りなく増加する速度、頻度、データ量
        1.2.5 リアルタイム分析の勃興
    1.3 ファイナンスのためのPython
        1.3.1 ファイナンスとPythonの構文
        1.3.2 Pythonによる効率と生産性
        1.3.3 プロトタイプからプロダクションへ
    1.4 データ駆動型ファイナンスとAIファーストファイナンス
        1.4.1 データ駆動型ファイナンス
        1.4.2 AIファーストファイナンス
    1.5 結論
    1.6 さらに学ぶために

2章 Pythonインフラストラクチャ
    2.1 パッケージマネージャconda
        2.1.1 Minicondaのインストール
        2.1.2 condaの基本操作
    2.2 仮想環境マネージャとしてのconda
    2.3 Dockerコンテナを使う
        2.3.1 Dockerイメージとコンテナ
        2.3.2 UbuntuのPython Dockerイメージを作る
    2.4 クラウドインスタンスを使う
        2.4.1 RSA公開/秘密鍵
        2.4.2 Jupyter Notebook設定ファイル
        2.4.3 PythonとJupyter Notebookのインストールスクリプト
        2.4.4 Dropletのセットアップのオーケストレーションスクリプト
    2.5 結論
    2.6 さらに学ぶために

第2部 基本の習得

3章 データ型とデータ構造
    3.1 基本データ型
        3.1.1 整数
        3.1.2 float(浮動小数点数)
        3.1.3 ブール値(真偽値、論理値)
        3.1.4 文字列
        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の構造化配列
    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章 オブジェクト指向プログラミング
    6.1 Pythonオブジェクトのオブジェクト指向
        6.1.1int 
        6.1.2list 
        6.1.3 ndarray
        6.1.4 DataFrame
    6.2 Pythonクラスの基本
    6.3 Pythonデータモデル
    6.4 Vectorクラス
    6.5 結論
    6.6 さらに学ぶために

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

7章 データ可視化
    7.1 静的2Dプロット
        7.1.1 1次元データセット
        7.1.2 2次元データセット
        7.1.3 他のプロットスタイル
    7.2 静的3Dプロット
    7.3 インタラクティブ2Dプロット
        7.3.1 基本プロット
        7.3.2 ファイナンスのプロット
    7.4 結論
    7.5 さらに学ぶために

8章 金融時系列データ
    8.1 金融データ
        8.1.1 データのインポート
        8.1.2 要約統計量
        8.1.3 時間の経過に伴う変化
        8.1.4 リサンプリング
    8.2 ローリング統計
        8.2.1 概観
        8.2.2 テクニカル分析の例
    8.3 相関分析
        8.3.1 データ
        8.3.2 対数収益率
        8.3.3 OLS回帰
        8.3.4 相関
    8.4 高頻度データ
    8.5 結論
    8.6 さらに学ぶために

9章 入出力操作
    9.1 Pythonの基本I/O
        9.1.1 ディスクへのオブジェクト書き出し
        9.1.2 テキストファイルの読み書き
        9.1.3 SQLデータベースの処理
        9.1.4 NumPy配列の読み書き
    9.2 pandasのI/O
        9.2.1 SQLデータベースの処理
        9.2.2 SQLからpandasへの変換
        9.2.3 CSVファイルの処理
        9.2.4 Excelファイルの処理
    9.3 PyTablesを使ったI/O
        9.3.1 テーブル処理
        9.3.2 圧縮テーブルの処理
        9.3.3 配列の処理
        9.3.4 メモリ外計算
    9.4 TsTablesのI/O
        9.4.1 サンプルデータ
        9.4.2 データストレージ
        9.4.3 データの取得
    9.5 結論
    9.6 さらに学ぶために

10章 高性能Python
    10.1 ループ
        10.1.1 Python
        10.1.2 NumPy
        10.1.3Numba 
        10.1.4 Cython
    10.2 アルゴリズム
        10.2.1 素数
        10.2.2 フィボナッチ数
        10.2.3 円周率
    10.3 二項ツリー
        10.3.1 Python
        10.3.2 NumPy
        10.3.3Numba 
        10.3.4 Cython
    10.4 モンテカルロシミュレーション
        10.4.1 Python
        10.4.2 NumPy
        10.4.3Numba 
        10.4.4 Cython
        10.4.5 マルチプロセス
    10.5 再帰pandasアルゴリズム
        10.5.1 Python
        10.5.2Numba 
        10.5.3 Cython
    10.6 結論
    10.7 さらに学ぶために

11章 数学ツール
    11.1 近似
        11.1.1 回帰
        11.1.2 補間

    11.2 凸最適化
        11.2.1 大域最適化
        11.2.2 局所最適化
        11.2.3 制約付き最適化
    11.3 積分
        11.3.1 数値積分
        11.3.2 シミュレーション積分
    11.4 記号計算
        11.4.1 基本
        11.4.2 方程式
        11.4.3 微積分
        11.4.4 微分
    11.5 結論
    11.6 さらに学ぶために

12章 ストキャスティクス
    12.1 乱数
    12.2 シミュレーション
        12.2.1 確率変数
        12.2.2 確率過程
        12.2.3 分散減少法
    12.3 評価
        12.3.1 ヨーロピアンオプション
        12.3.2 アメリカンオプション
    12.4 リスク尺度
        12.4.1 バリューアットリスク(VaR)
        12.4.2 信用評価調整
    12.5 Pythonスクリプト
    12.6 結論
    12.7 さらに学ぶために

13章 統計
    13.1 正規性検定
        13.1.1 ベンチマークケース
        13.1.2 実世界データ
    13.2 ポートフォリオ最適化
        13.2.1 データ
        13.2.2 基本理論
        13.2.3 最適ポートフォリオ
        13.2.4 効率的フロンティア
        13.2.5 資本市場線
    13.3 ベイズ統計
        13.3.1 ベイズの公式
        13.3.2 ベイズ回帰
        13.3.3 2つの金融商品
        13.3.4 時間の経過に伴う推定更新
    13.4 機械学習
        13.4.1 教師なし学習
        13.4.2 教師あり学習
    13.5 結論
    13.6 さらに学ぶために

第4部 アルゴリズム取引

14章 FXCMトレーディングプラットフォーム
    14.1 開始
    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 結論
    14.5 さらに学ぶために

15章 取引戦略
    15.1 単純移動平均
        15.1.1 データインポート
        15.1.2 取引戦略
        15.1.3 ベクトル化バックテスト
        15.1.4 最適化
    15.2 ランダムウォーク仮説
    15.3 線形最小二乗法
        15.3.1 データ
        15.3.2 回帰
    15.4 クラスタリング
    15.5 頻度アプローチ
    15.6 分類
        15.6.1 2つの二値特徴量
        15.6.2 5つの二値特徴量
        15.6.3 5つの離散化特徴量
        15.6.4 逐次訓練と試験の分離
        15.6.5 ランダム訓練と試験の分離
    15.7 深層ニューラルネットワーク
        15.7.1 scikit-learnのDNN
        15.7.2 TensorFlowのDNN
    15.8 結論
    15.9 さらに学ぶために

16章 自動取引
    16.1 資本管理
        16.1.1 二項設定のケリー基準
        16.1.2 株式と指数のケリー基準
    16.2 機械学習に基づいた取引戦略
        16.2.1 ベクトル化バックテスト
        16.2.2 最適レバレッジ
        16.2.3 リスク分析
        16.2.4 モデルオブジェクトの永続化
    16.3 オンラインアルゴリズム
    16.4 インフラストラクチャと運用
    16.5 ロギングと監視
    16.6 結論
    16.7 Pythonスクリプト
        16.7.1 自動取引戦略
        16.7.2 戦略監視
    16.8 さらに学ぶために

第5部 デリバティブ分析

17章 評価フレームワーク
    17.1 資産価格付けの基本定理
        17.1.1 簡単な例
        17.1.2 一般的な結果
    17.2 リスク中立割引
        17.2.1 日付のモデル化と処理
        17.2.2 定数短期金利
    17.3 市場環境
    17.4 結論
    17.5 さらに学ぶために

18章 ファイナンスモデルのシミュレーション
    18.1 乱数の生成
    18.2 ジェネリックシミュレーションクラス
    18.3 幾何ブラウン運動
        18.3.1 シミュレーションクラス
        18.3.2 ユースケース
    18.4 ジャンプ拡散
        18.4.1 シミュレーションクラス
        18.4.2 ユースケース
    18.5 平方根拡散
        18.5.1 シミュレーションクラス
        18.5.2 ユースケース
    18.6 結論
    18.7 さらに学ぶために

19章 デリバティブ評価
    19.1 ジェネリック評価クラス
    19.2 ヨーロピアンタイプ
        19.2.1 評価クラス
        19.2.2 ユースケース
    19.3 アメリカンタイプ
        19.3.1 最小二乗モンテカルロ
        19.3.2 評価クラス
        19.3.3 ユースケース
    19.4 結論
    19.5 さらに学ぶために

20章 ポートフォリオ評価
    20.1 デリバティブポジション
        20.1.1 クラス
        20.1.2 ユースケース
    20.2 デリバティブポートフォリオ
        20.2.1 クラス
        20.2.2 ユースケース
    20.3 結論
    20.4 さらに学ぶために

21章 市場に基づいた評価
    21.1 オプションデータ
    21.2 モデルキャリブレーション
        21.2.1 該当市場データ
        21.2.2 オプションのモデル化
        21.2.3 キャリブレーション手続き
    21.3 ポートフォリオ評価
        21.3.1 オプションポジションのモデル化
        21.3.2 オプションポートフォリオ
    21.4 Pythonコード
    21.5 結論
    21.6 さらに学ぶために

付録A 日付と時刻
    A.1 Python
    A.2 NumPy
    A.3 pandas

付録B BSMオプションクラス
    B.1 クラス定義
    B.2 クラスの使用法

訳者あとがき
索引

概要

Pythonを使用した金融工学について書かれた本です。 第1部から第5部まであり、 第1部第2部では、Pythonとファイナンスがなぜ相性がいいのかということ、開発環境の構築、 本書で扱うPythonやライブラリの基礎について書かれています。 Pythonをあまり知らない人でも問題ありません。

第3部からは、データの入出力、可視化、数学的、統計など、本書の肝となる幅広い知識を学習します。

第4部第5部は、数学的知識や機械学習などを使って、 取引戦略、自動取引、シミュレーションやポートフォリオ評価など、実践的な金融工学について学習します。

感想

Pythonの入門的な部分から機械学習、本格的なデリバティブ分析まで網羅したとても情報量の多い1冊です。
Pythonについては、初心者でも問題なく実装ができるように、実装のサンプルや解説が詳しく記載されています。
数学的知識や金融機関特有の専門用語が非常に多く、
実際に金融機関に所属していて業務知識があり、これからPythonで実装を始めるエンジニア向けと感じました。
ただ、専門用語がわからなくてもソースコードはシンプルなので、実装に詰まることはないと思います。
実装したソースを実行し、出力されたグラフが何を表すのか、後で調べる形で進めるのがいいと思います。

注意が必要な点として、本書の原作者は外国の方で、金融システムに関わる環境が日本とは異なっています。
本書の中でFXCMという会社が提供するAPIを使用する記載があるのですが、
日本人は口座を作ることができないので、こちらのAPIを使用することができません。
日本人が使える代替のAPIがないか調べましたが、
2020年3月現在、日本で個人向けに無料の自動取引APIを提供している金融機関は、私の調べた限り存在しませんでした。
FXや仮想通貨に限定すれば存在するようですが、株式に関しては難しいのが現状です。
日本で自動取引をしている人は、テストツールであるSereniumを使用したり、
スクレイピングをしたりしているようですが、
Webサイトの規約に違反する可能性もあるため、あまりおすすめできません。
日本人が個人利用できる株式の取引用APIがもしあれば、情報お待ちしています。

最後に

情報量の多さや金融事情の違いで、学習難易度はかなり高いと感じましたが、 時間をかけて1章ずつじっくり読んでいけば理解できる内容なので投資や金融業界に興味がある方は、ぜひ読んでみてください。

今回学んだ知識を使って、今後自分の投資ポートフォリオの評価をしてくれるツールを作ろうと思います。
また、本書を読んでPythonを使ったデータ分析に興味が湧いたので、金融以外のデータ分析も勉強しようと思います。

P.S

4/22(水) オンラインにて虎の穴ラボによるLT会を開催します!! ぜひご参加ください!!

yumenosora.connpass.com
虎の穴ラボでの開発に少しでも興味を持っていただけた方は、採用説明会やカジュアル面談という場でもっと深くお話しすることもできます。ぜひお気軽に申し込みいただければ幸いです。 虎の穴ラボのエンジニアが、開発プロセスの内容であったり、「今季何見ました?」といったオタクトークであったり、何でもお応えします。

WantedlyLAPLASでの採用も行っております)

yumenosora.co.jp

news.toranoana.jp