← 返回编程题库
coding-online-autocorrelation-lag1简单免费版2000ms未尝试

时间序列的 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:

ρ1=t=0n2(xtxˉ)(xt+1xˉ)t=0n1(xtxˉ)2,xˉ=1nt=0n1xt \rho_1 = \frac{\sum_{t=0}^{n-2} (x_t - \bar{x})(x_{t+1} - \bar{x})}{\sum_{t=0}^{n-1} (x_t - \bar{x})^2}, \qquad \bar{x} = \frac{1}{n} \sum_{t=0}^{n-1} x_t

分母除以与分子(隐含)相同的常数 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 点;停牌标的的价格不再变动),因此惯例是显式报错,而不是默默返回一个误导性的 01

约束条件

  • 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 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

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。