2. 多资产账户基础
在单资产回测中,账户往往被简化成一个现金余额加一个持仓数量。一旦进入多资产、多市场、多币种场景,账户就不再是“一个数字”,而是一个带有层级、币种、冻结状态和划转规则的账本系统。理解这套账本结构,是构建组合级回测引擎的第一块地基。
一、核心原理:账户是账本,不是余额
多资产账户的本质是一组按维度切分的余额与持仓记录。回测引擎在每个时间步需要回答三个问题:钱在哪里、资产在哪里、哪些部分被占用。因此账户模型至少要包含以下维度:
- 账户类型:现货账户、保证金账户、期货账户、子账户。不同类型决定可用资金计算方式与风控规则。
- 资产类别:现金、股票、期货合约、期权、数字货币。资产类别决定估值方式与结算周期。
- 交易品种:具体标的,如 AAPL、IF2406、BTC/USDT。品种是下单与持仓的最小单位。
- 账户结构:主账户—子账户—策略账户的树形层级,用于隔离资金与归因收益。
- 币种:每个余额和持仓都绑定一个计价币种,跨币种需要换算。
关键点在于:余额必须区分“总额、可用、冻结”三种状态。下单时冻结资金,成交时扣减冻结并转为持仓,撤单时解冻。若忽略冻结状态,回测会出现“同一笔钱被重复使用”的虚高收益。
二、方法流程:从账户定义到资金划转
一个可落地的多资产账户初始化流程如下:
- 定义账户树:主账户下挂若干子账户,每个子账户绑定策略或资产类别。
- 为每个子账户声明支持的币种与初始资金。
- 建立品种到资产类别、计价币种、交易市场的映射表。
- 实现资金划转接口:主账户向子账户划入、子账户间划转、子账户回流主账户。
- 实现多币种换算:以基准币种为记账本位币,按汇率快照折算。
下面是一个简化的账户配置示例,用 JSON 描述账户树与币种:
{
"base_currency": "CNY",
"accounts": [
{
"id": "main",
"type": "master",
"children": ["equity_cn", "futures_cn", "crypto"]
},
{
"id": "equity_cn",
"type": "spot",
"balances": { "CNY": 1000000 }
},
{
"id": "futures_cn",
"type": "margin",
"balances": { "CNY": 500000 },
"leverage": 5
},
{
"id": "crypto",
"type": "spot",
"balances": { "USDT": 50000 }
}
]
}
资金划转在回测中通常表现为一次“内部转账事件”,它不产生盈亏,只改变资金分布。但划转会影响各子账户的可用资金,从而影响后续下单能力,因此必须记录在事件流中。
三、多币种处理:汇率、结算与估值
多币种处理的核心是记账本位币的选择。所有子账户的盈亏最终要折算到本位币,才能计算组合净值。常见做法是:
- 每个币种维护一个现金余额,记录原币金额。
- 每个时间步读取汇率快照,将原币余额折算为本位币。
- 持仓市值同样按品种计价币种折算。
- 汇率变动产生的差额计入“汇兑损益”,与交易盈亏分开归因。
四、账户结构对比与常见误区
不同账户结构适用于不同回测目标,选择不当会导致归因困难或风控失真。下表给出常见结构的对比:
| 结构 | 适用场景 | 优点 | 风险 |
|---|---|---|---|
| 单账户单币种 | 单一市场策略验证 | 实现简单 | 无法组合归因 |
| 单账户多币种 | 跨市场但共用资金 | 资金利用率高 | 币种混算易出错 |
| 主从子账户 | 多策略组合回测 | 隔离清晰、可归因 | 划转逻辑复杂 |
| 保证金账户 | 期货、杠杆交易 | 贴近真实风控 | 强平逻辑需精确 |
五、案例场景:跨市场组合的一次调仓
假设主账户下有 A 股子账户与数字货币子账户,基准币种为 CNY。某日调仓:A 股子账户卖出股票获得 200000 CNY,划转 100000 CNY 等值 USDT 到数字货币子账户,再买入 BTC。
回测引擎需要依次处理:卖出成交、更新 A 股子账户余额、生成划转事件、按当日汇率折算 USDT、更新数字货币子账户余额、买入 BTC 并冻结/扣减 USDT。整个过程若缺少任一环节,组合净值都会出现跳变或断裂。
掌握账户类型、资产类别、品种映射、账户结构、划转与多币种处理这六个要素后,回测引擎才能正确回答“每个时刻组合到底值多少钱”。这是后续组合级风控、绩效归因与再平衡逻辑的共同前提。