Edgekit 算法设计评判

多维度批判性评审与落实记录

Author

Edgekit Team

Published

June 13, 2026

Note📝 摘要

本文档对 Edgekit 早期设计草稿(为什么怎么做需求文档)做了一次系统性批判评审,覆盖数学正确性、统计严谨性、风控逻辑、金融实务、工程一致性、原创性六个维度。每条高严重性批评均经过独立的对抗性复核(尝试反驳后仍站得住才保留)。

Tip✅ 评审结论已全部落实

本评审针对的是设计草稿,章节引用对应当时的版本。下列全部高严重性问题、以及多数中等/低优先问题,都已在当前设计中解决——每条问题下方的「✅ 已落实」一行说明了现在的处理方式与对应的现行规格章节。逐条落实清单见 行动计划,现行规格以 需求文档 为准。本文保留原始批判作为设计决策的分析记录。


1 总体判断

Important

(草稿期判断)思路方向对,但当时规格不可落地,且存在一个会反向放大风险的方向性错误,必须改后再实现。

Edgekit 的内核是清醒、克制、与业界文献吻合的——凯利/分数凯利的纪律化封装、风险的第一性定义、明确的禁止清单,是它最大的优点。但草稿把整个失效检测建立在一个风控方向做反了的「三信号 AND 门」上(把”漏停 ≫ 误停”的非对称损失彻底搞反),又把决定盈亏的真问题(p/RR 的真值与稳定性)当外生输入甩给用户,再叠加纯函数确定性约束与蒙特卡洛选 x 的硬规格冲突。

Tip

✅ 现状:上述三个方向性问题已全部扳正——失效检测改为”回撤熔断 + 单边 CUSUM”的非对称双防线(任一即停);solver 改为用样本量驱动的置信下限计算并显式声明”输入质量决定输出上限”;core/tooling/policy 分层 + x/d 离线产出,消除了确定性与随机的冲突。当前规格可按字面实现,实现也已起步(src/edgekit/solver.py)。


2 核心优点(值得保留)

  1. 凯利推导干净自洽f^* = \frac{p \cdot RR - (1-p)}{RR} 与标准 \frac{bp-q}{b} 代数恒等,且与”风险 = 止损损失”的赌注模型严格匹配。\text{edge\_gate} = (\text{Kelly} > 0) 与正期望 p \cdot RR > (1-p) 严格等价。这是文档最严谨的部分。
  2. 风险的第一性定义:把风险从”仓位/杠杆/保证金”抽象为”止损损失占 base 的百分比”,建立了可跨标的复用的乘法路径模型,是正确的抽象,也纠正了最常见的认知误区。
  3. “亏损 ≠ 失效”的统计克制:把失效定义为分布层面的结构性偏离而非”结果不好”,立意完全正确(这正是假设检验/变点检测的正确框架),避免了在正期望策略正常回撤段恐慌停手。
  4. 半凯利 + 硬上限 + 禁赌徒谬误的纪律封装:“软约束 + 硬约束”双层结构、禁止按胜负序列调仓、要求确定性可复现,与 MacLean–Thorp–Ziemba 的实战教训高度一致(过度下注远比保守下注危险)。

这些优点在当前设计中全部保留,并作为骨架被进一步补强。


3 高严重性问题(经对抗性验证保留)

3.1 HIGH-1:三信号 AND 门 = Type II 灾难,失效检测严重滞后

Caution

方向性错误,必改。

INVALID/PAUSE 要求信号 A∧B∧C 同时成立(草稿 requirements §4.2-4.3、how §3.2)。在带吸收壁(破产不可逆)的乘法过程里,损失函数高度不对称——漏停(留用已死策略)= 乘法级不可逆本金损失;误停 = 可恢复的机会成本。正确目标是控制漏报、最大化检测功效(power),甚至容忍偏高误报。

