← 返回编程题库
coding-best-pnl-state-with-cooldown中等免费版2000ms未尝试

二值仓位策略 —— 含离场后强制冷静期的最佳 PnL

Binary-State Strategy — Best PnL With Post-Exit Cooldown

开始编码

实现 solution(returns: list[float], cooldown: int) -> float。交易者在每期收益序列上运行一个二值仓位策略:每期 t ∈ [0, N) 的仓位 s_t1(LONG,多头)或 0(FLAT,空仓);期 t 的已实现 PnL 贡献 = s_t * returns[t],空仓期无论 returns[t] 是正是负都贡献为零。关键约束在于:每次离场(s_{t-1} = 1s_t = 0)之后,交易者必须强制空仓 cooldown 个连续期数 —— 即 s_{t+1}, s_{t+2}, ..., s_{t+cooldown} 全部必须为 0(越界下标视为空操作)。进场(s_{t-1} = 0s_t = 1触发冷静期。期 0 之前的状态严格为 FLAT 且没有继承的冷静期,所以期 0 进场免费。末期不存在归零成本:第 N - 1 期之后的状态保留为何者最大化总 PnL。

返回所有满足上述冷静期规则的序列 s_0, s_1, ..., s_{N-1}sum_t s_t * returns[t] 的最大值。

solution([1.0, -1.0, 1.0, -1.0, 1.0], 1) 返回 2.0。在 cooldown = 1 下,一个最优解是 s = [1, 0, 0, 0, 1]:期 0 进场吃 1.0;期 1 离场(LONG -> FLAT,期 2 被强制空仓);期 2 被强制空仓,跳过其 +1.0;期 3 自愿空仓(冷静期已过,但 -1.0 不值得吃);期 4 进场吃 1.0。净 PnL = 1.0 + 0 + 0 + 0 + 1.0 = 2.0。对比全程持多头的 1 - 1 + 1 - 1 + 1 = 1.0,以及永不进场的 0.0,二者都严格更差。

实践背景

监管机构对二值仓位分配器施加"离场后强制持有空仓"规则:每次平仓多头后,必须连续若干期保持空仓后才能重新进场。进场不受此约束 —— 监管将开新仓视作保守动作 —— 仅离场触发,因为该规则是为了防止围绕高波动行情快速进出反复换手。研究主管想知道:在当前冷静期长度下,事后完美择时所能达到的 PnL 上限是多少,以"捕获率"口径给候选信号模型打分:模型若能捕获该上限的 60%,就是相对一个合规感知的基准做得不错;而把模型得分相对一个无约束"任意进出"幻想去比,所有模型都会看起来很美,但会忽视真实的监管摩擦。该上限对 cooldown 高度敏感:cooldown 增大时最优解退化为序列上某一段最优后缀的单次买入持有;cooldown 缩到 0 时塌缩为吃满每个正收益。这种"进场免费、离场代价"的不对称恰好对应了真实事后合规体系的运作方式:进得慢没有惩罚,频繁进出才有惩罚。

实现细节由 stubs/stub.py 提供。

约束条件

  • 0 <= N <= 200000,其中 N 为 solution(returns, cooldown) 的 returns 输入长度
  • 0 <= cooldown <= 200000;cooldown 是非负整数,表示每次 LONG -> FLAT 离场后必须强制空仓的期数;冷静期**只**在离场时触发,进场不触发
  • 每个 returns[i] 为有限浮点数,-1e6 <= returns[i] <= 1e6(每期收益率,**不是**价格)
  • 期 0 之前的仓位状态严格为 FLAT 且无继承的冷静期;期 0 进场免费;期 N-1 可以以多头收尾(无末期归零)
  • 输出为有限浮点数;比较器为 float,rel_tol = 1e-9,abs_tol = 1e-12。空 returns 必须返回 0.0;全负 returns 必须返回 0.0

样例

Case 1 · statement-example: alternating ±1 with cooldown=1 -> 2.0

输入: [[1,-1,1,-1,1],1]

期望: 2

一个最优解 s=[1,0,0,0,1]:期 0 进场吃 1.0,期 1 离场触发冷静(期 2 强制空仓),期 2/3 空仓,期 4 进场吃 1.0;净 PnL = 2.0。

Case 2 · statement-example: cooldown=0 collapses to sum of positives

输入: [[0.5,-0.3,0.4,-0.2,0.6],0]

期望: 1.5

cooldown=0 时无任何离场约束,最优为对每个正收益持多头:0.5+0.4+0.6 = 1.5。

Case 3 · statement-example: huge cooldown forces single buy-and-hold suffix

输入: [[0.5,-0.3,0.4,-0.2,0.6],100]

期望: 1

cooldown 远大于序列长度时,至多一次进场(永不离场);选起点最大化 sum(returns[t0:]):t0=0 给 1.0(最佳),t0=2 给 0.8。最优 1.0。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: alternating ±1 with cooldown=1 -> 2.0

输入: [[1,-1,1,-1,1],1]

期望: 2

一个最优解 s=[1,0,0,0,1]:期 0 进场吃 1.0,期 1 离场触发冷静(期 2 强制空仓),期 2/3 空仓,期 4 进场吃 1.0;净 PnL = 2.0。

Case 2 · statement-example: cooldown=0 collapses to sum of positives

输入: [[0.5,-0.3,0.4,-0.2,0.6],0]

期望: 1.5

cooldown=0 时无任何离场约束,最优为对每个正收益持多头:0.5+0.4+0.6 = 1.5。

Case 3 · statement-example: huge cooldown forces single buy-and-hold suffix

输入: [[0.5,-0.3,0.4,-0.2,0.6],100]

期望: 1

cooldown 远大于序列长度时,至多一次进场(永不离场);选起点最大化 sum(returns[t0:]):t0=0 给 1.0(最佳),t0=2 给 0.8。最优 1.0。