摘要
策略净收益同时受到价格变化、成交质量、手续费、融资成本和资金流影响。若直接比较账户余额,入金可能被记作盈利,保证金划转可能被误读为亏损。本文从离散自融资约束推导逐期损益恒等式,再用到达价格分解执行短缺,扩展到线性永续与多币种账户。目标是让账户权益变化与逐笔归因严格相等,而非仅得到一条外形相近的收益曲线。文中数值为可复算算例,未使用或声称验证 LUMENOVA 的实际交易业绩。
01 / 自融资损益恒等式
先考虑单一现货资产,以 USDT 计价。区间起止估值为 mt−1、mt,期初持仓为 qt−1;成交数量 xt带符号,买入为正、卖出为负,成交价为 pt。现金 C、费用 f、净外部流入 F 和利息等现金收益 k 均以 USDT 表示,其中 f 为正数表示支出,k 可正可负。
假定区间内只有一笔成交,费用以 USDT 支付,且不含分红、拆分等数量调整。自融资意味着交易本金由现金和持仓之间的交换提供;外部流量另列,不凭空生成资本。
Ct = Ct−1 − xtpt − ft + Ft + kt
Vt = Ct + qtmt
把前两式代入权益 V,并减去期初权益及外部流量,得到逐期净损益 Π:
= qt−1(mt − mt−1) + xt(mt − pt) − ft + kt
第一项是期初风险暴露的持仓损益,第二项是本期成交相对期末估值的贡献。区间含多笔成交时,第二项改为 Σjxj(mt−pj),费用逐笔累加。买卖相抵时净成交量可能为零,不能因此丢弃成交路径或强行构造一个净成交均价。
02 / 执行短缺与基准选择
成交后价格上涨,并不证明执行质量好。固定订单到达时的基准价 bt,可将成交贡献拆为“到达后价格变化”和“相对到达价的执行差”。基准可以是当时中间价,但必须在下单时保存,不能事后选取更有利的价格。
Πt = qt−1Δmt + xt(mt − bt) − ISt + kt
有向数量使买贵和卖便宜都产生正的成本;成交优于基准时,IS 可以为负。这里衡量已成交部分的执行短缺,未成交订单的机会成本需另外计算。Almgren 与 Chriss 的最优执行研究进一步把预期交易成本与价格风险纳入同一优化目标;本文只借用成本与风险分离的思路,不把两者之差直接解释为因果性的策略 Alpha。
跨市场路由可比较同一时点、同一目标数量的预期短缺,而不是只比盘口报价。若手续费、数量和币种不同,应先统一计价。对于被拆成多个子订单的父订单,可同时保留父单到达价与子单到达价,分别观察择时成本与路由执行成本。
比较不同订单规模时,将执行短缺除以基准名义金额,并转换为基点:
聚合时先累加金额和绝对名义量,再求比率,避免把小额订单与大额订单的基点简单平均。金额口径用于和组合权益闭合,基点口径用于衡量单位成交成本;两者应同时保留。手续费已进入 IS 时,汇总损益不能再额外减一次相同费用。
03 / 两期账户复算
期初现金为 800 USDT,持有 2 枚资产,估值 100 USDT,权益共 1,000 USDT。第一期买入 1 枚,成交价 102.4,到达价 102,期末估值 103,费用 0.1,无外部流量和现金收益。
V₁ = 697.5 + 3 × 103 = 1,006.5
Π₁ = 2 × 3 + 1 × 0.6 − 0.1 = 6.5
亦可写为:6 + 1 × (103 − 102) − (0.4 + 0.1) = 6.5
第二期期初新增入金 200 USDT,投资起点变为 1,206.5。随后卖出 1 枚,成交价 104.2、到达价与期末估值均为 104,费用 0.1。两个区间的现金与归因如下:
| 项目 | 第一期 | 第二期 |
|---|---|---|
| 期末现金 / 持仓 | 697.5 / 3 | 1,001.6 / 2 |
| 期末权益 | 1,006.5 | 1,209.6 |
| 期初持仓贡献 | 6.0 | 3.0 |
| 到达后价格贡献 | 1.0 | 0 |
| 含费用执行短缺 | 0.5 | −0.1 |
| 净损益 | 6.5 | 3.1 |
第二期卖价比到达价高 0.2,扣除 0.1 费用后仍获得 0.1 的执行改善。两期累计损益 9.6,与期末权益减期初权益再减 200 入金完全一致。负执行短缺在这里表示优于选定基准,不等价于可持续的收益来源。
04 / 永续、资金费与保证金
现货公式不能直接把合约名义价值当作资产。对以 USDT 结算的线性永续,设 B 为已计入已实现损益、费用及资金费的抵押权益,n 为带方向的标的数量,e 为未平仓头寸的平均入场价,M 为标记价。未实现损益 UPL 与合约账户权益 W 为:
W = B + UPL
资金费现金流 Kf = −nf−Pref,frf
合约张数先乘合约乘数,再转换为 n。名义敞口 |nM| 用于衡量风险,不再次加入 W;冻结初始保证金只改变可用余额。平仓时损益从 UPL 转入 B,若又把已平仓损益叠加到 W,会产生重复计算。
若本期合约成交量为 yj,则同币结算的线性模型也可得到:
该式与现货归因形式相似,但开合约时不会从 B 扣除整笔名义本金。以已有 2 单位空头为例,标记价从 100 升至 103,价格损益为 −6;若资金费参考价为 102,当期费率为 0.0001,则空头收取 0.0204,合计 −5.9796。费率必须是本次结算区间的费率,不能把年化费率直接代入。
资金费以结算时点之前的头寸和场所指定参考价计算。正费率下多头支付、空头收取。Hyperliquid 官方资金费规则按小时结算并使用 oracle price,而非任意期末标记价。其具体报价与抵押币约定应按场所适配;本节线性模型不直接覆盖反向合约或不同计价、结算币之间的 quanto 规则。
05 / 多币种估值与汇率归因
每个币种 c 先在本币计算权益 Ac,再以 zc(一单位本币对应多少基准币)转换。为明确资金流时点,先将区间切分至外部流量只在端点发生;若本币流入 Fc在期末发生,则:
Πt = Σcztc(Atc−At−1c−Ftc) + ΣcAt−1c(ztc−zt−1c)
第一项为本币经营损益的期末换算值,第二项为期初币种敞口的汇率贡献。使用期末汇率已保留本币收益与汇率变化的交叉项,不能再额外加一次。稳定币也按选定汇率估值,不能默认所有币种始终等价。
例如本币权益从 100 增至 102,汇率从 7 变为 7.1,无外部流量。基准币权益从 700 增至 724.2:本币收益贡献为 2 × 7.1 = 14.2,期初汇率敞口贡献为 100 × 0.1 = 10,总计 24.2。若前一项误用期初汇率,将漏掉 0.2 的交叉贡献。分解约定可以不同,但各项加总必须仍等于权益变化。
行情、标记价、汇率和成交序号必须对应同一估值截面。组合内的交易所间划转从合并视角不是外部入金,手续费仍计入成本;在途资金也只能记一次。外部费用若用另一资产支付,先减少该资产数量,再按统一截面进入基准币权益。
06 / 资金流调整收益
损益金额用于对账,收益率用于跨时间比较,两者的分母不同。每逢外部流量时,将区间分为资金流前后两个截面:V−表示流量发生前的权益,V+为流量发生后的权益。每个无外部流量子区间的收益率及时间加权收益为:
RTWR = ∏j(1 + Rj) − 1
GIPS 的收益计算要求以资金流调整和子期间几何连接处理时间加权收益。本文算例的两期收益分别为 6.5 / 1,000 与 3.1 / 1,206.5,链式结果约为 0.908612%,不是简单用累计 9.6 除以初始 1,000 得到的 0.96%。
实际执行应在资金流时点保留估值;只有日终余额时,日内流量时点的缺失会限制精确复算。提现确认形成应付款与实际支付应使用一致的资本移出口径,收益区间不能将同一次退出扣除两遍。
07 / 回测与实盘使用同一口径
两者应共用成交到现金、持仓和费用的状态转移,只替换成交产生方式:回测输入撮合模型生成的成交,实盘输入场所回执。为避免前视偏差,决策与到达基准只能读取当时已经可见的数据;期末标记仅用于之后的归因。
对每个估值区间计算残差 ε = 实际权益变化 − 外部流量 − 全部归因项。残差应在明示的数值舍入范围内闭合。随后再对齐到达基准、成交价、实际费用、资金费时点及汇率;不能通过调整末端权益掩盖成本模型差异。若回测未模拟排队与部分成交,其低执行短缺也不能用来证明真实成交质量。
结算层最终应输出可向下展开的归因表:组合净损益、市场价格贡献、执行短缺、费用与资金费,以及币种换算贡献。每一项回到同一段成交和估值记录,收益研究与账户核算才使用相同的数字语言。
数值复算代码
以下 Python 代码使用十进制数,复算两期现金、持仓、损益分解和资金流调整收益。所有输入均以字符串构造,避免先经过二进制浮点近似。
from decimal import Decimal as D, getcontext
getcontext().prec = 28
def step(cash, q, mark, x, fill, end_mark, fee, benchmark):
start = cash + q * mark
end_cash = cash - x * fill - fee
end_q = q + x
end = end_cash + end_q * end_mark
holding = q * (end_mark - mark)
after_arrival = x * (end_mark - benchmark)
shortfall = x * (fill - benchmark) + fee
pnl = end - start
assert pnl == holding + after_arrival - shortfall
return end_cash, end_q, end, pnl
c1, q1, v1, pnl1 = step(*map(D, [
'800', '2', '100', '1', '102.4', '103', '0.1', '102']))
flow = D('200') # Period 2 starts after this deposit.
c2, q2, v2, pnl2 = step(c1 + flow, q1, *map(D, [
'103', '-1', '104.2', '104', '0.1', '104']))
twr = (v1 / D('1000')) * (v2 / (v1 + flow)) - 1
assert v2 - D('1000') - flow == pnl1 + pnl2
print('Period 1:', c1, q1, v1, pnl1)
print('Period 2:', c2, q2, v2, pnl2)
print('TWR:', (twr * 100).quantize(D('0.000001')), '%')
# Period 1: 697.5 3 1006.5 6.5
# Period 2: 1001.6 2 1209.6 3.1
# TWR: 0.908612 %
参考文献
- Robert Almgren, Neil Chriss — Optimal Execution of Portfolio Transactions,Journal of Risk,2001;DOI: 10.21314/JOR.2001.041。
- Hyperliquid — Funding,官方场所规则。
- Hyperliquid — Margining,保证金与账户权益。
- Hyperliquid — Contract specifications,计价与抵押币约定。
- CFA Institute — GIPS Standards for Firms,收益计算与外部资金流。
← 返回结算层架构