AND 合取把 Type I error 压到约 0.05^3,却把 power 做塌,方向完全做反。更糟的是:单维度失效(如 RR 从 2.0 崩到 0.5,但 \hat{p} 仍在 2\sigma 带内)在该规则下永远到不了 PAUSE,只能停在 WARNING/减半,半速向已死分布持续失血直至本金耗尽。这与库自称使命”果断停止以保护剩余资本”直接矛盾。

修订:(a) 改为按失效后果加权的 OR/计分逻辑或 2-of-3;(b) 把回撤信号作为独立、最高优先级的硬熔断;(c) “需确认以免误杀”的逻辑只用在”继续交易”方向,绝不用在”停止”方向。

✅ 已落实:三信号”与门”废除,改为回撤熔断 + 复合优势量单边 CUSUM 两道独立防线,任一即停、互不否决;停止只需单一充分证据,“多信号确认”只用于继续方向(见 需求文档 §4)。

3.2 HIGH-2:回撤信号被降级为可选确认项,丧失最后一道止损防线

信号 C DD_{current} > 1.3 \cdot DD_0 在 AND 门下单独命中只触发”风险减半”,无法停机。但 A(胜率,需 n 个样本、2\sigma 检验)和 B(RR)都是滞后的统计推断量;C 是直接的本金消耗实测量。把唯一实测破产先兆塞进 AND、让它被两个慢变量否决,在 regime 切换/急速深度回撤中,等 A、B 也确认时账户可能已从 -30% 走到 -60%(60% 回撤需 150% 收益回本)。

修订:回撤设为独立硬止损线,与三信号解耦,越过绝对阈值即无条件 PAUSE。1.3 这个乘子也需论证。

✅ 已落实:回撤升级为最高优先级的独立硬熔断 DD_hard(默认 0.30),第 1 笔交易起生效、不被任何统计信号否决;阈值依据用分数凯利下的终身回撤概率闭式标定(见 需求文档 §4 决策规则)。

3.3 HIGH-3:把 p/RR 当”外生已知”,把最难、最决定盈亏的问题甩给用户

solver 直接用 pRR 点估计算凯利,全程不要求置信区间/样本量,不传播输入不确定性(草稿 requirements §3.1)。但真实交易中 p/RR 没有外生来源,只能从有限样本估计,必然含过拟合、幸存者偏差、估计方差、非平稳。

凯利对 p 高估近似线性放大下注p 高估 5 个百分点就可能把”你以为的半凯利”推到”真实的全凯利”甚至超凯利区,安全边际被估计偏差吃光。半凯利只能补偿”已知 p 下的方差”,不能补偿输入偏差。讽刺的是 risk_cap 的存在本身就证明作者也不相信 p/RR 可靠——这个不信任却没贯穿到 solver 的参数处理。

修订:solver 接受 p 的样本量/置信区间,用置信下界(Wilson lower bound)而非点估计驱动凯利,实现”越不确定越保守”;kelly_fraction 随估计不确定度递减;report 输出参数敏感度,避免点估计直接产出”生存概率”的虚假精确。

✅ 已落实:solver 输入改为样本量(wins/losses),凯利由 Wilson 单侧置信下限驱动(样本越少越保守);report 输出参数敏感度与封顶代价、禁止点估计式”生存概率”;“库的输出质量上限由用户输入决定”写入适用前提。(采纳了”置信下限”,未叠加”凯利分数随不确定度递减”——单一机制更可审计,理由见行动计划。)

3.4 HIGH-4:核心风险定义在 gap-through-stop 下失效

全库风险定义隐含”止损总能在止损价精确成交”,文档全程未提跳空、滑点、流动性枯竭、止损不成交(草稿 how §2、requirements §2.2;§6.2 明确支持杠杆/期货)。隔夜跳空、闪崩、黑天鹅会让实际损失远超 risk_fractionB 不再是 1 - \text{risk\_fraction} 而是更差(杠杆下甚至为负)的随机量。整个 AB>1 可持续性、risk_cap 安全壳的承重假设在最该兑现时被击穿。

