第 7 章/ 45
统计推断(Statistical Inference):让研究结论带上不确定性
1. 本章目标
读完本章,你应能从未知总体参数提出问题,用样本统计量作估计量,再解释本次估计值;从独立正态模型推导均值与方差的最大似然估计(Maximum Likelihood Estimation, MLE);计算并解释置信区间(Confidence Interval)、p 值(p-value)和检验错误;区分偏差、方差、一致性与似然各自回答的问题;为时间依赖数据选择重采样方式;完成一个小型贝叶斯更新,并说明各输出能支持什么结论。
你还要会做一件比按下检验按钮更重要的事:把“想估计的对象”“观察是怎么来的”“检验依赖哪些假设”写在结果旁边。先修第6章的期望、条件概率、大数定律和中心极限定理,以及第4章求导。第8章再把这里的推断扩展到回归系数。
本章脚本是统计实验,核心函数在statistics_tools.py,历史课程根的可交互版本为Notebook。模拟数据明确标成构造样本;真实行业收益来自第2章保存的 French 数据快照。它们用于学习统计方法,尚未构成可交易策略。
2. 为什么 Quant 需要它
某策略回测日均收益为 0.03%,另一策略为 0.04%。第二个数字更大,但如果它只来自20天,且这20天里同一条新闻持续发酵,就没有理由把差额直接当成可重复的优势。统计学研究的不是怎样让结果表格看起来精确,而是怎样判断有限、带噪声的观察能支持多强的结论。
量化研究通常同时面对三个问题。第一,样本均值本身会变;第二,产生数据的机制可能会变;第三,研究者可能已试过很多版本,最后只展示一个最好看的。经典区间主要处理第一类不确定性。它不会自动解决市场机制改变,也不会替你记住被丢弃的实验。
例如,区间估计可以告诉你某一固定规则在指定模型下的均值估计有多不稳定。能否买卖、成本有多大、数据是否当时可用、规则是否提前冻结,仍须由金融和实验设计回答。第22、30–32章将逐步完成这些环节。
3. 直觉
3.1 历史只有一条,抽样分布却讨论“如果重做”
把研究想成从一箱持续供货的苹果中随机抽取一批称重:整箱平均重量是未知总体参数,一批苹果是样本;同样规则再抽一批,样本均值会改变。“这批平均数是多少”是计算问题;“换一批后平均数怎样变化”是推断问题。这个比喻只解释重复抽样。真实市场观察按时间排列,会有相邻依赖,也会遇到制度变化,因此不能把交易日当作可随意交换的苹果。
统计量(Statistic)是样本的函数,例如样本均值。对已经拿到的数据,它是一个确定的数;在观察之前,它随着随机样本而变化,因此有抽样分布(Sampling Distribution)。把这两个视角分开,后面的区间和检验才不容易读反。
3.2 标准差与标准误不是同一件事
收益标准差(Standard Deviation)刻画单期收益的波动。标准误(Standard Error, SE)刻画一个估计量在重复抽样中的波动。独立样本均值的标准误随样本量增加而减小,但市场自身的每日波动并不会因为你多下载了十年数据而变小。
例如,每日收益标准差为2%,100个独立观察的均值标准误约为0.2%。这不表示明天收益只波动0.2%。它表示在所设模型下,100日平均收益这个估计量的抽样波动约为0.2%。
3.3 看见“不显著”,不要自动翻译成“没有效果”
如果噪声大、样本小,一个真实但很小的均值差也可能检测不出来。“未拒绝零均值”只说明当前检验没有足够证据拒绝它。要声称效果小到可以忽略,需要另外预定经济容忍区间,并研究等效性或区间边界;一个很大的 p 值本身不能完成这个任务。
4. 数学基础
4.1 样本、参数与目标对象
估计目标(Estimand)还要说清楚:是某一时期的无条件平均超额收益,还是给定市场状态的条件均值?是存活证券的平均数,还是当时完整证券总体的平均数?最终报告中的均值须与目标、单位、样本窗口和抽样单位对应;API不能替研究者作出这些选择。
4.2 均值和样本方差
4.3 从 IID 到时间依赖:均值方差的完整表达
不假设独立时,仍有
其中
在绝对可和的自协方差和适当弱依赖条件下,定义长期方差(Long-run Variance)
5. 正式定义
5.1 偏差、方差和均方误差
一致性(Consistency)则是样本量趋于无穷时,估计量依概率靠近真实参数:对任意
无偏讨论每个有限样本量的期望;一致讨论一个估计量序列的极限。二者不能互相替代。研究市场数据时,还得问:这段时间增加的观察,是否继续符合使极限成立的机制?
偏差回答重复抽样下估计的平均偏离;方差回答估计量在样本间散布多大;一致性回答增加样本后误差是否依概率趋于零;均方误差(Mean Squared Error, MSE)把方差与偏差平方合在同一损失尺度上。它们分别描述有限样本的中心、分散、极限行为和平方损失。
5.2 似然与最大似然
对 IID 连续观察,似然函数(Likelihood Function)为
存在依赖时必须使用联合分布或条件分布,例如
放在一起看,偏差、方差和一致性分别描述估计量的平均偏离、重复抽样散布和大样本收敛;似然用于固定观察下比较参数值的相对拟合。似然值本身不是参数概率,也不描述估计量的抽样波动。
5.3 置信区间、检验与错误
区间程序
或在适用情形下至少达到目标水平。这里
假设检验(Hypothesis Testing)先写原假设(Null Hypothesis)
对于本章双侧 t 检验,p 值是零假设模型下得到至少同样极端统计量的概率。它不是
5.4 Bootstrap 与贝叶斯推断
自助重采样(Bootstrap)用观察数据近似未知生成分布,再重复计算统计量,以近似其抽样波动。重采样机制必须保留当前问题相关的结构。
贝叶斯推断(Bayesian Inference)把参数的不确定性表示为概率分布。先验(Prior)、似然与后验(Posterior)满足
频率学派让参数固定、数据随重复抽样变化,置信水平描述区间程序的长期覆盖率;贝叶斯方法在给定模型、先验和已观察数据后,为参数给出后验概率。后验概率与覆盖率来自不同的不确定性定义。
6. 推导
6.1 为什么样本方差除以
从代数恒等式开始:
在 IID 且方差有限时,右边第一项的期望为
如果观察相关,ddof=1 是明确的计算约定,不是数据满足 IID 的证明。
6.2 高斯均值和方差的 MLE
设
将
当平方离差和为正,剖面似然随
注意
因此方差 MLE 有向下偏差,但在 IID、有限二阶矩及相应大数定律下仍一致。MLE 不等于无偏,有限样本性质与大样本性质也不同。
6.3 MSE 的偏差—方差分解
把误差写成
平方后取期望。交叉项含有
这解释了为什么收缩估计(Shrinkage Estimation)可以有用。故意把极端估计往共同中心拉一点,会引入偏差,但若大幅降低方差,总误差可能更小。第8章正则化回归、第21章协方差收缩会具体使用这一思想。
6.4 正态 IID 均值的 t 区间
取临界值
这里
检验
6.5 百分位 Bootstrap 怎么做
观察
这个程序的想法是用经验分布近似未知总体,再用经验样本的重复实验近似真实估计量的抽样波动。它有有限样本偏差,偏斜、重尾、非光滑统计量或边界参数可能导致覆盖差。增加
逐日独立重采样会打散金融序列的相邻关系。对于均值推断,这会漏掉时间协方差对标准误的影响;因此金融数据使用独立 Bootstrap 前,要先说明 IID 近似为何适用。
时间序列可改为抽取相邻观察块。本章采用固定长度
区块方法的渐近有效性需要平稳性、相应矩条件和足够衰减的依赖等前提;常见理论还要求
6.6 Beta–Binomial 更新
设
其中
6.7 功效与样本量:小效果需要多少观察
为便于看清功效,暂设 IID 高斯且单期标准差
令
若目标功效为
import numpy as np
from scipy import stats
sigma, delta, significance, target_power = 0.02, 0.001, 0.05, 0.80
critical = stats.norm.ppf(1.0 - significance)
required = int(np.ceil((sigma / delta * (critical + stats.norm.ppf(target_power)))**2))
for n in (100, 1000, required):
power = stats.norm.sf(critical - np.sqrt(n) * delta / sigma)
print("known-sigma IID Gaussian, one-sided", n, "power", power)
assert stats.norm.sf(critical - np.sqrt(required) * delta / sigma) >= target_power
本节用于理解设计,不使用未知标准差的 t 功效,也未考虑依赖或多重试验。真实研究需要根据目标模型重新计算或模拟,而非直接把2474写进任何策略的验收规则。
7. 金融解释
7.1 你测的是收益,不只是胜率
假设每次盈利赚1单位,每次亏损亏2单位,每次还付0.1单位成本,成功概率为
7.2 效果大小、统计显著性与经济显著性
统计显著性问估计值是否与检验假设不相容;经济意义问扣除成本并考虑风险、容量后,效果是否值得承担。
日均毛收益0.02%、成本0.03%,即使你有足够样本把毛均值测得很精确,净均值依旧为负。相反,一个估计区间很宽的正均值,可能暂时无法判断经济价值。研究报告应同时展示效果大小(Effect Size)、区间、成本口径和风险承担;p 值不是排序策略的单一评分。
同样,“均值显著不为零”没有剥离市场 beta。市场上涨期间,一项多头风险暴露可能呈现正均值,却不存在独立 alpha。第14–15章用资产定价和因子回归明确基准。
7.3 有效样本量的直觉与边界
对平稳一阶自回归(First-order Autoregression, AR(1))
8. Numerical Example
8.1 四个手算收益
8.2 固定种子的实验输出
完整脚本使用种子20261007,并以独立子随机流分开实验。40个 IID 高斯构造观察的模型真均值是0.002、标准差0.02;本次实现得到样本均值约−0.001500,高斯方差 MLE 约0.00045812,无偏方差约0.00046987,95%区间约
重复3000次正确模型实验,样本量10、30、100的95% t 区间覆盖率分别约95.3333%、94.9333%、95.5%。不要求每次有限模拟恰好95%;在真实覆盖率0.95下,3000次覆盖指示的模拟标准误约
平稳 AR(1) 构造样本共240个观察,前180个用于估计,后60个不进入重采样。
最后,先验Beta(2,2),观察6赢4输,后验Beta(8,6),后验成功率均值为
9. Python Implementation
本读者版的默认运行入口
从接受I3读者包的根目录,按其README建立独立环境后运行:
.venv/bin/python run_notebook.py notebooks/ch07_statistics.ipynb
该Notebook调用随包共享实现,不读取未随包提供的French数据、不下载数据;每次写入唯一UUID的runs子目录,并打印实际输出位置。旧制作测试与下面的历史课程根命令属于原工作项目;读者默认运行使用上述包根Notebook及其断言。可选历史French路径需遵守读者包的数据契约,本批未重跑。
历史课程根路线
运行以下各块时,以课程根目录为工作目录,使用课程环境。每块都包含自己的导入和数据,可独立运行。核心函数要求一维有限数值;NaN不自动丢弃,以免无声改变观察区间。删除缺失值前,应按第3章追查原因和日期,并在报告中记录。
9.1 同时核对估计、区间和检验
import numpy as np
from scipy import stats
from quant_course.statistics_tools import (
normal_mle_estimates, mean_t_confidence_interval, one_sample_t_test,
)
sample = np.array([-0.01, 0.01, 0.02, 0.02], dtype=float)
estimates = normal_mle_estimates(sample)
interval = mean_t_confidence_interval(sample, confidence_level=0.95)
test = one_sample_t_test(sample, null_mean=0.0)
assert np.isclose(estimates.mean, 0.01)
assert np.isclose(estimates.variance_mle, 0.00015)
assert np.isclose(estimates.variance_unbiased, 0.0002)
reference = stats.ttest_1samp(sample, popmean=0.0)
assert np.isclose(test.p_value, reference.pvalue)
assert (interval.lower <= 0.0 <= interval.upper) == (test.p_value >= 0.05)
print(estimates)
print(interval)
print(test)
这里算的是单期均值,不是年化收益;没有信号或订单时间。区间对象的 standard_error 是均值标准误,不能拿去当每日收益波动率。SciPy 参考接口核对的是计算,模型假设仍由研究者负责。
9.2 常数样本和缺失值显式失败
import numpy as np
from quant_course.statistics_tools import normal_mle_estimates
constant = np.array([0.01, 0.01, 0.01])
assert constant.var(ddof=0) == 0.0
for invalid in (constant, np.array([0.01, np.nan, 0.02])):
try:
normal_mle_estimates(invalid)
except ValueError as error:
print(type(error).__name__, str(error))
else:
raise AssertionError("invalid input must not produce a regular Gaussian MLE")
常数样本的描述性方差可以为零;参数空间
9.3 保留依赖的重采样
import numpy as np
from quant_course.statistics_tools import (
simulate_stationary_ar1, bootstrap_mean_draws,
moving_block_bootstrap_mean_draws, bootstrap_mean_confidence_interval,
)
streams = [np.random.default_rng(s) for s in np.random.SeedSequence(20261017).spawn(3)]
observations = simulate_stationary_ar1(
n=240, phi=0.7, innovation_std=0.01, rng=streams[0],
)
train = observations[:180]
holdout = observations[180:]
assert len(holdout) == 60
point_estimate = float(train.mean())
iid = bootstrap_mean_draws(train, n_resamples=2000, rng=streams[1])
blocks = moving_block_bootstrap_mean_draws(
train, block_length=12, n_resamples=2000, rng=streams[2],
)
for name, draws in (("IID", iid), ("circular fixed blocks", blocks)):
interval = bootstrap_mean_confidence_interval(draws)
print(name, "original mean", point_estimate, "interval", interval)
本块两种方法各重采样2000次;第8节所报4000次属于完整脚本。本块种子不同于完整脚本,输出不应被强行调到第8节相同。上面的百分位区间函数返回的 estimate 是有限重采样均值的平均数,可能与原样本均值略有差别。因此代码另存原样本均值 point_estimate。第8节完整脚本的4000个重采样均值的标准差用来估计均值的抽样标准误;不要再把它除以
9.4 贝叶斯更新与后验区间
import numpy as np
from scipy import stats
from quant_course.statistics_tools import beta_binomial_posterior
posterior = beta_binomial_posterior(
successes=6, failures=4, prior_alpha=2.0, prior_beta=2.0,
)
a, b = posterior.posterior_alpha, posterior.posterior_beta
credible_interval = stats.beta.ppf([0.025, 0.975], a=a, b=b)
probability_above_half = stats.beta.sf(0.5, a=a, b=b)
expected_net_payoff = 3.0 * posterior.posterior_mean - 2.1
assert np.isclose(posterior.posterior_mean, 4.0 / 7.0)
assert expected_net_payoff < 0.0
print("posterior", posterior)
print("95% equal-tail credible interval", credible_interval)
print("posterior P(p > 0.5)", probability_above_half)
print("posterior expected net payoff, units per trade", expected_net_payoff)
这是95%等尾可信区间(Equal-tail Credible Interval),两端各留2.5%后验质量;不是保证覆盖的频率置信区间,也不是最高后验密度区间。.sf(0.5) 给的是指定Beta–Binomial模型和先验下的后验概率,含义确实不同于 t 检验 p 值。
10. Visualization

