σμ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.1·~40 分中級

リターンの平均と分散

ロードマップ上の位置モジュール 3/11 · トピック 1/12
3.1 リターンの平均と分散
—ラボスコア— / 100合計XP—連続日数—

分布を表す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点
エクスプローラー · lab-54-1
▾ lab-54-1
…
bash · ブラウザ内
learner@quantcraft:~/lab-54-1$
Pythonは未読み込みPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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