概括一个分布的两个数
一列收益率很难与另一列比较。两个数字就能概括大部分信息:均值说明收益率集中在哪里,方差说明它们围绕这个中心散得多开。对 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 分