修订:显式声明该定义的成立前提并把 gap risk 单列为不可控尾部;risk_cap 为 gap 留缓冲;solver 支持账户层面总风险约束(并发/相关头寸 ≤ portfolio_cap);把滑点作为 RR 的确定性扣减项输入,避免污染 monitor 的 RR 退化信号。

✅ 已落实:新增适用前提显式声明”止损能成交”假设并把跳空列为不可控尾部;滑点入净口径、gap_multiplier 留缓冲、portfolio_cap 限并发相关敞口。

3.5 HIGH-5:AB>1 二分框架仅在 50/50 对称硬币成立

Caution

数学根源表述错误。

草稿 why.qmd §3.3-3.4 把 AB > 1 提升为”决定命运/能否留在游戏”的普适生死判据,但该等价仅当 p = 0.5 成立。正确的长期存活判据是几何增长率:

g = p \cdot \ln A + (1-p) \cdot \ln B > 0 \quad\Longleftrightarrow\quad A^p \cdot B^{1-p} > 1

反例(已复核):(A=4, B=0.3, p=0.3)AB = 1.20 > 1g = -0.43 < 0(必破产);(A=1.4, B=0.6, p=0.8)AB = 0.84 < 1g = +0.167 > 0(长期增长)。而库的核心场景恰恰是 p \neq 0.5 的非对称优势,二者在前提上自相矛盾。

缓解(影响严重性而非成立性):实际 solver 用的是 Kelly(本就最大化 g、正确吸收 p \neq 0.5),不真算 AB > 1,故无错误数值流入 risk_fraction——危害限于动机/基础文档与可信度,因此定为 high 而非 critical。

修订:核心判据改为 g = p \ln A + (1-p) \ln B > 0AB > 1 可保留为”50/50 直觉引子”但必须标注适用边界并给出非对称推广。

✅ 已落实why.qmd 已把核心判据改为 g = p\ln A + (1-p)\ln B > 0AB>1 降为五五开特例并标注适用边界,另配了一张”p\neq0.5AB>1 仍破产 / AB<1 仍增长”的反例模拟图。

3.6 HIGH-6:纯函数确定性 vs 蒙特卡洛选 x 的规格硬冲突

草稿 requirements §5.1 要求”严禁引入随机性、确定性可复现”,而 §3.2 把 x_rebase 列为 solver 的输出字段,§6.3 / how §4.3 又要求用蒙特卡洛评估并选 x。蒙特卡洛本质需要随机数,两者从未说明如何共存。

更深一层:§3.1 solver 输入里根本没有 x,所以 solver 必须自己产出 x,但 §3.3 计算逻辑完全没有 (p, RR) \to x 的任何算法、目标函数、候选区间、选择阈值、tie-break——这是核心输出的零规格空洞,两个开发者会实现出完全不同的 x

修订:显式分层——core(engine + risk,纯确定性禁随机)vs tooling(sim,允许带显式 seed 的随机,离线产出)。规定 solver 不在调用链触发任何模拟;x 作为 solver/policy 的外生输入,由 sim/x_sweep 离线产出后写入 policy。把 x 的目标函数、候选网格、选择阈值、tie-break 全部写死。给”确定性”加上”给定 seed 可复现”的限定。

✅ 已落实需求文档 §1 确立 core/tooling/policy 三层(core 禁随机、tooling 显式 seed);xd 改为 policy 输入、由 x_sweep 离线联合产出;选择算法五要素(候选网格、模拟、约束、并列规则、种子)写死(见 §5),两人独立实现得同一结果。

3.7 HIGH-7:信号 B 阈值 0.8·RR0 无抽样分布依据

