σμ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—连续天数—

概括一个分布的两个数

一列收益率很难与另一列比较。两个数字就能概括大部分信息:均值说明收益率集中在哪里,方差说明它们围绕这个中心散得多开。对 n 个收益率,均值是 sum(x) / n;偏差 x - mean 之和总是 0,所以衡量离散程度时要先平方。样本方差是偏差平方和除以 n - 1 而不是 n:均值是用同一批数据估计的,这使偏差略微偏小,除以 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% 到 2%,也就是日波动率 0.01 到 0.02。它要相对均值来读:日波动率为 1.2% 时,跌 3.6% 的那一天偏离三个标准差。

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。原因是随机的每日波动会部分抵消,所以不确定性累积得比均值慢。夏普比率用高于无风险利率的平均收益(超额收益)除以波动率:即每单位风险的回报,按同样方式年化。它让你能比较平稳的策略和剧烈的策略。

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):每单位风险的回报;样本短则不可靠。

下一节:偏度与峰度,这两个统计量描述分布在中心与离散程度之外的形状。

实验:评分内容

  • 用 sample_variance 衡量收益率的离散程度25 分
  • 用 sample_std 把离散程度换算成与收益率相同的单位25 分
  • 用 annualized_stats 把均值和波动率年化25 分
  • 用 sharpe_ratio 评估单位风险的收益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 继续