时间序列的 lag-1 样本自相关系数
Lag-1 Sample Autocorrelation of a Time Series
开始编码某交易员在判断昨日 P&L 残差是否能携带到今日之前,会先对每日 P&L 序列拟合一个 AR(1) 模型。驱动这枚 AR(1) 点估计的核心统计量就是 lag-1 样本自相关 rho_1 ——也就是序列与自身移位一格后的 Pearson 相关。rho_1 强正表示昨日偏差延续到今日(动量/库存漂移);rho_1 强负表示昨日偏差今日反号(均值回归);贴近零则说明序列近似白噪,从一阶滞后里抽不出可预测信息。
实现 solution(values: list[float]) -> float,按标准 Pearson 公式计算 rho_1:
分母除以与分子(隐含)相同的常数 n,二者抵消后输出自然落在 [-1, 1]——这也是 statsmodels.tsa.stattools.acf、R 的 acf 以及多数教科书(Box-Jenkins)采用的口径。纯流式变体存在,但本题输入即为完整列表,清晰的两遍法(先均值、再分子分母合扫)即为参考实现。
例如 solution([1.0, 2.0, 3.0, 4.0, 5.0]) 返回 0.4:均值为 3.0,分子 (-2)(-1) + (-1)(0) + (0)(1) + (1)(2) = 4,分母 (-2)^2 + (-1)^2 + 0^2 + 1^2 + 2^2 = 10,故 rho_1 = 4 / 10 = 0.4。完美交错符号的 solution([1.0, -1.0, 1.0, -1.0, 1.0, -1.0]) 返回 -5/6 ≈ -0.8333——每对相邻都反号,故强负相关。而 solution([1.0, 2.0]) 是最小合法输入(n = 2),返回 -0.5。
有两类输入真正未定义,spec 要求抛 ValueError:N < 2(根本没有 lag-1 对)与常数序列(样本方差为零,公式为 0/0)。本题所在的批量打分环境无法跨测试边界捕获异常,因此参考实现对这两类输入返回 float('nan')——既允许结构化比较继续,又把退化情形与任何真实相关明确区分。
实践背景
rho_1 是时间序列短记忆分析里最常用的概要统计:AR(1) 持续性参数 phi 的极大似然估计本质就是 rho_1 本身(差一个有限样本修正项);对回归残差快速跑一次 rho_1 是诊断序列相关的第一招;Ljung-Box 检验也是建立在样本自相关平方和(从这一项开始)之上。在实务量化里它就是最便宜的"这里有结构吗?"探针:策略研究员对分钟级 P&L 算 rho_1 来发现库存效应,微观结构研究员对逐笔中价变动算它来识别买卖点反弹,风险团队对每日 VaR 越界指示算它来判断今日的越界是否预示明日的越界。两类病态输入——样本数太少与常数序列——在生产环境里以静默故障的形式出现(刚启动的账本只有一个 P&L 点;停牌标的的价格不再变动),因此惯例是显式报错,而不是默默返回一个误导性的 0 或 1。
约束条件
- 2 ≤ N ≤ 10^5,其中 `N = len(values)`
- `values` 是长度为 N 的有限浮点列表(无 NaN、无 inf)
- 采用 Pearson lag-1 形式,分母除以 `n`(不是 `n - 1`);分子分母共有的 `n` 自然抵消,且把输出框定在 `[-1, 1]`
- 若 `N < 2` 或样本方差为零(常数序列),spec 要求抛 `ValueError`。批量打分环境用 `NaN` 哨兵编码该退化路径,让结构化比较仍能进行
- 输出是单个 `float`,落在 `[-1, 1]`(或上述两种退化情形下为 `NaN`);浮点比较容差 `rel_tol = 1e-9`、`abs_tol = 1e-12`
样例
Case 1 · statement-example: monotone increasing [1..5]
输入: [[1,2,3,4,5]]
期望: 0.4
均值 3.0;分子 sum (x_t-3)(x_{t+1}-3) = (-2)(-1)+(-1)(0)+(0)(1)+(1)(2) = 4;分母 sum (x_t-3)^2 = 10;rho_1 = 0.4。
Case 2 · statement-example: alternating sign [1,-1,1,-1,1,-1]
输入: [[1,-1,1,-1,1,-1]]
期望: -0.8333333333333334
均值 0;每对相邻乘积都是 -1;分子 = -5,分母 = 6;rho_1 = -5/6 ≈ -0.833。
Case 3 · statement-example: n=2 minimal pair [1,2]
输入: [[1,2]]
期望: -0.5
n=2 是允许的最小样本:mean=1.5;分子 (-0.5)(0.5)=-0.25;分母 (-0.5)^2+(0.5)^2=0.5;rho_1=-0.5。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: monotone increasing [1..5]
输入: [[1,2,3,4,5]]
期望: 0.4
均值 3.0;分子 sum (x_t-3)(x_{t+1}-3) = (-2)(-1)+(-1)(0)+(0)(1)+(1)(2) = 4;分母 sum (x_t-3)^2 = 10;rho_1 = 0.4。
Case 2 · statement-example: alternating sign [1,-1,1,-1,1,-1]
输入: [[1,-1,1,-1,1,-1]]
期望: -0.8333333333333334
均值 0;每对相邻乘积都是 -1;分子 = -5,分母 = 6;rho_1 = -5/6 ≈ -0.833。
Case 3 · statement-example: n=2 minimal pair [1,2]
输入: [[1,2]]
期望: -0.5
n=2 是允许的最小样本:mean=1.5;分子 (-0.5)(0.5)=-0.25;分母 (-0.5)^2+(0.5)^2=0.5;rho_1=-0.5。