信号 B \hat{RR} < RR_0 \times 0.8 是不含 n 的固定比例门槛。RR = 均盈利/均亏损,是两个随机均值之比,估计量有偏、重尾下方差极大(delta 法 \text{Var}(\hat{RR}) \approx RR^2 \cdot [CV_{win}^2/n_{win} + CV_{loss}^2/n_{loss}])。优势没退化时 \hat{RR} 也可能因单笔极端值跌破 0.8(高误报);真退化时一两笔幸运大盈利又能拉回(高漏报)。文档自相矛盾:同组信号 A 用了 n 自适应标准误,信号 B 却用零方差常数。

修订:对 \log(\hat{RR}) 做近似(更接近正态),用 bootstrap/delta 给出置信区间,判据改为”\hat{RR} 置信上界 < RR_0“这类带不确定性的检验;明确 0.8 的来源。

✅ 已落实:固定比例阈值取消——退化检测并入对每笔标准化盈亏 X_t 的 CUSUM(盈利侧截尾防重尾污染);盈亏比单列为诊断时改用 \ln\hat{RR} 的单侧置信上限(见 需求文档 §4)。

3.8 HIGH-8:信号 C 回撤随交易数单调增长,固定 1.3 倍在长样本下几乎必然触发

DD 是路径 running maximum,对 n 单调不减;类随机游走净值的期望最大回撤随 \sim\sqrt{n} 增长。只要 monitor 跑得够久,DD_{current} 终将超过 1.3 \times DD_0——它检测的是时间流逝,不是退化。且 DD_0“历史可接受最大回撤”未定义(是统计基线还是风险容忍度未区分),早期短样本会系统性低估。

修订:回撤判据对 n 归一化——用”DD_{current} 超过(由 p_0, RR_0, \text{risk\_fraction} 蒙特卡洛得到的)未退化分布的高分位(如 99%)“,且分位随当前 n 重算。明确 DD_0 的语义。

✅ 已落实:监控量改为当前回撤深度(可恢复、非单调),并明确禁用随 n 单增的”迄今最大回撤”;硬线阈值由分数凯利的终身回撤概率闭式标定,工具层另提供按 policy 参数的模拟校核(见 需求文档 §2/§4)。

3.9 HIGH-9:半凯利 + 风险上限被反复误称”几何最优”

草稿 why.qmd §4 称 Half-Kelly”使长期几何增长率最大化”。但 g(f) 严格凹,唯一极大点是全凯利;任何分数凯利或硬上限截断都落在上升段,严格降低 g。实测:p=0.7, RR=3 时半凯利损失 23%、封顶 @0.10 损失 66% 的对数增长。半凯利的正当理由是降方差/抗估计误差(牺牲增长换稳健),与”增长最优”是对立目标。讽刺的是 how §3.1 其实写对了(“降低波动、提高鲁棒性”),why.qmd 自相矛盾。

修订:更正为”全凯利最大化几何增长;半凯利以可控增长损失换约一半方差与对估计误差的鲁棒性”,并报告 g(\text{capped})/g(\text{full}) 让审计者看到封顶代价。

✅ 已落实why.qmd 表述更正为”全凯利最大化几何增长;分数 c 凯利增长率约为最优的 c(2-c) 倍,半凯利≈75%,用约 1/4 增长换约一半方差与对估计误差的容错”;solver 的 report 输出封顶代价 g(\text{capped})/g(\text{full})

3.10 HIGH-10:monitor 边界输入崩溃 / 缺”数据不足”状态

信号 A 分母 \sqrt{p_0(1-p_0)/n}n=0 时除零n 是显式输入,策略首次调用必然 n=0);p_0 \in \{0,1\} 时阈值塌缩为 0、任意微小偏差触发 A;RR_0=0 时信号 B 恒不触发。草稿 §7”优雅返回”只为 solver 的 edge_gate 定义,monitor 边界语义完全空白。

