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

至多 K 段不重叠多头 round-trip 下的最佳已实现 PnL 上界(含每段冲击成本)

Best Realized PnL Bound Under K Disjoint Round-Trips with Per-Roundtrip Impact Cost

开始编码

实现 solution(prices: list[float], K: int, fee: float) -> float。给定 N 期合成价格序列 prices、最多 round-trip 次数上限 K 与每段平摊的冲击成本 fee,返回执行台在"AT MOST K 段不重叠多头 round-trip"约束下能记入的已实现 PnL 上界。每段 round-trip 在某期 i 开多、在更晚的某期 j > i 平仓,已实现金额 = prices[j] - prices[i] - fee;多段必须严格不重叠——新一段 round-trip 只能在前一段 round-trip 关闭后的下一期开仓(同一时刻最多持有一段开仓)。由于不强制交易,结果至少为 0.0。

例:solution([1.0, 5.0, 3.0, 8.0, 2.0, 7.0], 2, 1.0) 返回 10.0。第 0 期 1.0 开仓、第 3 期 8.0 平仓(实现 7-1=6);第 4 期 2.0 开仓、第 5 期 7.0 平仓(实现 5-1=4);合计 10.0。把前半段拆成两笔更小的 round-trip 会被多扣一次 fee,所以本例两段 round-trip 已经是合理上界。

测试用例显式区分两类边界:K = 0 时无论价格序列多漂亮都必须精确返回 0.0;以及 fee 大到没有任何"开仓-平仓"对能覆盖该 fee 时也必须返回 0.0。参考实现 O(N*K) 时间、O(K) 空间;逐对 (i, j) 扫描为 O(N^2),无法通过最大隐藏样例。

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

实践背景

当执行台用一段录像中的中间价序列回顾性评估一笔交易想法时,常问"在 round-trip 次数硬上限 K 与每段平摊冲击成本 fee 下,我们能记入的已实现 PnL 最佳是多少"。其中 K 直接对应到具体的合规额度——很多执行台出于资本风险事件的自我管控,会限定每节交易至多 K 次"持仓清零再开仓"型的再平衡;fee 则是该执行台愿意为每段完整 round-trip(一段、不是分两侧两次)吸收的固定每段滑点预算。该数字并不是任何可交易策略的已实现 PnL,而是"在该成本制度下、完美择时下"的上界,被用作 capture ratio(策略捕获率)的分母,给模拟器与执行算法打分。执行台据此论证"即便预先知晓所有信息、且服从我们当前的成本制度与 K 段再平衡上限,可达上限也只是 X,故捕获到 0.45X 的候选模型是相对一个诚实的上界做得不错,而不是相对一个无界幻想做得不错"。

约束条件

  • 0 <= N <= 2000,其中 N 为 solution(prices, K, fee) 的 prices 输入长度
  • 0 <= K <= 200;K 为整数;K = 0 必须返回精确的 0.0
  • 0.0 <= fee <= 1e6;fee 为有限非负浮点数,每完成一段 round-trip 收取一次
  • 每个 prices[i] 为有限非负浮点数,prices[i] <= 1e6;交易者不被强制交易,因此答案下界为 0.0
  • 输出为有限浮点数(已实现 PnL);比较器为 float,rel_tol = 1e-9,abs_tol = 1e-12

样例

Case 1 · statement-example: K=2 fee=1 captures two distinct round-trips

输入: [[1,5,3,8,2,7],2,1]

期望: 10

两段不重叠的多头:第 0 天 1.0 买 -> 第 3 天 8.0 卖 = 7-1 = 6;第 4 天 2.0 买 -> 第 5 天 7.0 卖 = 5-1 = 4;合计 10.0。

Case 2 · statement-example: K=0 forces zero PnL

输入: [[1,5,3,8,2,7],0,1]

期望: 0

K=0 直接返回 0.0:禁止任何交易,无论价格序列如何。

Case 3 · statement-example: fee dominates every round-trip, abstain

输入: [[1,5,3,8,2,7],5,100]

期望: 0

任何单次 round-trip 的毛利不超过 7 < fee=100,故全部不交易,realized PnL = 0.0。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: K=2 fee=1 captures two distinct round-trips

输入: [[1,5,3,8,2,7],2,1]

期望: 10

两段不重叠的多头:第 0 天 1.0 买 -> 第 3 天 8.0 卖 = 7-1 = 6;第 4 天 2.0 买 -> 第 5 天 7.0 卖 = 5-1 = 4;合计 10.0。

Case 2 · statement-example: K=0 forces zero PnL

输入: [[1,5,3,8,2,7],0,1]

期望: 0

K=0 直接返回 0.0:禁止任何交易,无论价格序列如何。

Case 3 · statement-example: fee dominates every round-trip, abstain

输入: [[1,5,3,8,2,7],5,100]

期望: 0

任何单次 round-trip 的毛利不超过 7 < fee=100,故全部不交易,realized PnL = 0.0。