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 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
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 的窗口也算命中。