修订:为 monitor 增加 n_{min} 门槛与 INSUFFICIENT_DATA/UNKNOWN 状态;明确 n=0p_0 \in \{0,1\}RR_0 \le 0 时的返回;规定数据不足时不得输出 INVALID(避免噪声停机),也不得误判 OK。

✅ 已落实:新增 INSUFFICIENT_DATA 状态与 n_{min}(默认 20),数据不足时既不宣告 OK 也不宣告 INVALID;n=0/p_0\in\{0,1\}/RR_0\le0 归入校验的两张清单(构造非法→抛错,证据不足→降级),见 需求文档 §10


4 中等问题(值得修但非阻塞)

Tip

✅ 本节多数已落实risk_cap 默认降到 0.02;monitor 改用 CUSUM 序贯检验并对外暴露 ARL_0;胜率检验改单侧下侧;小 n 用精确二项;x-rebase 增加下调(慢上快下);README 与 requirements 对齐、指定唯一规格源;“减半”形式化为 risk_multiplier 字段;模拟 DGP 显式声明并支持块自助法。

  • risk_cap 默认 0.10 偏激进 + cap binding 区域方向反了:10% 单笔风险比机构标准(0.25%-2%)高约一个数量级;7 连亏腰斩。更关键——cap 只在半凯利 \ge 0.10(高 p/高 RR 大优势区)时才 binding,而那恰是 p/RR 最易被高估、最该保守的区域,cap 却最宽松。建议默认降至 0.01-0.02,并让 cap 随优势大小自适应。
  • monitor 用固定阈值替代序贯检验(SPRT/CUSUM):失效检测本质是变点检测,SPRT/CUSUM 在该问题上统计最优且检测延迟近优;它们是确定性、封闭形式、可审计的,不违反”禁 ML/禁在线学习”——文档用禁令排斥序贯统计是范畴错误。建议把单信号升级为对 p/g 的单边 CUSUM/SPRT,对外暴露 ARL。
  • 信号 A 双尾检验把”胜率上偏”也当失效信号:失效是单边事件(p 往下掉),上偏不该触发 REDUCE_RISK。改为单边下侧检验。
  • 信号 A 小 n 正态近似失效p_0=0.4, n=10 时带宽 \pm 0.31 几乎覆盖整个 [0,1],信号形同虚设。设 n_{min},小 n 回退精确二项/Wilson。
  • x-rebase 只升不降,回撤期相对风险膨胀(反凯利)base 锁高点后净值回撤 30%,单笔风险占当前净值升至约 14.3%——账户越亏每笔占比越大,与凯利”按当前财富比例下注”相反。建议下跌时让有效基准随净值下调,仅上涨时用 x 阈值延迟上调。
  • README 与 requirements 公式不一致\max(0) 截断位置不同、kelly_fraction 一处硬编码 0.5 一处可配置。指定 requirements 为唯一真相源,README 对齐。
  • WARNING→“减半但继续交易”是未在 solver 公式中定义的隐藏第四层约束,且与 AND 门叠加后成了多数真实失效的”终点站”。建议增加”2 信号 = 停开新仓”档,并把”减半”形式化为 monitor 返回的 risk_multiplier 字段。
  • IID 抛硬币模型无法外推到序列相关/波动率聚集/regime change:x-sweep 蒙特卡洛 DGP 未指定,若默认 IID 会系统性低估尾部、高估存活率。要求 harness 支持 block bootstrap/GARCH 类 DGP 并标注假设。

5 低优先(文档卫生)

Tip

✅ 已落实:README 目录树去重、并把不存在的 .py 标注为”规划中”;校验契约统一为两张清单(抛错 vs 降级),消解了开区间与”p=0 优雅返回”的矛盾;并注明 JSON Schema 只管形状、不可变性靠 frozen dataclass 保证。

  • README 目录树重复粘贴两遍;JSON Schema 校验 ≠ 运行时不可变(需 frozen dataclass)。
  • 取值开区间(p \in (0,1))与 §7”p=0 要优雅返回”自相矛盾——统一校验契约:哪些拒绝抛错、哪些降级返回 gate=False
  • 仓库实为纯文档,README 却把不存在的 .py 文件当既存结构呈现(文档失真)。

