Edgekit 如何解决问题
设计思路与核心方法
1 核心定位
1.1 这是什么
Edgekit 是一个纯函数式的分析库,处理交易执行和策略生命周期管理。它回答两个问题:
- 如何执行:已知胜率和盈亏比(以及它们背后的样本量),单笔交易该承担多大风险?
- 何时停止:执行过程中,怎么判断这个优势已经失效?
它的逻辑是 (参数) → (决策):输入参数,输出决策,不直接处理市场数据。
1.2 这不是什么
为了保持专注,明确排除四类功能:
- ❌ 不是自动交易系统:不下单,不连接交易所
- ❌ 不是策略发现系统:不寻找优势
- ❌ 不是回测系统
- ❌ 不是机器学习系统
1.3 使用场景
edgekit 设计为被其他系统调用:
- 🔧 交易系统(作为执行参数计算引擎)
- 📊 策略框架(作为风控和失效监控模块)
- 🤖 AI / Agents(获取确定性的判断与建议)
2 第一性原理:风险的定义
2.1 风险的唯一含义
整个库里,风险只有一个意思:
风险 = 当止损被触发时账户的最大资金损失。
2.2 以 base 的百分比表示
- 风险用
base(资本基数)的百分比表示。 - 例如 2% 的意思是:这一笔交易最多亏掉 base 的 2%。
- ⚠️ 2% 不是仓位大小,不是保证金,也不是杠杆。
2.3 为什么这很重要
这是整个系统的基石:把风险和具体品种的波动性脱钩之后,同一套资金管理逻辑才能用在任何品种上。注意这个定义默认止损能够成交;做不到的时候会发生什么,见 Section 5。
3 双函数架构
核心是两个独立、互补的函数。
3.1 solver:交易开始之前
solver 回答:这个机会该不该做?该做的话,单笔承担多大风险?
它不接受”胜率 0.6”这样的单个数字,输入必须带上样本量,比如”100 笔交易里赢了 60 笔”。原因很简单:胜率是从历史样本里估出来的,样本越少越不可靠。计算时用的也不是估出来的那个值,而是它的置信下限——可以理解为”按这个样本量,胜率保守地说至少有多少”。样本少,下限就低,结果就保守;样本多了,下限自然接近估计值本身。
风险比例的计算有三层约束:
- 凯利公式判断方向:把置信下限代入凯利公式,结果为正才允许交易。
- 默认减半(Half-Kelly):只用凯利值的一半。要说明的是,半凯利并不能让资金增长最快——增长最快的是全凯利。减半的意义是:牺牲大约四分之一的增长速度,换来波动减半,而且参数估计偏高时不容易出大问题。
- 风险上限
risk_cap(默认 0.02):置信下限只能应对样本不足,应对不了回测过拟合、幸存者偏差这类问题,所以最后再加一道固定的上限。
输出三项:是否允许交易(edge_gate)、风险比例(risk_fraction)、计算报告(report,内容包括完整的计算过程、参数变动时结果的变化范围、上限生效时牺牲了多少理论增长)。
注意再基准化阈值 x 不是 solver 的输出。它由模拟工具离线算出来,写在 policy 配置里(见 Section 4)。
3.2 monitor:交易进行之中
monitor 回答:当初假设的优势,现在还在不在?
三条基本认知:
- 亏损 ≠ 失效:正期望的系统照样会连续亏损、深度回撤,这可能只是正常波动。
- 失效 = 结构性偏离:实际结果已经不像是从当初假设的分布里产生的。
- 停下来的门槛要低,继续做的门槛要高:该停没停,亏掉的本金回不来;不该停却停了,损失的只是机会。所以单独一条证据就足以停止;“多方证据互相印证再行动”的谨慎,只能用在”继续交易”这个方向上。
具体有两道防线。它们彼此独立,任何一道触发就停,不需要另一道确认:
- 回撤熔断。当前回撤(净值距离历史高点的百分比)一旦达到上限
DD_hard,无条件暂停。回撤直接从净值算出来,不依赖统计推断,所以从第一笔交易起就有效,优先级也最高。 - 累积和检验(CUSUM)。这是统计学里检测”分布是否发生了变化”的经典方法:把每笔交易的结果与一个固定参考值的差距逐笔累加。策略正常时,累计值贴着零;优势消失后,累计值持续上升——升到报警线的一半,先把风险减半;到报警线,暂停。它监控的是胜率和盈亏比合在一起的总体表现,所以无论胜率下降、盈亏比恶化,还是两边各差一点,都会反映在同一个数字里。
“胜率偏离”“盈亏比退化”这类单项检验只用来做诊断:报警之后判断问题出在哪个环节,供人工复核,不参与停止决策。暂停之后没有自动恢复——需要人工确认,用新的基线参数生成新的 policy,才能重新启用。
公式、状态定义和各种边界情况见 requirements §4。
4 x-Rebase 机制
base 不随净值实时变动,只在到达阈值时一次性调整。这是在增长速度和路径安全之间做折中。
4.1 两种极端
- 完全复利(base 跟着净值实时走):赚了立刻加码,亏了立刻减码。增长最快,但对参数错误极其敏感,容易爆仓。
- 永不调整(base 始终等于初始资金):风险绝对稳定,但资金涨上去之后每笔的相对风险越来越小,增长极慢,浪费优势。
4.2 折中规则:上调慢,下调快
IF equity >= x * base: # 净值涨到 base 的 x 倍,才上调
base = equity
IF equity <= d * base: # 净值跌到 base 的 d 倍,立即下调(d 默认 0.8)
base = equity- 大多数时间 base 不动,单笔风险金额固定,资金曲线平稳。
- 上调的门槛 x 设得比较高,避免一赚钱就加码。
- 下调的门槛 d 离得很近。这是为了堵一个漏洞:如果 base 只升不降,净值下跌后,固定的风险金额占剩余资金的比例会越来越高,相当于越亏越加码。设 d = 0.8 之后,这个比例最多升到原来的 1.25 倍就会被拉回。
只允许这种到达阈值后的一次性调整,不允许部分调整、平滑过渡或取平均。
4.3 x 和 d 怎么定
两个门槛控制的东西不一样:
- x 控制复利的节奏。越大,加码越少,越接近”永不调整”:安全但增长慢;越小越接近完全复利:增长快但对参数错误敏感。
- d 控制最坏时刻的相对风险。base 固定期间风险金额不变,占当前资金的比例最高是 f/d,出现在即将触发下调的位置。d 越接近 1,下调越及时、相对风险越稳,但跌一点就减码,回本慢;d 越小,风险金额在回撤里撑得越久,增长快,但最坏时刻下注越重。d = 0.8 的含义就是”允许最坏相对风险膨胀到 1.25 倍”。
两个参数都在增长和安全之间做交换,而且互相影响(下调过的 base 会改变下一次上调的位置),所以不能各定各的,要放进同一个模拟里联合选择:对每个 (x, d) 组合模拟大量资金路径,在”绝大多数路径不触发回撤熔断”的前提下,选长期增长最好的组合;几个组合差不多时,先选 d 更大的(最坏风险更稳),再选 x 更大的(加码更晚)。候选范围、约束条件、并列规则、随机数种子的记录方式,全部写死在 requirements §5,照着实现,谁做结果都一样。
核心函数不碰随机数;模拟用的种子记录在 policy 里,结果可以复现。不跑模拟时,d 的缺省值是 0.8;x 没有缺省值,必须由模拟产出。
5 适用前提
以下四个前提是全库结论成立的条件。前提不成立,结论也不成立,所以必须写明:
- 止损能够成交。跳空、闪崩、流动性枯竭时,实际亏损会超过设定的风险比例,杠杆会进一步放大。这类风险无法消除,只能缓解:为容易跳空的品种预留缓冲(
gap_multiplier)、限制同时持仓的总风险(portfolio_cap)、超出预期的亏损原样计入监控统计。 - 输入已扣除交易成本。全库的胜率、盈亏比都指扣除滑点和手续费之后的净结果。用未扣成本的数字,所有结论都会偏乐观。
- 置信下限只能应对样本不足。回测过拟合、幸存者偏差、市场环境变化,它都应对不了。这个库输出的质量,上限由用户输入的质量决定。
- 模拟默认每笔交易相互独立。盈亏成串出现的策略(比如趋势策略),独立性假设会低估风险,应改用对真实交易记录分块重抽样(block bootstrap)。
6 设计原则
6.1 三大核心原则
- 可解释:所有规则必须有明确的数学解释。
- 可审计:所有决策过程必须可追溯。
- 可复现:核心函数给定相同输入、模拟工具给定相同种子,结果完全相同。
6.2 最小化规则
复杂度只允许存在于分析层,不允许存在于执行层。任何”聪明”的临时逻辑都是错误的。
7 明确禁止事项
- ❌ 禁止在线学习:严禁在执行过程中实时更新 p 或 RR。
- ❌ 禁止动态权重:严禁基于最近 N 笔交易的表现加权调整。
- ❌ 禁止赌徒谬误:严禁将仓位大小与胜负序列关联。
- ❌ 禁止引入 ML:严禁引入任何不可解释的统计学习模型。
两点澄清,避免误判:CUSUM 是确定性的经典统计检验,每一步都能手工复算,不属于”在线学习”;风险减半由统计检验触发,依据的是检验结果而不是最近几笔的输赢,不属于”按胜负序列调仓”。这份清单禁止的是不可解释、不可审计的自适应逻辑。
8 使命宣言
这个库假设优势是存在的。
它从不尝试寻找优势。
它只决定如何使用它 —— 以及何时停止。