分布を表す2つの数
リターンの列を別の列と比べるのは大変です。2つの数が大半を要約します。平均はリターンの中心がどこにあるか、分散はその中心の周りにどれだけ散らばっているかを表します。n 個のリターンの平均は sum(x) / n です。偏差 x - mean の合計は常に0なので、ばらつきを測るにはまず二乗します。標本分散は二乗偏差の合計を n ではなく n - 1 で割ったものです。平均を同じデータから推定したため偏差がやや小さくなり、n - 1 で割るとそれが補正されます。
variance = sum((x - mean)^2) / (n - 1) std = sqrt(variance)
import numpy as np
returns = np.array([0.004, -0.002, 0.001, 0.003, -0.004, 0.002, 0.006, -0.001])
mean = returns.mean()
deviations = returns - mean
print(round(mean, 5)) # 0.00113
print(abs(deviations.sum()) < 1e-12) # True the deviations always add up to zero
variance = (deviations ** 2).sum() / (len(returns) - 1)
print(round(variance, 8), round(returns.var(ddof=1), 8)) # 1.098e-05 1.098e-05 the same as numpy's var(ddof=1)標準偏差とボラティリティ
二乗によって単位が変わりました。リターンの分散の単位は「パーセントの二乗」です。その平方根である標準偏差はリターンと同じ単位に戻り、金融ではボラティリティと呼ばれます。最も一般的なリスクの尺度です。大型株の典型的な1日の動きは1〜2%程度、つまり日次ボラティリティは0.01〜0.02です。平均との関係で読み、日次ボラティリティ1.2%なら -3.6% の日は3標準偏差離れています。
std = np.sqrt(variance)
print(round(std, 6), round(returns.std(ddof=1), 6)) # 0.003314 0.003314 daily volatility of these returns
# How many standard deviations is the worst day from the mean?
print(round((returns.min() - mean) / std, 2)) # -1.55年率換算とシャープレシオ
日次の数字は小さく実感しにくいため、年率で示します。平均は時間に比例して増え(年252営業日なら252倍)、ボラティリティは時間の平方根に比例して増えます(sqrt(252) 倍、約15.9)。ランダムな日々の変動が部分的に打ち消し合うため、不確実性は平均よりゆっくり積み上がるからです。シャープレシオは無リスク金利を上回る平均リターン(超過リターン)をボラティリティで割ったもので、リスク1単位あたりの報酬を同じ方法で年率換算します。穏やかな戦略と荒い戦略を比べられます。
periods = 252
print(round(mean * periods, 4)) # 0.2835 annual mean: 28.35% (a made-up, very lucky sample)
print(round(std * np.sqrt(periods), 4)) # 0.0526 annual volatility: 5.26%
risk_free = 0.0001 # risk-free return of one day
excess = returns - risk_free
sharpe = excess.mean() / np.sqrt(((excess - excess.mean()) ** 2).sum() / (len(excess) - 1)) * np.sqrt(periods)
print(round(sharpe, 3)) # 4.91 absurdly good, because 8 lucky days prove nothing# How precisely do 8 days pin down the mean? The standard error is std / sqrt(n)
standard_error = std / np.sqrt(len(returns))
print(round(float(standard_error), 6)) # 0.001172 larger than the mean itself (0.00113)統計量は標本から得られる8日間の平均は非常にノイズの多い推定です。標準誤差はおよそ
std / sqrt(n) で、ここでは0.0012と平均そのもの(0.0011)より大きくなります。数週間の素晴らしいシャープレシオはあまり意味を持ちません。観測が多いほど平均を信頼でき、リスクの数字は平均リターンよりずっと安定しています。- 平均は
x.mean()、標本分散は((x - mean) ** 2).sum() / (n - 1)、ボラティリティはその平方根 - 平均は
* periods、ボラティリティは* sqrt(periods)で年率換算する。リスクは時間の平方根で増える - シャープ = 平均超過リターン / その標準偏差 *
sqrt(periods)。リスク1単位あたりの報酬で、短い標本では信頼できない
次は歪度と尖度です。中心とばらつきを超えて、分布の形を表す2つの統計量を学びます。
ラボ:採点される内容
sample_varianceでリターンのばらつきを測る25点sample_stdでばらつきをリターンと同じ単位にする25点annualized_statsで平均とボラティリティを年率換算する25点sharpe_ratioでリスク1単位あたりのリターンを評価する25点