6 维度评分(草稿期)

以下评分针对初版草稿,仅作历史记录。表中暴露的全部高严重性与多数中等问题已在当前设计中落实(见各条「✅ 已落实」与行动计划),现行规格以需求文档为准。

维度 草稿评分 一句话理由
数学正确性 中(3/5) 凯利推导与 edge_gate 干净自洽,但 AB>1 仅对 p=0.5 成立、半凯利被误称”几何最优”——基础文档有教科书级错误。
统计严谨性 弱(2/5) 三信号 AND 把功效目标做反(Type II 灾难),三个阈值均缺抽样分布支撑。
风控逻辑 弱偏中(2/5) 风险定义与”亏损≠失效”立意成熟,但 AND 门 + 回撤被降级 + cap binding 方向反 = 尾部结构性爆仓风险。
金融实务 弱(2/5) gap/滑点/并发相关性/非平稳全部未正视,p/RR 外生假设把决定生死的问题甩给用户。
工程一致性 弱偏中(2/5) 概念层自洽,但 x 算法零规格、确定性 vs 蒙特卡洛硬冲突、monitor 边界崩溃。
原创性 弱(2/5) 忠实复用经典(Kelly 1956 / Breiman 1961 / MacLean-Thorp-Ziemba),x-rebase 是 HWM/ratchet CPPI 的离散特例却未对照。

7 三大行动建议(已全部完成)

Important

1. 推翻三信号 AND 门,重建失效检测的非对称性(修 HIGH-1/2/9-medium)— ✅ 完成

把”停止”逻辑从合取改为后果加权的 OR/计分;回撤信号 C 升级为独立、最高优先级的硬熔断(无估计误差的实测量,不可被滞后推断量否决);理想方案是对复合优势量 g = p \cdot RR - (1-p) 做单一 SPRT/CUSUM 序贯检验,按目标 ARL_0 标定阈值,输出累积统计量轨迹满足可审计。

落实:回撤熔断 + 对 X_t(其均值即复合优势)的单边 CUSUM,两道独立防线任一即停;门限按 ARL_0 标定、轨迹可审计。见 需求文档 §4

Important

2. 让 solver 显式吸收 p/RR 的估计不确定性(修 HIGH-3/9)— ✅ 完成

solver 接受样本量/置信区间,用 Wilson 置信下界而非点估计驱动凯利,report 停止用点估计产出”生存概率”的虚假精确,改为输出参数敏感度区间。并在文档显著位置诚实声明:库的输出质量上限由用户无法保证的输入决定。

落实:见 HIGH-3 的「✅ 已落实」。

Important

3. 动工前把工程规格的硬冲突与空洞补齐(修 HIGH-6/10)— ✅ 完成

明确 core(确定性禁随机)/ tooling(带 seed 的离线模拟)分层,规定 x 是 solver/policy 的外生输入并把 x 选择算法(目标函数 + 候选网格 + 阈值 + tie-break)写死;补 monitor 的 n_{min}INSUFFICIENT_DATA 状态与全部边界返回;统一公式真相源。同时把 gap/滑点/并发相关性作为承重假设显式声明并为 risk_cap 留缓冲,把激进的 0.10 默认下调一个数量级。

落实:分层 + x/d 离线产出 + 选择算法写死(§5);monitor 边界与状态补齐(§4/§10);适用前提声明承重假设;risk_cap 默认 0.10 → 0.02。


数学骨架和纪律哲学是这个库的真价值。评审指出的三处要害——失效监控的风控方向做反核心盈亏问题被外包给用户x 求解的规格是空的——已经全部修正,设计进入可实现状态。本文留作”发现了什么、怎么解决的”的决策记录。