Welford 暖启动剪裁样本方差:仅在尾段稳定计算的在线估计量
Welford Warm-up-Trimmed Sample Variance — Stable Online Estimator on a Trailing Tail
开始编码实现 solution(returns: list[float], warmup: int) -> float。给定收益序列 returns 与非负整数 warmup,将前 warmup 个观测整体丢弃(不喂入任何运行估计量),对剩余尾段用 Welford 在线递推计算样本方差(除以 n-1)。具体地,维护运行均值与运行 M2;对每个 warmup 之后的观测 x,按 count += 1;delta = x - mean;mean += delta / count;delta2 = x - mean;M2 += delta * delta2 更新。所有 warmup 之后的观测处理完毕后,样本方差为 M2 / (count - 1)。若剩余元素少于 2,样本方差未定义,函数返回 0.0。
例:solution([0.01, -0.02, 0.015, -0.005, 0.012, 0.018, -0.01, 0.0], 3) 丢弃前 3 个收益后对 [-0.005, 0.012, 0.018, -0.01, 0.0] 计算样本方差,约为 0.000137(手算验证:5 元素均值为 0.003;离差平方为 (−0.008)^2, 0.009^2, 0.015^2, (−0.013)^2, (−0.003)^2 = 0.000064, 0.000081, 0.000225, 0.000169, 0.000009;求和得 0.000548;除以 n − 1 = 4 得 0.000137)。
区分点不在剪裁本身,而在递推公式的选择。课本一行式 Var = sum(x^2)/n − (sum(x)/n)^2 在实数域成立,但 float64 下一旦均值远大于离散度就完全失精度——两项都按 mean^2 量级伸缩,答案却落在已被相消掉的尾数位。在 adversarial 体制中(收益约 1e6、std 约 1e-4),朴素公式输出的是舍入噪声甚至负数;Welford 仍正确,因为 M2 只累积局部的 (x − mean) 增量,这些增量的量级随离散度而非随水平变化。一次线性扫描即可,时间 O(N)、额外空间 O(1)。
函数骨架见 stubs/stub.py。
实践背景
回测前的预处理常常需要先丢弃一段可配置的暖启动尾段才去测算实际波动率:alpha 信号最初几分钟、新交易场所撮合簿的开盘首段、做市报价状态机的最初若干 epoch——这些都不是稳态,把它们折入运行方差估计量会让"实际 vol"被偏置,进而扭曲下游的仓位与风控阈值。因此一个干净的 Welford-暖启动 原语就是滚动 Sharpe / realised-vol 流水线下面最小的可复用积木;而实现选择有工程意义:把价格用绝对值挂出来的台子(某些亚洲期货 mid_px 约在 1e6,或者把 ETF 指数乘以一个倍率拿到的次秒级 tick)每天都会进入大均值-极小方差体制,朴素的 sum(x^2)/n − (sum(x)/n)^2 累加器会沉默地输出零或负方差,整班交易完成后仪表盘才发现。Welford 每 tick 的浮点操作数完全相同,应当作为默认实现。
约束条件
- 0 <= len(returns) <= 5000;每个元素为有限浮点数,绝对值不超过 1e9(大均值的 adversarial 用例会触及上限)
- warmup 为非负整数;允许 warmup 等于或超过 len(returns)
- 返回值是浮点数——除以 (n-1) 的样本方差,其中 n 是 warmup 之后剩余的元素数
- 若剩余元素数少于 2,样本方差未定义,返回 0.0
- 比对采用浮点容差 rel_tol=1e-9, abs_tol=1e-12——Welford 在该容差下必须与参考一致,包括大均值 + 极小方差的 adversarial 情形
样例
Case 1 · statement-example: warmup=3 drops first 3 returns then variance over the last 5
输入: [[0.01,-0.02,0.015,-0.005,0.012,0.018,-0.01,0],3]
期望: 0.000137
warmup=3 丢弃前 3 个收益,仅对 [-0.005, 0.012, 0.018, -0.01, 0.0] 计算样本方差(除以 n-1=4)。
Case 2 · visible: warmup=0 — full sample variance of [1..5]
输入: [[1,2,3,4,5],0]
期望: 2.5
warmup=0 表示不丢弃,5 个等差元素的样本方差为 2.5。
Case 3 · visible: post-warmup window length 1 -> 0.0
输入: [[0.1,0.2,0.3],2]
期望: 0
warmup=2,剩余仅 1 个元素,样本方差未定义,按合约返回 0.0。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: warmup=3 drops first 3 returns then variance over the last 5
输入: [[0.01,-0.02,0.015,-0.005,0.012,0.018,-0.01,0],3]
期望: 0.000137
warmup=3 丢弃前 3 个收益,仅对 [-0.005, 0.012, 0.018, -0.01, 0.0] 计算样本方差(除以 n-1=4)。
Case 2 · visible: warmup=0 — full sample variance of [1..5]
输入: [[1,2,3,4,5],0]
期望: 2.5
warmup=0 表示不丢弃,5 个等差元素的样本方差为 2.5。
Case 3 · visible: post-warmup window length 1 -> 0.0
输入: [[0.1,0.2,0.3],2]
期望: 0
warmup=2,剩余仅 1 个元素,样本方差未定义,按合约返回 0.0。