ニューラルネットのリスク管理

Pythonで学ぶ定量的リスク管理

Jamsheed Shorish

Computational Economist

リアルタイムのポートフォリオ更新

  • リスク管理
    • 定義された指標(VaR, CVaR)
    • 推定された指標(パラメトリック、ヒストリカル、モンテカルロ)
    • 最適化ポートフォリオ(例: 近代ポートフォリオ理論)
  • 新しい市場情報 => ポートフォリオ比率を更新
    • 課題: 最適化は計算負荷大
    • 解決: $\text{weights} = f(\text{prices})$
    • $f$ をリアルタイム評価
    • $f$ の更新は時々のみ
Pythonで学ぶ定量的リスク管理

ニューラルネットワーク

  • ニューラルネット: $\text{output} = f(\text{input})$
    • ニューロン: 関数内で相互接続された処理ノード
  • 1940〜50年代に開発
  • 2000年代初頭: ビッグデータへ適用拡大
    • 画像認識・処理
    • 金融データ
    • 検索エンジンデータ
  • ディープラーニング: 機械学習の一部としてのニューラルネット
    • 2015年: GoogleがPython向けオープンソースのTensorFlowを公開
Pythonで学ぶ定量的リスク管理

ニューラルネットの構造

  • 層: 接続された処理ニューロン
    • 入力層

ニューラルネットの入力層

Pythonで学ぶ定量的リスク管理

ニューラルネットの構造

  • ニューラルネットの構造
    • 入力層
    • 隠れ層

ニューラルネットの隠れ層

Pythonで学ぶ定量的リスク管理

ニューラルネットの構造

  • ニューラルネットの構造
    • 入力層
    • 隠れ層
    • 出力層
  • 学習: 入力と出力の関係を学ぶ

入力層・隠れ層・出力層の画像

Pythonで学ぶ定量的リスク管理

ニューラルネットの構造

  • ニューラルネットの構造
    • 入力層
    • 隠れ層
    • 出力層
  • 学習: 入力と出力の関係を学ぶ
    • 資産価格 => 入力層

資産価格がニューラルネットに入力される画像

Pythonで学ぶ定量的リスク管理

ニューラルネットの構造

  • ニューラルネットの構造
    • 入力層
    • 隠れ層
    • 出力層
  • 学習: 入力と出力の関係を学ぶ
    • 資産価格 => 入力層
    • 入力層+隠れ層で処理

ニューラルネットの重みのエッジ画像

Pythonで学ぶ定量的リスク管理

ニューラルネットの構造

  • ニューラルネットの構造
    • 入力層
    • 隠れ層
    • 出力層
  • 学習: 入力と出力の関係を学ぶ
    • 資産価格 => 入力層
    • 入力層+隠れ層で処理
    • 隠れ層+出力層で処理

隠れ層から出力層への重みの画像

Pythonで学ぶ定量的リスク管理

ニューラルネットの構造

  • ニューラルネットの構造
    • 入力層
    • 隠れ層
    • 出力層
  • 学習: 入力と出力の関係を学ぶ
    • 資産価格 => 入力層
    • 入力層+隠れ層で処理
    • 隠れ層+出力層で処理
    • 出力 => ポートフォリオ比率

出力層がポートフォリオ比率として示される画像

Pythonで学ぶ定量的リスク管理

ポートフォリオ最適化へのニューラルネット活用

  • 学習
    • 出力と既存の「最良」ポートフォリオ比率を比較
    • 目的: 出力と比率の「誤差」を最小化
    • 誤差が小さい => ネットワークは学習済み
  • 利用
    • 入力: 未観測の新しい資産価格
    • 出力: 新価格に対する予測「最良」ポートフォリオ比率
    • 最良の比率 = リスク管理
Pythonで学ぶ定量的リスク管理

Pythonでニューラルネットを作成

 

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense
model = Sequential() model.add(Dense(10, input_dim=4, activation='sigmoid')) model.add(Dense(4))
Pythonで学ぶ定量的リスク管理

Pythonでのネットワーク学習

  • 過去の資産価格: training_input 行列
  • 過去のポートフォリオ比率: training_output ベクトル
  • モデルをコンパイル:
    • 指定の誤差最小化('loss')
    • 指定の最適化アルゴリズム('optimizer')
  • 学習データにフィット
    • epochs: 内部パラメータを更新する学習ループ数
model.compile(loss='mean_squared_error', optimizer='rmsprop')

model.fit(training_input, training_output, epochs=100)
Pythonで学ぶ定量的リスク管理

Pythonでのリスク管理

  • 利用: 新規(例: リアルタイム)資産価格データを投入
    • 新ベクトル new_asset_prices を入力層へ
  • 新価格で model.predict() を評価
    • 結果: predicted ポートフォリオ比率
  • データが十分たまったら => 再学習
    • 過去データで検証 => バックテスト
# new asset prices are in the vector new_asset_prices
predicted = model.predict(new_asset_prices)
Pythonで学ぶ定量的リスク管理

Let's practice!

Pythonで学ぶ定量的リスク管理

Preparing Video For Download...