← 返回编程题库
coding-windowed-positive-fraction中等免费版2000ms未尝试

定长滑窗内严格正收益占比

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

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

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

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]

期望: []

收益序列为空,输出为空列表。