あるリターンを別のリターンで説明する
株は単独で動くことがまれで、市場が上がればたいてい一緒に上がります。線形回帰は、リターンの組(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 correlationCAPM:ベータとアルファ
金融ではこの回帰に名前があります。ベータは市場への感応度で、ベータ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点