← 返回编程题库
coding-k-day-momentum-hits中等免费版2000ms未尝试

K 日动量命中数

K-Day Momentum Hits

开始编码

你正在评估一只短期动量信号:策略只在过去 K 天累计收益超过某个门槛 threshold 时建仓。为了估计该信号的发生频率(也就是策略的开仓频率), 你需要先在历史数据上数一下:在给定的对数收益率序列里,有多少个长度 恰好为 K 的连续窗口,其窗口内累计对数收益 sum(returns[i..i+K-1]) 大于等于 threshold

实现 solution(returns: list[float], K: int, threshold: float) -> int, 返回满足条件的窗口数量。当 K > len(returns)returns 为空时返回 0——一个完整窗口都凑不出。判断采用 1e-9 的绝对容忍:只要 window_sum >= threshold - 1e-9,就计入结果。

例如 solution([0.01, 0.02, -0.005, 0.015, 0.008, -0.012], 3, 0.02) 应返回 2:长度为 3 的窗口共有 4 个,对应的累计收益依次是 0.025, 0.030, 0.018, 0.011,其中前两个 ≥ 0.02,所以命中 2 次。

朴素的 O(n·K) 双层循环在 returns 达到 10 万根、K 也不小(比如 200)时会 明显变慢。请用滑动窗口把每一步的开销摊到 O(1),整体 O(n)。

约束条件

  • 1 ≤ K ≤ 100000
  • 0 ≤ len(returns) ≤ 100000
  • -1.0 ≤ returns[i] ≤ 1.0(对数收益率,可正可负)
  • -10.0 ≤ threshold ≤ 10.0
  • 若 K > len(returns),则不存在任何完整窗口,返回 0
  • 比较使用浮点容忍:当 |sum - threshold| ≤ 1e-9 时视为达标

样例

Case 1 · statement example: K=3 threshold=0.02

输入: [[0.01,0.02,-0.005,0.015,0.008,-0.012],3,0.02]

期望: 2

长度为 3 的窗口共 4 个,累计收益依次为 0.025, 0.030, 0.018, 0.011;其中前两个 ≥ 0.02,所以命中数为 2。

Case 2 · K=5 mild positive drift, threshold above mean

输入: [[0.005,0.004,0.006,0.003,0.005,0.008,0.002,0.007,0.004,0.006],5,0.025]

期望: 4

长度 5 的窗口共 6 个,累计收益分别为 0.023, 0.026, 0.024, 0.025, 0.026, 0.027;其中 ≥ 0.025 的有 4 个(0.026, 0.025, 0.026, 0.027),所以命中 4 次。注意阈值正好等于 0.025 的窗口也算命中。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

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

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

Case 1 · statement example: K=3 threshold=0.02

输入: [[0.01,0.02,-0.005,0.015,0.008,-0.012],3,0.02]

期望: 2

长度为 3 的窗口共 4 个,累计收益依次为 0.025, 0.030, 0.018, 0.011;其中前两个 ≥ 0.02,所以命中数为 2。

Case 2 · K=5 mild positive drift, threshold above mean

输入: [[0.005,0.004,0.006,0.003,0.005,0.008,0.002,0.007,0.004,0.006],5,0.025]

期望: 4

长度 5 的窗口共 6 个,累计收益分别为 0.023, 0.026, 0.024, 0.025, 0.026, 0.027;其中 ≥ 0.025 的有 4 个(0.026, 0.025, 0.026, 0.027),所以命中 4 次。注意阈值正好等于 0.025 的窗口也算命中。