σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academyロードマップ
Ctrl K
AO
+1.2k 人の学習者
ログイン参加する ↗
ロードマップ
AO
+1.2k 人の学習者
ログイン
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python ロードマップ›モジュール 3 · 確率とモンテカルロ・シミュレーション›トピック 3.5·~55 分中級

線形回帰(OLS)

ロードマップ上の位置モジュール 3/11 · トピック 5/12
3.5 線形回帰(OLS)
—ラボスコア— / 100合計XP—連続日数—

あるリターンを別のリターンで説明する

株は単独で動くことがまれで、市場が上がればたいてい一緒に上がります。線形回帰は、リターンの組(x:市場、y:株)に直線 y = alpha + beta * x をあてはめてその関係を数量化します。最小二乗法(OLS)は、縦方向のずれ(残差)の二乗和を最小にする直線を選びます。結果は閉じた式で、傾き beta は x と y の共分散を x の分散で割ったもの、切片 alpha は直線を平均の点に通すように決まります。

beta = sum((x - mean_x) * (y - mean_y)) / sum((x - mean_x)^2) alpha = mean_y - beta * mean_x
import numpy as np

market = np.array([0.010, -0.005, 0.004, 0.012, -0.008, 0.003, -0.002, 0.007, 0.001, -0.004])
asset  = np.array([0.013, -0.004, 0.007, 0.016, -0.011, 0.004, -0.001, 0.011, 0.002, -0.007])

dx = market - market.mean()                      # deviations of x from its mean
beta = (dx * (asset - asset.mean())).sum() / (dx ** 2).sum()
alpha = asset.mean() - beta * market.mean()
print(round(beta, 4), round(alpha, 5))           # 1.3271 0.00061   the asset moves 1.33 times as much as the market

残差と決定係数

残差は、1つの観測について直線が説明できない部分 y - (alpha + beta * x) です。OLSの残差は常に合計が0で、x とも無相関になるため、自分のコードの確認に便利です。決定係数(R²)は直線が y の変動のどれだけを説明するかを示します:1 - sum(残差²) / sum((y - mean_y)²)。0(平均より良くない)から1(すべての点が直線上)までで、単回帰では x と y の相関係数の二乗に等しくなります。

residuals = asset - (alpha + beta * market)
print(abs(residuals.sum()) < 1e-12, abs((residuals * market).sum()) < 1e-12)   # True True   the OLS fingerprints

ss_res = (residuals ** 2).sum()
ss_tot = ((asset - asset.mean()) ** 2).sum()
print(round(1 - ss_res / ss_tot, 4))                  # 0.9785
print(round(np.corrcoef(market, asset)[0, 1] ** 2, 4))   # 0.9785   the squared correlation

CAPM:ベータとアルファ

金融ではこの回帰に名前があります。ベータは市場への感応度で、ベータ1.3は、その株が市場より30%大きく上にも下にも動きやすいことを意味します。アルファは市場へのエクスポージャーを差し引いた後に残る平均リターンで、運用者が実力として主張するものです。無リスク金利を除くため、CAPMの回帰では、資産も市場も無リスク金利を引いた超過リターンを使います。アルファがゼロに近い戦略は、市場エクスポージャーが姿を変えただけです。

risk_free = 0.0001                                 # risk-free return of one day
x = market - risk_free                             # excess returns of the market
y = asset - risk_free                              # excess returns of the asset

beta = ((x - x.mean()) * (y - y.mean())).sum() / ((x - x.mean()) ** 2).sum()
alpha = y.mean() - beta * x.mean()
print(round(beta, 4), round(alpha, 6))             # 1.3271 0.000644   a daily alpha of 0.064%, on 10 days of data
# Points exactly on y = 1 + 2x: the fit recovers the line
x = np.array([1.0, 2.0, 3.0, 4.0])
y = 1 + 2 * x
dx = x - x.mean()
slope = (dx * (y - y.mean())).sum() / (dx ** 2).sum()
print(y.mean() - slope * x.mean(), slope)      # 1.0 2.0
直線は原因ではない回帰は標本の中で2つの系列がどう一緒に動いたかを表すだけで、一方が他方を動かすことの証明ではなく、数値は不確かさを伴う推定値です。10日分ではベータは粗く、アルファはノイズに埋もれます。ベータは時間や市場局面によっても変わるので、1つの数字を信じ続けず、ローリング窓で推定し直しましょう。
  • OLSは残差の二乗和を最小にする:beta = cov(x, y) / var(x)(中心化した積の和)、alpha = mean_y - beta * mean_x
  • 残差 y - (alpha + beta * x) の合計は0。R²(1 - ss_res / ss_tot)は説明された分散の割合
  • CAPM:資産の超過リターンを市場の超過リターンに回帰する。ベータは市場エクスポージャー、アルファは残り

次はボラティリティです。リターンの変動の大きさを測り、予測します。

ラボ:採点される内容

  • ols_fit で点に直線をあてはめる25点
  • residuals で直線が説明できない部分を測る25点
  • r_squared で当てはまりを評価する25点
  • capm_alpha_beta で資産を市場エクスポージャーと実力に分ける25点
エクスプローラー · lab-58-1
▾ lab-58-1
…
bash · ブラウザ内
learner@quantcraft:~/lab-58-1$
Pythonは未読み込みPythonLn 1, Col 1Spaces: 4UTF-8

このトピックをリセットしますか?

lab-58-1 の内容はすべてスターターファイルに戻り、ターミナルも消去されます。現在の解答は失われ、元に戻せません。

リセットされるもの
  • main.py → スターターコード
  • ターミナル履歴とテスト出力
  • 未提出の変更
保持されるもの
  • ラボの最高スコア
  • XPと連続日数
  • 講義の進捗とメモ

コードを実行するにはログインしてください。

レクチャーはすべて無料で読めます。コードの実行、テスト、ラボの提出にはアカウントの作成かログインが必要です。

  • ブラウザ内IDEとbashターミナル。インストール不要
  • 即時採点、XP、ロードマップでの現在地
アカウントを作成ログイン
または
GitHubで続ける