左图横轴是每次模拟的样本量,纵轴是3000次独立实验中覆盖真均值的比例;虚线是标称95%。应观察有限模拟围绕标称值波动,而不是把某一个点略高于95%称为方法更优。这个图只验证所设 IID 高斯实验,不验证真实收益中的正态性或独立性。
右图横轴是前180个 AR(1) 观察产生的重采样均值,以收益率小数表示;纵轴是密度(Density),单位为收益率单位的倒数。两类直方图各自面积近似为1。区块重采样在本次样本中更分散,因为它保留了部分正序列依赖;它没有加入未来60个观察,也没有根据留出结果调块长。
读者应区分三个对象:原始收益的分布、均值的抽样分布、有限样本产生的 Bootstrap 近似分布。图中画的是第三个对象,不是下一期收益预测区间。
11. Real Market Example
用已保存的 French 10行业月度收益,预定2010年1月至2019年12月作为描述窗口,取非耐用品(Non-durables, NoDur)行业。先固定时间范围、检查连续月份,再计算样本均值与 IID 参考区间。之所以称“参考”,是因为这份真实市场序列没有因程序执行而自动满足独立正态假设。
from pathlib import Path
import numpy as np
import pandas as pd
from quant_course.statistics_tools import mean_t_confidence_interval
raw = pd.read_csv(
Path("data/processed/french_10_industries_monthly.csv"), dtype={"month": "string"},
)
monthly = raw.set_axis(pd.PeriodIndex(raw.pop("month"), freq="M"), axis="index")
series = monthly.loc["2010-01":"2019-12", "NoDur"]
expected = pd.period_range("2010-01", "2019-12", freq="M")
assert series.index.equals(expected)
assert np.isfinite(series.to_numpy()).all()
reference = mean_t_confidence_interval(series.to_numpy())
print("published monthly industry snapshot; not a PIT tradable security")
print("n", len(series), "sample mean", float(series.mean()))
print("IID Gaussian reference interval; assumptions unverified", reference)
print("lag-one sample correlation, diagnostic only", float(series.autocorr(lag=1)))
这里没有自动执行 .dropna(),缺失即触发检查;月度标签对应公布组合的收益月份,不能推断数据在当月末就已公开。本次真实快照计算得到月均收益约1.009917%、IID参考95%区间约[0.428369%,1.591465%]、一阶样本相关约−0.188911,输出见独立片段记录。这些是当前窗口的计算结果,不把相关诊断提升为独立性证明。单个样本滞后相关接近零也不证明独立,且波动聚集可能使收益在其他层面依赖。第16–18章会进一步检查时间序列和波动结构,第8章给出 HAC 推断的入口。
该行业组合收益不是主动策略超额收益;数据也没有扣除本教程设定的真实交易成本。应将运行输出记为指定窗口的描述性统计与参考模型计算,不能把区间端点改写成“未来月均收益将落在其中”。当前下载版本可能修订历史,时点可得(Point-in-Time, PIT)条件仍未成立。数据来源与哈希见缓存说明。
12. Common Mistakes
12.1 把 p 值当原假设概率
错误表述:“p=0.03,所以零收益假设只有3%概率正确。”检验先假定零假设成立,再问样本统计量的尾部概率;并没有给出原假设和备择的先验或后验。正确报告应写检验模型、统计量、双侧规则、p 值、效果估计及区间。
12.2 把区间读成明天收益范围
均值置信区间估计的是参数;预测区间(Prediction Interval)还要包含新观察自身的波动。即使均值估计越来越精确,明天收益的分布仍然很宽。混淆两者会严重低估单期亏损可能性。
12.3 把更多 Bootstrap 次数当更多数据
12.4 只丢 NaN,不报告选择条件
某家公司危机时缺价格,删掉相关日后均值可能提高。缺失机制(Missingness Mechanism)本身可能和收益相关。在金融数据上,dropna() 是一个样本选择动作,必须记录丢弃日期、比例和原因;不是一个无经济含义的清洁按钮。
12.5 100次试验只报一次显著
假设100个检验互相独立、所有零假设为真、每次第一类错误率恰为5%,至少一次误拒绝的概率为
这里100是尝试数,不是观察数;独立性是演示假设,实际策略检验相关时不能直接使用该等式。即使不能准确算出总体错误率,挑出最小 p 值后仍按单次检验解读,也已经改变了研究程序。
import numpy as np
from scipy import stats
rng = np.random.default_rng(20261027)
null_samples = rng.normal(0.0, 1.0, size=(100, 60))
p_values = stats.ttest_1samp(null_samples, popmean=0.0, axis=1).pvalue
raw_rejections = int((p_values < 0.05).sum())
bonferroni_rejections = int((p_values < 0.05 / len(p_values)).sum())
assert bonferroni_rejections <= raw_rejections
print("100 independent null experiments; simulation only")
print("unadjusted rejections", raw_rejections)
print("Bonferroni rejections", bonferroni_rejections)
print("all-null independent probability of at least one raw rejection", 1 - 0.95**100)
Bonferroni 校正(Bonferroni Correction)把每项水平降到总体目标水平除以尝试数,利用并集概率上界控制至少一次第一类错误;它不要求检验独立,但可能保守。这里演示的是预先定义的一组检验。若实际还试过未记录的特征、窗口和证券池,不能只用最后保留的100项作为完整尝试数。第32章讨论多重检验(Multiple Testing)、偏差修正的绩效与过拟合概率。
13. Quant Research Application
13.1 在实验开始前写一份“推断合同”
以研究固定信号的平均净收益为例,先写下:研究总体、证券池形成规则、起止日期、收益区间、数据可用时间、交易时点、成本口径、检验目标、单侧或双侧规则、依赖处理、参数选择范围。然后冻结数据切分,记录每次尝试。这样读者可以判断检验结果到底针对什么问题。
本章纯推断示例没有产生持仓,因此 signal_time、trade_time 不适用;若把样本换成策略收益,收益必须来自先已确定、可执行的持仓和成本模型。统计模块不会检查一个上游信号有没有前视偏差,第29–31章的回测与验证模块承担该责任。
13.2 拒绝域不能代替投资决策规则
一个投资决策至少需要估计的净效果、效果不确定性、尾部与流动性风险、资源约束。即使统计检验没有拒绝零假设,也可以决定继续收集数据;即使拒绝,也可能因为容量不足、风险暴露或不可复现而停止。报告应区分“统计程序的输出”和“研究团队的判断”。
如果原模型只关注均值,不能让它顺便证明极端回撤安全。对尾部风险估计,不仅样本更稀少,重采样还可能反复重放同几个极端事件。第33章将讨论 VaR、Expected Shortfall 与压力情景。
13.3 把鲁棒性作为研究,不作为找最优 p 值
可以预先检查多个合理块长、多个经济子时期和多种成本情景,并完整报告。不要逐一试到某个区间刚好离开零,再只公布那个设定。敏感性分析(Sensitivity Analysis)回答结论依赖什么假设;如果它被用于挑选最好看的结论,便变成新的参数搜索。
14. Chapter Summary
参数是我们想研究的对象,统计量是样本的函数,估计值是这批数据上的数字。无偏性、一致性和低 MSE 回答不同问题;方差 MLE 的分母为
置信区间描述程序覆盖,p 值描述零假设下统计量的极端程度。精确 t 推断依赖独立正态模型。时间依赖会改变均值的抽样方差,适当的区块重采样或 HAC 可以处理部分依赖,但都需要前提和诊断。贝叶斯后验提供另一种有条件的不确定性表达,胜率的后验也不能直接替代净收益分析。
完成本章的标准是:你能给一个数字写出对象、单位、数据窗口、假设和解释边界,而不只是让检验函数返回结果。
15. Exercises
7-E01 — 对象辨认。 研究者说“某行业2010–2019年的120个月收益平均为1%”。请分别指出观察、估计量、估计值、可能的估计目标。这个样本平均数是否自动等于未来的总体均值?
7-E02 — 手算。 对
7-E03 — MSE。 两个标量估计量的偏差/方差分别为
7-E04 — 区间语言。 解释为什么“95%的参数会落在已计算区间中”和“区间程序在重复抽样时约95%覆盖固定参数”不是同一个陈述。再区分均值区间与新收益预测区间。
7-E05 — 有效样本量。 平稳 AR(1) 中
7-E06 — 多次检验。 20次互相独立、所有零假设都为真、单次水平5%的检验,至少一次误拒绝概率多少?总体5%的 Bonferroni 单次水平多少?哪些结论不要求独立?
7-E07 — 先验与收益。 Beta(2,2)先验加6赢4输后,后验分布和均值是多少?若每次赢1、输2、成本0.1,后验期望净损益多少?净期望为正需要什么胜率?
7-N01 — 识别对象。 研究固定规则在指定窗口内的平均日收益。请辨认未知总体参数、随机变量、已实现观察、估计量、估计值和抽样单位;说明“重复抽样”在这个问题中代表什么。若日收益相邻相关,指出抽样机制要保留哪类信息。
7-N02 — 单步计算。 预先设定右侧检验,已观察到标准化统计量
7-N03 — 完整计算。 每个抽样单位是一次独立测量,值以同一输出单位计。已知四个 IID 正态观察为
7-N04 — 代码诊断。 研究者已预先指定右侧正态检验,却写成 p = 2 * (1 - Phi(z))。指出该式何时等于双侧 p 值、何时会出错;改成右侧 p 值公式,并用
7-N05 — 研究判断。 一个研究者从40个策略版本中选出表现最好的版本,报告其 IID 右侧检验
16. Programming Exercises
7-P01 — 计算交叉核验。 独立生成80个正态观察,固定种子20261037、均值0.001、标准差0.02。用核心函数计算95% t 区间和零均值检验,再与 SciPy 核对;断言检验与区间的双侧对应。不要让断言依赖本次模拟恰好显著或不显著。
7-P02 — 块长敏感性。 固定种子20261047,生成300个平稳 AR(1) 观察,前240个作为训练,余下60个不用。对块长4、12、24分别做2000次循环区块重采样,记录区间和宽度。每种设定用独立随机流;不要按是否拒绝零均值选择块长。
7-P03 — 后验先验敏感性。 保持6赢4输不变,分别用Beta(1,1)、Beta(2,2)、Beta(10,10)先验,计算后验均值、95%等尾可信区间及期望净损益。说明为何先验更强时均值更接近0.5,而可信区间变化不能被解释成新增交易证据。
17. Challenge Problems
7-C01 — 相关序列的有限样本公式。 从本章双重求和出发,推导平稳 AR(1) 均值方差的有限
7-C02 — 设计覆盖实验。 比较 IID t 区间、IID Bootstrap、循环块长12 Bootstrap 在 IID 高斯与平稳 AR(1) 下的覆盖。写出实验方案,明确真实均值、样本量、重复数、重采样数、随机流、覆盖与宽度指标、模拟误差和不可支持的真实市场结论。不要求某方法按预想顺序获胜。
18. Solutions / Solution Hints
7-E01
观察是120个指定月份的行业组合收益;估计量是
7-E02
总和0.04,除以4得0.01。偏差为−0.02、0、0.01、0.01,平方和0.0006。除以4得 MLE 方差0.00015,除以3得样本方差0.0002。标准差
7-E03
第一项 MSE 为0.04,第二项为
7-E04
频率区间中参数固定、抽样数据及端点随机;重复的是区间生成程序。观察后已有一个确定区间,不能在未加入参数概率模型时对固定参数赋予95%概率。贝叶斯后验可以作参数概率陈述,但需注明模型与先验。均值区间关注平均值参数的估计误差;新收益预测区间还含新观察的随机波动,因此通常更宽。若数据机制会变,两种区间也都不能凭数学表达保证未来有效。
7-E05
7-E06
独立时至少一次错误概率
7-E07
后验Beta(8,6),均值
7-P01
参考实现如下;如果更换种子,显著性结果可以变化,计算一致性应保留。
import numpy as np
from scipy import stats
from quant_course.statistics_tools import mean_t_confidence_interval, one_sample_t_test
sample = np.random.default_rng(20261037).normal(0.001, 0.02, size=80)
interval = mean_t_confidence_interval(sample)
test = one_sample_t_test(sample)
reference = stats.ttest_1samp(sample, popmean=0.0)
assert np.isclose(test.t_statistic, reference.statistic)
assert np.isclose(test.p_value, reference.pvalue)
assert (interval.lower <= 0.0 <= interval.upper) == (test.p_value >= 0.05)
print(interval, test)
评分要点:数据和代码可独立运行;使用 ddof=1 对应的 t 统计量;结果单位是日收益;不把 p 值称为策略有效概率。
7-P02
import numpy as np
from quant_course.statistics_tools import (
simulate_stationary_ar1, moving_block_bootstrap_mean_draws,
bootstrap_mean_confidence_interval,
)
streams = [np.random.default_rng(s) for s in np.random.SeedSequence(20261047).spawn(4)]
series = 0.001 + simulate_stationary_ar1(
n=300, phi=0.7, innovation_std=0.01, rng=streams[0],
)
train, holdout = series[:240], series[240:]
assert len(holdout) == 60
for length, rng in zip((4, 12, 24), streams[1:]):
draws = moving_block_bootstrap_mean_draws(
train, block_length=length, n_resamples=2000, rng=rng,
)
interval = bootstrap_mean_confidence_interval(draws)
print(length, interval.lower, interval.upper, "width", interval.upper - interval.lower)
答案不规定区间宽度必须单调。有限样本和重采样随机性可能改变顺序。合格讨论应报告三个预定设定,解释短块遗漏依赖、长块重组较少;不查看留出均值来决定哪个设定有效,也不把非零区间作为选块规则。
7-P03
from scipy import stats
from quant_course.statistics_tools import beta_binomial_posterior
for prior in (1.0, 2.0, 10.0):
posterior = beta_binomial_posterior(
successes=6, failures=4, prior_alpha=prior, prior_beta=prior,
)
ci = stats.beta.ppf(
[0.025, 0.975], a=posterior.posterior_alpha, b=posterior.posterior_beta,
)
payoff = 3.0 * posterior.posterior_mean - 2.1
print("prior", prior, "posterior mean", posterior.posterior_mean, "CI", ci, "payoff", payoff)
后验分别Beta(7,5)、Beta(8,6)、Beta(16,14),均值约0.583333、0.571429、0.533333,期望净损益约−0.35、−0.385714、−0.50。三个区间按代码计算。更强对称先验增加了模型中对0.5附近概率的权重;观察始终只有同样的10次,因此不能把区间收窄称为获得更多市场数据。
7-C01
同一滞后有
相对 IID 均值方差
import numpy as np
n, phi = 180, 0.7
lags = np.arange(1, n)
finite_ratio = 1.0 + 2.0 * np.sum((1.0 - lags / n) * phi**lags)
long_run_ratio = (1.0 + phi) / (1.0 - phi)
assert finite_ratio > 0.0
print("finite variance ratio", finite_ratio, "SE ratio", np.sqrt(finite_ratio))
print("long-run variance ratio", long_run_ratio, "SE ratio", np.sqrt(long_run_ratio))
有限样本方差比约5.580247、SE比例约2.362255;长期比约5.666667、SE比例约2.380476。差别来自有限样本中高滞后配对较少。此计算比较的是已知参数下的均值方差,不是一个估计依赖参数后的精确 t 参考分布。
7-C02
合格方案应固定真均值例如0.001、单期标准差目标、
记录覆盖指示与区间宽度,对每个模型/方法报告覆盖均值、平均宽度和覆盖率的模拟标准误
评分:模型与参数20%;原始/重采样两层随机性20%;覆盖和宽度及模拟误差20%;预先固定方法并完整报告20%;解释范围20%。这个实验至多说明所设生成机制下的有限样本行为,不能验证真实市场可交易性、机制稳定性或某策略未来收益。
7-N01
未知总体参数是该固定规则在指定目标总体中的平均日收益
7-N02
单侧 p 值为
7-N03
样本均值为
在
用手算阈值1.645时,功效约为
7-N04
正确的标准正态双侧公式是 2 * (1 - Phi(z)) 只有在
7-N05
若0.03是已按预设 IID 检验算出的毛收益单侧 p 值,它只表示在该零假设和模型下毛均值检验的单次右尾概率;它未校正40个版本的选择,也未处理序列相关。成本口径有效时,点估计净日均收益为
报告应列出全部40个版本及选择规则;在40项测试都构成预定检验族时,可把 Bonferroni 单项阈值写为
19. Further Reading
先读 MIT 18.05 的似然、正态数据区间和贝叶斯共轭先验专题,手工重做两个小样本。区间熟悉后再阅读该课程 Bootstrap 材料,注意不同区间构造不能混称为同一种方法。
有时间序列兴趣的读者可读 Künsch 1989 的平稳观察重采样研究;不要只记“用区块就安全”,应追问其依赖、矩和渐近块长条件。该论文在这里作为原始方法来源,不把本章循环固定块实现说成论文所有理论结论的直接实例。第16–18章提供序列模型基础后再深入更合适。
下一章使用回归把均值问题扩展为条件关系与因子暴露;第31–32章把单次推断置于实际模型选择、多重尝试和样本外评价之中。
20. References
- MIT 18.05:课程专题与阅读材料:统计与概率的课程结构。
- Orloff & Bloom:Maximum Likelihood Estimates:似然与参数估计。
- Orloff & Bloom:Confidence Intervals Based on Normal Data:正态均值区间与解释。
- Orloff & Bloom:Conjugate Priors, Beta and Normal:Beta共轭更新。
- MIT 18.05:Bootstrap Confidence Intervals:重采样区间的课程材料。
- SciPy
ttest_1samp、Beta 分布、Bootstrap 接口:API与计算约定;默认区间方法不等于本章显式百分位方法。 - Künsch (1989), The Jackknife and the Bootstrap for General Stationary Observations, The Annals of Statistics, 17(3), 1217–1241,DOI 10.1214/aos/1176347265:已核对出版社摘要及作者发表目录,尚未将全文定理作为本章已验证结论。
- Kenneth French:10行业组合说明:真实月度收益缓存的来源;不是 PIT 逐股交易数据库。
具体核验范围与程序记录见本章来源说明。