同时运行多个交易机器人:如何衡量相关性并控制投资组合风险
通过对齐后的净收益率、风险贡献、共同敞口和账户级控制,学习如何组合多个交易机器人。附可复现的 Python 代码与 CSV 示例。
当收益来源与经济敞口能够互补时,同时运行多个交易机器人可以降低组合风险。仅看机器人的数量,几乎无法判断是否分散了风险。应先将各策略资金与真实账户核对一致,再衡量同一时点估值后的净收益率,计算每个机器人对组合波动率的贡献,并对可能同时亏损的持仓进行压力测试。在本文明确披露假设的数学示例中,获得 25% 资金的机器人贡献了模型组合波动率的 43.19%。配套代码可以复现这些计算;人为构造的输入既不是实盘业绩,也不是预测。
读完后,你将能够核查
- 用口径一致的净收益率建立相关矩阵,不把缺失数据误当成持有现金的日期。
- 区分资金分配、当前敞口以及对模型组合波动率的贡献。
- 复现完整的三机器人账户核算,理解为什么不能直接平均各自的最大回撤。
- 用账户计价货币计算共同亏损情景,并看清持有部分现金会改变什么。
- 为并发订单、保证金压力、陈旧数据和暂停后重启设计共享账户控制。
从一个能够核对清楚的组合开始
三个盈利机器人也可能共用一个脆弱的账户。比特币突破机器人、以太坊动量机器人和机器学习分类器可以采用不同代码,却都在增加对加密市场上涨的敞口。各自的看板无法揭示它们合起来押注了什么。起点应当是账户余额、实际持仓,以及仍可能占用资金的未完成订单。
要亲手开始,请将 Python 研究程序、测试文件、输入 CSV 和研究方案 保存到同一个文件夹,使用 Python 3.10 或更新版本运行下列命令。无需安装依赖,不会发起网络请求,也不需要券商凭证。运行前还可以查看完整计算结果。无需下载 ZIP 压缩包。
python study.py
python -m unittest -v预期的合计期末权益为 100,532.90757 USDT,按每日收盘估值计算的最大回撤为 2.75300%。这些数值用于核验 24 条人为构造观测的账务计算;2026 年 9 月 1—24 日只是日期标签,并非真实机器人的收益记录。CSV 使用十进制简单收益率:0.010 表示 +1%,−0.006 表示 −0.6%。每一行输入都可以查看。
如果某个收益率为空,程序应报出缺失数据错误并停止。将空值替换为零,会把“我们不知道账户价值”改写成“账户价值没有变化”。能否保留这一区别,是判断风险监控工具是否有用的第一项实际检验。
把真实账户与每个机器人的虚拟余额分清楚
假设账户拥有 100,000 USDT。本练习向机器人 A、B、C 分别分配 40,000、35,000、25,000 USDT。它们是资金全额落实的独立核算单元,没有外部资金流入或流出,单元之间也不调拨资金。每个机器人的收益率作用于其整个核算单元的权益,包括闲置现金。账户权益等于三个单元按市值估算后权益的总和。
| 核算单元 | 初始资金 | 初始账户权重 | 收益率分母 |
|---|---|---|---|
| 机器人 A | 40,000 USDT | 40% | 机器人 A 核算单元的全部市值权益 |
| 机器人 B | 35,000 USDT | 35% | 机器人 B 核算单元的全部市值权益 |
| 机器人 C | 25,000 USDT | 25% | 机器人 C 核算单元的全部市值权益 |
| 合计 | 100,000 USDT | 100% | 核对一致后的账户权益 |
在共享钱包中,这一区别尤其重要。如果三个机器人都按照全部 100,000 USDT 归自己使用来计算订单规模,其合计申请就可能超出可用现金或预定敞口。订单被拒绝不等于执行了组合分配政策。资金分配器必须先预留已经承诺的资金,才能允许另一个进程动用余额。
没有外部资金流时,核算单元的简单收益率等于期末按市值估算的权益除以期初权益,再减去一。应计入未平仓损益和已经收取的交易成本。如果发生存款、提款或内部调拨,应在资金流前后估值,或采用已记录且能处理资金发生时点的收益率方法。入金不是交易利润。
对一个实际期间,账户收益率等于各单元收益率乘以该期间期初权益权重后的总和。只要各单元收益不同,权重就会漂移。每天都固定用 40/35/25 加权,描述的是一个持续再平衡的组合,无法复现本文一次性注资的核算单元。再平衡需要明确时间安排、成交,以及可能产生的成本,并单独实现。
sleeve_equity[i, t] = sleeve_equity[i, t-1] × (1 + return[i, t])
account_equity[t] = sum(sleeve_equity[i, t])
weight[i, t-1] = sleeve_equity[i, t-1] / account_equity[t-1]
account_return[t] = sum(weight[i, t-1] × return[i, t])先衡量同步净收益率,再检查当前敞口
这里有两个不同问题。收益相关性描述的是:在指定样本中,按市值估算的策略结果如何共同变化。持仓敞口描述的是:账户当前持有的资产组合可能造成什么损失。相关矩阵是历史样本或构造样本的汇总,不是当前交易的持仓清单。
建立收益矩阵时,应统一估值截止时点、日历和收益率定义,并在相关成本与资金流调整后比较同一期间。将一个机器人的第一笔交易与另一个的第一笔交易配对,会忽视它们发生的时间及持有期限。对累计权益水平求相关,也会把累积历史混进问题。本文的协方差计算应以逐期净收益率为输入。
应保留真正空仓持有现金时产生的零收益,同时调查缺失导出文件、缺失价格和陈旧估值。关于对冲基金收益平滑的研究表明,流动性不足和价格不可得可能掩盖所测得的波动率;引用这项研究,是为了说明估值控制的重要性,并不是指控一份收益持平的机器人导出记录存在欺诈。 [5]
展示矩阵时,采用有据可查的共同样本,并报告观测数量。如果每一对机器人都使用不同的可用日期来计算,所得矩阵可能不适合用于一致的组合协方差计算。某个机器人若在整个样本中始终持有现金,其收益方差为零,收益相关性便没有定义;报告“相关系数 0.00”会暗示我们估计了一个实际并不存在的统计量。
本程序要求连续的日历日,因为示例采用全天候 24/7 的估值安排。股票市场应用应自行定义预期交易时段,以及闭市期间的估值处理。不要仅仅为了满足示例文件的日历而制造观测值。
两两相关性低,并不意味着不会同时亏损
配套测试数据包含 24 组明确由人为构造的收益向量。A/B 的相关系数为 0.18780,A/C 为 0.55422,B/C 为 0.43298。其中两行——9 月 9 日和 9 月 18 日——三个机器人的收益均为负。后一行的收益分别为 −2.5%、−2.2% 和 −2.8%。相对较低的 A/B 样本相关性,与共同亏损日可以同时存在。
这只是算术演示,并非真实机器人共同亏损频率的估计。我们构造并公开了整个样本,没有市场数据来源,也没有拟合分布。更一般地说,线性相关系数为零并不代表独立。将相关性当成依赖关系的完整描述,存在已有文献充分论证的数学陷阱。 [1]
从 100,000 USDT 开始,对各核算单元分别复利计算,再汇总其市值权益,可得到下表结果。由于输入被定义为核算单元净收益率,我们没有额外扣除费用,也没有单独模拟持仓、订单成交、流动性、税项或执行成本。
| 指标 | 计算结果 |
|---|---|
| 同步观测数量 | 24 行人为构造的日度数据 |
| 机器人 A / B / C 期末权益 | 40,284.07 / 35,352.96 / 24,895.87 USDT |
| 合计期末权益 | 100,532.91 USDT |
| 合计累计收益率 | +0.53291% |
| 按每日收盘估值计算的合计最大回撤 | 2.75300% |
| 独立最大回撤的初始权重加权平均 | 3.29056%;并非合计回撤 |
| 期末资金权重,A / B / C | 40.07053% / 35.16556% / 24.76390% |
合计最大回撤为 2.75300%,而按照初始权重对三个独立最大回撤求平均,结果为 3.29056%。两者不同,是因为每个单元最差的峰谷区间,不一定与账户最差的区间重合。应从合计权益路径计算回撤,不能相加或平均彼此独立的最差阶段。同样,也不能将独立策略盈利因子的平均值,当成账户盈利因子。
相关性如何改变模型中的组合波动率
一个简单模型可以单独展示依赖关系的影响。假设三个收益序列的日标准差均为 1%,各自获得三分之一的资金,任意一对的相关系数均为 ρ。这是另一个独立的数学示例;波动率和相关系数均为假设,并非从那 24 行测试数据估计而来。
组合方差为 wᵀΣw,其中 w 是资金权重向量,Σ 是收益协方差矩阵。在这个等权重、等波动率的情形下,组合日标准差可化简为 1% × √[(1 + 2ρ)/3]。将假设相关系数从零改为 0.9,模型日波动率便从 0.57735% 升至 0.96609%。机器人数量始终是三个。
| 假设的任意两者相关系数 | 模型组合日波动率 | 分散化比率 |
|---|---|---|
| 0.0 | 0.57735% | 1.73205 |
| 0.5 | 0.81650% | 1.22474 |
| 0.9 | 0.96609% | 1.03510 |
这些标准差不是每日亏损限额,也不是尾部损失预测。它们只概括了指定协方差模型下的变化程度。本文保留日度单位,不再加入年化数字,以免引出关于各日收益相互独立的不当假设。
下表的分散化比率,等于独立波动率的加权和除以组合波动率。它是对这个协方差模型的简洁描述,既不衡量盈利能力,也不衡量运营可靠性,更不衡量共同冲击可能造成的最大损失。
25% 的资金配置,可能承担 43% 的模型风险
资金权重说明钱分配到了哪里,却不能说明哪个机器人主导了账户的波动。在另一个明确给定的协方差模型中,设 A、B、C 的日波动率分别为 1%、2%、3%,任意两者的相关系数均为 0.3,资金权重分别为 40%、35%、25%。计算得到的组合日波动率为 1.36949%。
机器人 C 的资金配置最小,却贡献了该模型波动率的 43.19%。机器人 A 获得最多资金,贡献却为 17.81%。这里使用标准差的欧拉风险贡献分解:RCᵢ = wᵢ(Σw)ᵢ / σₚ。各项贡献之和等于组合标准差,再将每项除以 σₚ,即得到其占比。这是已有的风险分配方法,并非我们发明。 [2]
| 机器人 | 资金权重 | 假设日波动率 | 波动率贡献(百分点) | 模型波动率占比 |
|---|---|---|---|---|
| A | 40% | 1% | 0.24389 | 17.81% |
| B | 35% | 2% | 0.53414 | 39.00% |
| C | 25% | 3% | 0.59146 | 43.19% |
| 组合 | 100% | — | 1.36949 | 100.00% |
表中各分量的单位是日标准差的百分点。其占比也对应各自的组合方差占比,因为同一个协方差项除以了总方差。它们不是某次已实现回撤的占比,也不是预期损失占比。在另一个协方差矩阵下,对冲分量可能产生负贡献;这并不会消除其杠杆、流动性或对手方风险。
一个更小的双机器人示例更容易看清区别。对两个不相关、日波动率分别为 2% 和 1% 的收益序列配置相等资金,会得到 1.11803% 的组合波动率,以及 80%/20% 的风险占比。相等资金不会带来相等的方差贡献。这两个示例都不能证明,等风险配置就是实际账户的最优分配。
理解相关性估计所依赖的背景
处理真实机器人记录时,应在每项估计旁展示样本日期与数量。比较预先指定的窗口,并调查交易规则、市场敞口、波动率和活跃程度是否发生变化。如果某收益序列包含许多真实持有现金的日子,其全期间关系可能不同于两个机器人同时活跃时的关系。应说明每一种统计口径回答了什么,而不是挑选看起来最分散风险的矩阵。
压力期和下行诊断有价值,但筛选样本本身会改变统计量。Ang 和 Chen 既展示了其历史股票数据中的不对称共同变化,也指出:在特定收益条件下计算相关性,很难直接解释。仅凭选出的亏损日相关性更高,不能证明一个稳定过程发生了变化,也不能证明发生了风险传染。应展示筛选规则、观测与日期。 [4]
优化又增加了一层选择。在许多机器人和权重组合之间挑选,既可能利用近期收益,也可能利用协方差估计误差。Ledoit 和 Wolf 的协方差估计研究解释了样本矩阵噪声较大时采用收缩估计的动机;他们关于股票组合的证据,并不保证某一种机器人配置会有效。 [3]
采用配置规则前,先规定其可使用的历史范围、复核周期、换手约束,以及之后如何评估。不断提高最近赢家的权重,本身就是一个交易策略,需要在后续样本中检验,并记录再平衡成本与决策。本文没有拟合优化器,也不声称找到了最优权重。
机器人还共享抵押品、基础设施与故障源
一个统计结果,并不会自动赋予账户保证金抵扣资格。CME 关于股票类产品 SPAN 2 的申报文件指出,抵扣受合资格产品组和经济依据约束。这是一种特定清算方法,不是对零售券商或加密交易所的承诺。应核查真实账户、合约和抵押品适用的规则。独立的软件进程不会创造独立的抵押品池。 [7]
以明确点名的券商为例,Interactive Brokers 的说明列出了特定保证金账户类型的实时保证金计算,以及未满足相关要求时的强制平仓。触发条件由账户规则决定,而不是由各机器人偏好的止损决定。产品与司法管辖区细节很重要;本文不提供通用保证金阈值。 [8]
即使收益分散程度很好,运营集中度仍可能存在。多个机器人可能依赖同一家交易所、同一个数据供应商、同一个云区域,或同一种身份验证服务。信号独立,并不能让无法访问的订单通道继续运行。应将这些依赖记录为设计层面的风险敞口,并演练账户应对方式;收益相关系数中没有一列能记录它们。
恢复运行时也会出现同样的问题。重启后的机器人如果记得上一次信号,却不知道某笔订单已经成交,就可能重复建仓。恢复前,应核对券商持仓、未完成订单、成交记录、序列标识与中央风险账本。进程健康状态显示绿色,不代表账户状态已经一致。
让账户限额约束每个机器人的下一笔订单
共享账户需要统一决定一笔拟议订单是否可以发送。在放行增加风险的订单之前,应核对当前持仓,并预留其可能占用的现金、保证金或敞口。检查与预留必须在机器人并发申请之间协调,否则两笔单独看都合规的订单,可能同时使用同一份尚未预留的容量而获批。
应区分禁止增加新风险、撤单、减仓和清仓。这些是不同动作。禁止新增风险仍会保留现有持仓敞口;取消全部订单也可能移除保护;发出清仓指令则会产生新订单,其成交与失败仍须核对。应定义在所选状态下如何继续允许降低风险的订单,不要把一个笼统的“紧急停止开关”当成完整政策。
应依据账户授权范围、产品约束和压力承受能力设置限额,再明确谁有权修改,以及重启前必须完成什么。本文不会从人为构造的 24 天数据推导通用单日亏损限额或止损水平。阈值是运营触发器;跳空、市场不可用和执行成本,可能让实际亏损超出阈值。
下表提供的是可以按需调整的控制设计,而非建议使用的数值阈值。每一行都明确负责人、数据来源、确实能够执行的动作,以及有记录的恢复条件后,才具有实际用途。
| 观测到的状况 | 可预先规定的动作 | 恢复前需要满足的条件 |
|---|---|---|
| 持仓未核对一致,或估值缺失 | 禁止新增风险;调查券商记录,并保留必要的保护性处理 | 账户与策略记录一致;估值及时有效 |
| 达到合计因子敞口或总敞口限额 | 拒绝进一步增加风险的订单,或执行已定义的减仓程序 | 敞口与未完成承诺均满足批准的限额 |
| 现金或保证金缓冲不足 | 禁止新增承诺;执行账户的补资或减仓政策 | 按照真实场所规则核实可用资源 |
| 触及账户亏损或回撤触发条件 | 进入规定的受限状态;通知负责的操作人员 | 复核原因、当前敞口及已记录的重启条件 |
| 交易场所、数据或执行服务不可用 | 执行对应通道的事故程序,并防止旧订单重放 | 连接已恢复,订单与持仓已核对一致 |
把增加下一个机器人视为对账户的改变
是否接受候选机器人,应看它能否在明确目标和可行运营条件下改善账户。应在明确的资金与敞口假设下,比较现有账户与拟议配置,包括被替代的现金、额外换手、基础设施成本和保证金要求。较高的独立夏普比率不足以作出判断。
先进行有记录的影子配置。记录其版本、拟议规模、当时可得的输入,以及资金分配器本应接受或拒绝的决策,并保留跳过的信号。模拟账户对成交的假设仍可能偏乐观,因此应明确执行假设,并与实际观测报价比较;若另行授权小规模执行,也可与之后的真实成交比较。
如果使用蒙特卡洛或自助法诊断,抽样时应将机器人放在一起。对同步收益向量重抽样;若研究涉及序列依赖,就应保留适当长度的时间区块。将每个机器人分别独立打乱,会破坏你原本想衡量的共同亏损关系。这种重抽样仍以输入为条件,无法重建策略决策、流动性或样本中没有出现的危机。本文没有运行这项额外实验。
ChatGPT 或 Claude 可以帮助核对导出数据、解释风险报告;Codex 或 Claude Code 可以帮助开发报告软件。应向助手明确单位、时间戳和账户恒等式。下面的可复用提示词要求生成可审计的诊断,而不是让模型根据短样本编造盈利配置。配套练习是在 AI 辅助下实现,并通过可执行的算术测试检查;它不是 AI 产品之间的对照实验。
审查这些带时间戳的机器人收益率、市值持仓、账户余额和未完成订单。将机器人资金与真实账户权益核对一致。先识别缺失或陈旧记录,再计算共同样本的收益相关性,以及指定权重下的协方差贡献。展示共同的市场、抵押品和基础设施敞口。用账户计价货币计算指定共同冲击,不要编造概率,也不要优化配置。区分观测记录、假设情景与未解决问题。返回公式、源记录标识和可复现报告。依据核对一致的账户决策,而不是依据机器人数量
这些示例澄清了几个常见误解。假设相关性较高时,三个机器人在模型中可能几乎没有分散效果。小资金单元也可能主导模型波动率。相关性不高,并不排除同时亏损。合计回撤必须来自合计权益,而现金缓冲改变的是承受风险的金额,不是策略在统计意义上的独立性。
对现有组合,下一个有用的交付物是一份简短账户报告:核对一致的权益、资金与风险贡献、当前方向性敞口和总敞口、共同压力损失、运营依赖,以及各项账户级控制的状态。某个字段无法核实时,应保留为待解决,而不是用令人安心的估计代替。
是否增加另一个机器人,取决于它对这份报告及账户目标能作出什么贡献。研究结果可能支持小规模保留、调整配置、调查记录,也可能支持拒绝加入。能够拒绝一个独立表现看似吸引人的机器人,本身就是组合分析的有用成果。
增加另一个交易机器人之前
- 将现金、持仓、未平仓损益与已承诺订单,同券商或交易所账户核对一致。
- 为每个机器人设置可识别的版本,以及真实可执行的资金或敞口预算。
- 按照有记录的估值日历和截止时点,对齐按市值估算的净收益率。
- 调查缺失与陈旧观测;保留已经核实的现金日零收益。
- 公开相关性窗口、共同观测数量,以及成本和资金流的处理方法。
- 比较资金权重与波动率贡献,并检查因子敞口集中情况。
- 按照实际调拨与再平衡政策重建合计权益。
- 对同时亏损、对冲不可用、执行成本扩大与抵押品压力进行测试。
- 集中管理订单资源预留,并定义账户级限额触发的动作。
- 在影子测试前记录拟议配置,暂停系统重启前核对状态。
同时运行多个交易机器人的实际问题
运行多个交易机器人比运行一个更安全吗?
如果在可信的收益与压力假设下,合计账户的集中度更低,就可能更安全。但多个机器人若持有相同敞口、依赖相同场所,或争用同一笔现金,也可能放大风险。应在明确的资金、敞口和成本假设下,比较拟议账户与现有账户。
交易机器人之间的相关系数多少才算好?
不存在通用的安全阈值。较低的估计值可以降低模型波动率,但其作用取决于样本、持仓规模、各自波动率与共同亏损。在本文人为构造的 24 天示例中,0.19 的相关系数仍伴随同时负收益日;它并不说明真实市场的亏损频率。
应该用权益曲线还是逐笔交易计算相关性?
应使用按市值估算权益的同步逐期净收益率,包含未平仓损益和经核实的非活跃日期。对累计权益水平求相关,或将一个机器人的第一笔交易与另一个的第一笔配对,回答的是另一个经常具有误导性的问题。另行保留持仓记录,才能了解当前敞口。
每个交易机器人应该获得相同资金吗?
等资金是透明的起始约定,不等于等风险。在本文另一个双机器人数学示例中,向日波动率为 2% 和 1% 的不相关收益序列等额配置,产生的模型组合波动率占比分别为 80% 和 20%。成本、流动性、杠杆与尾部敞口仍需单独评估。
可以把多个机器人的收益相加,或将回撤取平均吗?
应将实际核算单元权益或损益,放在真实账户资金基础上汇总。如果通过权重合并收益率,应使用与真实配置政策一致的期初权重。最大回撤必须从按时间排列的合计权益路径计算;平均各机器人最差回撤,得不到账户最大回撤。
独立机器人或子账户能提供独立风险吗?
独立进程不会创造独立资金。根据场所规则,子账户可能隔离权限或抵押品,但共同市场敞口、托管、数据和基础设施依赖仍可能存在。应核查真实账户结构,不要从看板标签推断独立性。
ChatGPT、Claude、Codex 或 Claude Code 能帮助分析机器人组合吗?
它们可以根据明确规格帮助实现计算、核对导出数据并生成测试案例。应提供时间戳、单位、资金定义与已知账户恒等式,再检查结果。账户风险限额应保留在确定性、可审计的控制中;语言模型的文字叙述既不是订单资源预留,也不是已核实的持仓记录。
应该运行多少个机器人?
有意义的上限,是你有能力提供资金、监控并可靠运营的独特且有经济依据的策略数量。本文没有确定最优数量。考虑成本、共同敞口和运营需求后,另一个机器人应通过其增量贡献证明加入组合的价值。
方法、来源与可复现性
数值示例均为 TensorParadigm 使用完整披露的人为构造输入自行计算的结果。我们没有测量市场收益或机器人实盘表现。下列论文提供方法与局限,官方清算和券商文件则用于说明账户风险实务。相关作者及机构均未审阅或认可本练习。
- Embrechts、McNeil 与 Straumann:《风险管理中的相关性与依赖关系:性质与陷阱》(1998 年手稿)
- Tasche:《向业务单元与子组合分配资本:欧拉原理》(2008 年版本)
- Ledoit 与 Wolf:《Honey, I Shrunk the Sample Covariance Matrix》(2003 年工作论文;2004 年发表)
- Ang 与 Chen:《股票组合的不对称相关性》(2002 年发表)
- Getmansky、Lo 与 Makarov:《对冲基金收益的序列相关与非流动性计量模型》(MIT 文献库)
- CME Group:SPAN 2 方法与功能
- CME Group:SPAN 2 股票产品框架与受约束的保证金抵扣——申报文件 24-425(2024 年)
- Interactive Brokers:账户配置、保证金监控与强制平仓条款
本文用于组合分析教育,不是推荐配置,也不是实盘执行系统。配套练习中的每一个收益率均由人为构造。相关性、协方差贡献和假设压力情景,不能确定未来损失概率或最大可能损失。产品、交易场所与账户规则必须另行评估。