定长滑窗内严格正收益占比
Rolling Hit-Rate of Strictly-Positive Returns over a Fixed-Size Window
开始编码实现 solution(returns: list[float], window: int) -> list[float]。给定一段长度为 N 的逐期收益序列 returns 与定长窗口 window(满足 1 <= window <= N),返回一个长度为 N - window + 1 的列表,其下标为 t 的项等于切片 returns[t : t + window] 中严格正收益所占的比例——即 count(x for x in slice if x > 0.0) / window。恰好为 0.0 的收益不计为正项,只有严格大于零的元素才计入分子。当 returns 为空、window < 1,或 window > len(returns) 时,返回空列表 []。
例
solution([0.01, -0.005, 0.0, 0.012, -0.003, 0.0, 0.008, 0.004], 4) 返回 [0.5, 0.25, 0.25, 0.5, 0.5]。共 5 个长度为 4 的窗口。第一个窗口 [0.01, -0.005, 0.0, 0.012] 中有 2 个严格正项(0.01 与 0.012),分数为 2/4 = 0.5;其余四个窗口的正项计数依次为 1、1、2、2。注意 0.0 不计入正项——判定规则是严格 > 0.0。
函数骨架见 stubs/stub.py。
实践背景
滚动正收益占比是策略近期市态最轻量的初筛诊断之一:过去 W 个周期里,到底有多少周期是正收益?接近 1 表示持续多头;接近 0 表示持续空头;夹杂 0.0 后徘徊在 0.5 附近,则提示当前是震荡频发的市态——策略仅勉强吃到 carry。风险看板通常把滚动 hit-rate 与滚动均值、滚动 sigma 并排显示,以便在回撤完全成形之前预警市态切换。同时 hit-rate 也是日频 P&L 序列上 sign-test 检验功效计算所用伯努利成功概率的经验对应物。要支持分钟级实盘,每次滑动必须 O(1) 更新窗口。
约束条件
- 0 <= len(returns) <= 50000;每个元素为有限浮点数,绝对值不超过 1e10
- window 为整数;若 len(returns) == 0 或 window < 1 或 window > len(returns),则返回空列表 []
- 严格正性:returns[i] > 0.0 计入窗口内的 count;returns[i] == 0.0(含有符号零 -0.0)以及 returns[i] < 0.0 均计 0
- 输出是长度为 len(returns) - window + 1 的列表;下标为 t 的项对应切片 returns[t : t + window],其值等于(严格正项个数)/ window
- 每个输出分数都是形如 k/W 的有限有理数(整数 0 <= k <= W);浮点比较使用相对与绝对容差 1e-12
样例
Case 1 · statement-example: mixed signs with zeros excluded from positive count
输入: [[0.01,-0.005,0,0.012,-0.003,0,0.008,0.004],4]
期望: [0.5,0.25,0.25,0.5,0.5]
八元收益序列在窗口长度 4 下产生 5 个滑窗。第一个窗口 [0.01,-0.005,0,0.012] 含 2 个严格为正的元素,分数为 2/4=0.5;其余四个窗口的正项计数依次为 1、1、2、2,因此分数序列为 [0.5, 0.25, 0.25, 0.5, 0.5]。注意 0.0 不计入正项。
Case 2 · statement-example: window equals length, single output
输入: [[0.01,-0.02,0.03],3]
期望: [0.6666666666666666]
窗口长度等于序列长度,仅输出一个分数:3 个元素中 2 个严格为正(0.01 与 0.03),分数为 2/3。
Case 3 · statement-example: empty stream returns empty list
输入: [[],5]
期望: []
收益序列为空,输出为空列表。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: mixed signs with zeros excluded from positive count
输入: [[0.01,-0.005,0,0.012,-0.003,0,0.008,0.004],4]
期望: [0.5,0.25,0.25,0.5,0.5]
八元收益序列在窗口长度 4 下产生 5 个滑窗。第一个窗口 [0.01,-0.005,0,0.012] 含 2 个严格为正的元素,分数为 2/4=0.5;其余四个窗口的正项计数依次为 1、1、2、2,因此分数序列为 [0.5, 0.25, 0.25, 0.5, 0.5]。注意 0.0 不计入正项。
Case 2 · statement-example: window equals length, single output
输入: [[0.01,-0.02,0.03],3]
期望: [0.6666666666666666]
窗口长度等于序列长度,仅输出一个分数:3 个元素中 2 个严格为正(0.01 与 0.03),分数为 2/3。
Case 3 · statement-example: empty stream returns empty list
输入: [[],5]
期望: []
收益序列为空,输出为空列表。