跳到正文

置信区间

置信区间给出一个范围——而不仅仅是一个点估计——它可能包含真实参数。理解 95% 置信的真正含义对于解读量化研究很重要。

第 5 篇 · 共 5 篇 约 3 分钟

超越点估计

假设你计算出一只股票的样本均值日收益率为0.05%。这是一个单一的数值——点估计。但这个估计有多精确?真实的总体均值可能略高于或略低于0.05%,我们希望量化我们的不确定性。

置信区间通过为真实参数提供一个可信值范围来解决这个问题。与其说”均值是 0.05%“,不如说”我们有 95% 的置信度认为真实均值在 0.02% 和 0.08% 之间”。

构建置信区间

当总体标准差 σ\sigma 已知时,总体均值 μ\mu 的95%置信区间为:

xˉ±z∗⋅σn\bar{x} \pm z^* \cdot \frac{\sigma}{\sqrt{n}}

其中 z∗=1.96z^* = 1.96 是标准正态分布的第97.5百分位(对于双侧区间,每侧留出2.5%的尾部)。

当 σ\sigma 未知时——这在实际中几乎总是如此——我们用样本标准差 ss 代替 σ\sigma,并使用 t 分布而不是正态分布:

xˉ±t∗⋅sn\bar{x} \pm t^* \cdot \frac{s}{\sqrt{n}}

t∗t^* 临界值来自自由度为 n−1n-1 的 t 分布。对于大 nn,t 分布趋近正态分布,所以对于95%置信区间,t∗≈1.96t^* \approx 1.96。

“95%置信”的真正含义

这是统计学中最常被误解的短语。

正确的解释是:如果你多次重复这个抽样过程,每次用新样本构建一个95%置信区间,那么大约95%的这些区间将包含真实的总体均值 μ\mu。

错误的解释是:”μ\mu 落在这个特定区间内的概率为95%。“这混淆了参数(一个固定的未知常数)与随机区间。真实均值要么在这个区间内,要么不在——它不会随机变动。随机变动的是生成区间的过程。

可以这样理解:在根据你的样本计算区间之后,它是固定的。概率陈述是关于生成该区间的过程的,而不是关于 μ\mu 的。你要么做了一个捕获 μ\mu 的好区间,要么没有——你只是不知道是哪一个。

Python:计算和可视化置信区间

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(42)


true_mean = 0.0005     # 真实总体均值(对我们未知)
true_std = 0.015       # 真实总体标准差
n = 252

returns = np.random.normal(true_mean, true_std, n)
sample_mean = np.mean(returns)
sample_std = np.std(returns, ddof=1)
se = sample_std / np.sqrt(n)

# 使用 t 分布的95%置信区间
df = n - 1
t_crit = stats.t.ppf(0.975, df)  # 双侧
ci_lower = sample_mean - t_crit * se
ci_upper = sample_mean + t_crit * se

print(f"样本均值: {sample_mean:.6f}")
print(f"标准误: {se:.6f}")
print(f"95%置信区间: [{ci_lower:.6f}, {ci_upper:.6f}]")
print(f"真实均值: {true_mean:.6f} (CI是否包含? {ci_lower <= true_mean <= ci_upper})")

# 可视化:50个CI来展示"95%置信"的含义
fig, ax = plt.subplots(figsize=(12, 8))

n_experiments = 50
ci_contains_true = []
for i in range(n_experiments):
    sample = np.random.normal(true_mean, true_std, n)
    x_bar = np.mean(sample)
    s = np.std(sample, ddof=1)
    se_i = s / np.sqrt(n)
    t_crit_i = stats.t.ppf(0.975, df)
    lo = x_bar - t_crit_i * se_i
    hi = x_bar + t_crit_i * se_i
    contains = lo <= true_mean <= hi
    ci_contains_true.append(contains)
    color = 'steelblue' if contains else 'crimson'
    ax.plot([lo, hi], [i, i], color=color, lw=1.5)
    ax.plot(x_bar, i, 'o', color=color, ms=4)

ax.axvline(true_mean, color='black', linestyle='--', lw=2, label=f'True μ = {true_mean:.4f}')
ax.set_xlabel('收益率')
ax.set_ylabel('实验编号')
ax.set_title('50个模拟的95%置信区间\n(红色 = 未包含, 蓝色 = 包含)')
ax.legend()
ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()

coverage = sum(ci_contains_true) / n_experiments
print(f"\n覆盖率: {coverage:.2%} (期望: 95%)")

提示词

用 numpy 模拟日收益,用 scipy.stats.t.ppf 计算 t 临界值,演示 95% 置信区间,重复 50 次看实际覆盖率。

这个可视化使”95%置信”的含义变得具体:大约95%的蓝色区间捕获了真实均值,而红色区间没有。在图中,你通常会看到50个区间中有约2或3个红色(未包含)的,这与95%的覆盖率一致。

置信区间宽度如何随样本量变化

标准误 sn\frac{s}{\sqrt{n}} 随 nn 增加而减小,所以更多数据会使置信区间变窄。具体来说,要将置信区间的宽度减半,你需要四倍的观测数据——因为宽度与 1/n1/\sqrt{n} 成正比。

这对量化研究有直接影响:要获得对策略夏普比率等指标的精确估计,你需要的数据量比你最初预期的要多得多。

比例的置信区间

对于二元(伯努利)数据——股票今天是涨还是跌?——我们使用比例置信区间。nn 次试验中 kk 次成功,样本比例为 p^=k/n\hat{p} = k/n。

标准误为 p^(1−p^)/n\sqrt{\hat{p}(1-\hat{p})/n},对于大 nn,正态近似效果很好:

p^±z∗p^(1−p^)n\hat{p} \pm z^* \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}

对于小 nn 或接近0或1的比例,Wilson 得分区间(一种更精确的方法)更可取。

为什么这在量化研究中很重要

当阅读一篇学术论文或内部量化报告声称”夏普比率为1.45,95%置信区间为[1.12, 1.78]“时,你现在理解了它的含义:如果这项研究被多次重复,大约95%的结果区间将包含真实的夏普比率。窄置信区间意味着精确估计;宽置信区间意味着很大的不确定性。

如果策略均值收益的置信区间包含零,那么在该置信水平下,策略收益与零没有统计上的显著差异——这是配置资本前的一个关键区分。

参考文献

Moore, D. S. and McCabe, G. P. Introduction to the Practice of Statistics, Chapter 5. Freeman. Ross, S. M. A First Course in Probability, Chapter 7. Pearson.