2. 多资产账户基础

在单资产回测中,账户往往被简化成一个现金余额加一个持仓数量。一旦进入多资产、多市场、多币种场景,账户就不再是“一个数字”,而是一个带有层级、币种、冻结状态和划转规则的账本系统。理解这套账本结构,是构建组合级回测引擎的第一块地基。

一、核心原理:账户是账本,不是余额

多资产账户的本质是一组按维度切分的余额与持仓记录。回测引擎在每个时间步需要回答三个问题:钱在哪里、资产在哪里、哪些部分被占用。因此账户模型至少要包含以下维度:

  • 账户类型:现货账户、保证金账户、期货账户、子账户。不同类型决定可用资金计算方式与风控规则。
  • 资产类别:现金、股票、期货合约、期权、数字货币。资产类别决定估值方式与结算周期。
  • 交易品种:具体标的,如 AAPL、IF2406、BTC/USDT。品种是下单与持仓的最小单位。
  • 账户结构:主账户—子账户—策略账户的树形层级,用于隔离资金与归因收益。
  • 币种:每个余额和持仓都绑定一个计价币种,跨币种需要换算。

关键点在于:余额必须区分“总额、可用、冻结”三种状态。下单时冻结资金,成交时扣减冻结并转为持仓,撤单时解冻。若忽略冻结状态,回测会出现“同一笔钱被重复使用”的虚高收益。

二、方法流程:从账户定义到资金划转

一个可落地的多资产账户初始化流程如下:

  1. 定义账户树:主账户下挂若干子账户,每个子账户绑定策略或资产类别。
  2. 为每个子账户声明支持的币种与初始资金。
  3. 建立品种到资产类别、计价币种、交易市场的映射表。
  4. 实现资金划转接口:主账户向子账户划入、子账户间划转、子账户回流主账户。
  5. 实现多币种换算:以基准币种为记账本位币,按汇率快照折算。

下面是一个简化的账户配置示例,用 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。整个过程若缺少任一环节,组合净值都会出现跳变或断裂。

复盘要点:调仓日的净值应等于调仓前净值加上交易盈亏与汇兑损益,划转本身不改变总净值。若发现调仓日净值异常,优先检查划转是否被误计为盈亏,以及汇率是否使用了错误的时间点。

掌握账户类型、资产类别、品种映射、账户结构、划转与多币种处理这六个要素后,回测引擎才能正确回答“每个时刻组合到底值多少钱”。这是后续组合级风控、绩效归因与再平衡逻辑的共同前提。