← 返回编程题库
coding-strategy-rank-by-sharpe-then-id中等免费版2000ms未尝试

策略排行榜:按 Sharpe 取前 K,同分按 strategy_id 字典序

Strategy Leaderboard: Top-K by Sharpe with Lexicographic Tie-Break

开始编码

实现 solution(entries: list[list], k: int) -> list[str]。给定一组策略摘要,每个 entry 形如 [strategy_id, sharpe],返回按 Sharpe 降序(Sharpe 大者在前)、同分按 strategy_id 字典序升序排序后的 strategy_id 列表,并截取前 k 个。

示例:solution([["S-momo-1", 1.5], ["S-meanrev-2", 2.1], ["S-vol-3", 0.8]], 2) 返回 ["S-meanrev-2", "S-momo-1"]。三条按 Sharpe 降序排为 [S-meanrev-2 (2.1), S-momo-1 (1.5), S-vol-3 (0.8)],取前 2 即可。

需要明确的细节:k <= 0entries == [] 时返回 []k 超过 len(entries) 不是错误——直接返回整张排名(不补齐)。NaN 的 sharpe 视作最差,统一排到所有有限值之后,且 NaN 之间仍按 strategy_id 字典序升序 tie-break。输入中的 sharpe 既可能是 int 也可能是 float,按数值统一处理即可。

最直接的实现是 O(N log N) 排序加复合键 (-sharpe, strategy_id),再加一道显式的 NaN-推到末尾门;当然,维护一个大小为 k 的最小堆也可以,但 N <= 1000 时直接 sort 最简单也最快。

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

实践背景

组合分析的晨会看板上,第一屏总是按滚动窗口实测 Sharpe 排出的一张策略排行榜。投研侧希望前 K 名一目了然,同时同分时按 strategy_id 决定先后——这样同一份快照在每次重跑后的排序都完全一致,运营提到"第一行的那只" 就不会出现歧义;如果两只动量策略隔夜跑出了同样的 Sharpe,每天露脸的总是字典序更靠前的那只。NaN Sharpe 通常出现在窗口内观测数过少、或波动率估计被截零的情形;与其直接丢掉那行(看板上就看不到了),不如把它们留在末尾,组长能够一眼看出当前哪些策略"暂时算不出"。同一个 solution(entries, k) 排序工具会被实时 PnL 组件、晨报邮件、收盘后回顾工具复用,因此契约固定、比对方式取精确比对。

约束条件

  • 0 <= len(entries) <= 1000
  • 每个 entry 形如 `[strategy_id: str, sharpe: float|int]`;strategy_id 是长度在 1 到 32 之间、仅含 ASCII 字符、区分大小写的字符串
  • sharpe 可以是任意有限 float、int 或 NaN;输入中不会出现正负无穷
  • k 为整数;k 可取 [-1000, 10000] 中任意值,包括 0 与负数
  • 输出为 strategy_id 字符串列表,按 Sharpe 降序、strategy_id 升序排序后截至前 `k` 个;使用精确比对

样例

Case 1 · statement-example: top-2 by sharpe desc

输入: [[["S-momo-1",1.5],["S-meanrev-2",2.1],["S-vol-3",0.8]],2]

期望: ["S-meanrev-2","S-momo-1"]

三只策略按 Sharpe 降序为 [S-meanrev-2(2.1), S-momo-1(1.5), S-vol-3(0.8)],取前 2 即 [S-meanrev-2, S-momo-1]。

Case 2 · visible: ties broken lex asc on strategy_id

输入: [[["S-z",1],["S-a",1],["S-m",1]],3]

期望: ["S-a","S-m","S-z"]

三者 Sharpe 相同(都为 1.0),按 strategy_id 升序排列得到 [S-a, S-m, S-z]。

Case 3 · visible: NaN sharpe sorts to end

输入: [[["S-good",0.5],["S-bad","NaN"],["S-best",2]],5]

期望: ["S-best","S-good","S-bad"]

NaN 视为最差,置于末尾;其余按 Sharpe 降序,结果为 [S-best, S-good, S-bad]。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: top-2 by sharpe desc

输入: [[["S-momo-1",1.5],["S-meanrev-2",2.1],["S-vol-3",0.8]],2]

期望: ["S-meanrev-2","S-momo-1"]

三只策略按 Sharpe 降序为 [S-meanrev-2(2.1), S-momo-1(1.5), S-vol-3(0.8)],取前 2 即 [S-meanrev-2, S-momo-1]。

Case 2 · visible: ties broken lex asc on strategy_id

输入: [[["S-z",1],["S-a",1],["S-m",1]],3]

期望: ["S-a","S-m","S-z"]

三者 Sharpe 相同(都为 1.0),按 strategy_id 升序排列得到 [S-a, S-m, S-z]。

Case 3 · visible: NaN sharpe sorts to end

输入: [[["S-good",0.5],["S-bad","NaN"],["S-best",2]],5]

期望: ["S-best","S-good","S-bad"]

NaN 视为最差,置于末尾;其余按 Sharpe 降序,结果为 [S-best, S-good, S-bad]。