一笔 BTC 永续合约交易即使方向做对了,仍然可能亏钱。来看一个具体案例:以 $60,000 买入 0.10 BTC,以 $60,300 卖出,持仓期间支付两次资金费。价格朝有利方向变动了 $30。如果资金费支出合计 $36,执行成本为 $8,这笔交易就会亏损 $14。
这些数字只是示例,但核算方式是真实的。每次结算时,资金费都是针对持仓产生的一笔现金流,其符号取决于费率和持仓方向。要理解最终结果,先看看策略实际持有的仓位。
仓位:以 $60,000 买入 0.10 BTC
策略买入 0.10 BTC 的线性 BTCUSDT 永续合约,初始名义价值为 $6,000。持仓经过两个资金费结算时点后,以 $60,300 卖出。该合约为线性合约,因此价格盈亏等于数量乘以价格变动:
0.10 BTC × ($60,300 − $60,000) = +$30
这就是交易毛盈亏。它还没有计入开仓和平仓所需的现金成本,也没有计入持仓期间支付的费用。若回测把这笔交易称为盈利 $30,那它只算完了账本的一半。
开仓:价格、手续费,以及会变动的名义价值
假设开仓和平仓都产生 0.05% 的 taker 手续费。开仓手续费为 $3。平仓手续费按 $6,030 的 0.05% 计算,即 $3.015。四舍五入到美分后,执行手续费合计 $6.02。再加上两笔订单共计 $1.98 的模型滑点,执行成本总计 $8。
| 账目项目 | 计算方式 | 现金影响 |
|---|---|---|
| 价格盈亏 | 0.10 × ($60,300 − $60,000) | +$30.00 |
| 开仓手续费 | $6,000 × 0.05% | −$3.00 |
| 平仓手续费 | $6,030 × 0.05% | −$3.02 |
| 模型滑点 | 开仓与平仓估算值 | −$1.98 |
平仓手续费按平仓名义价值计算。价格发生变动时,这个小细节就很重要,尤其是交易笔数很多时。若模型将开仓和平仓手续费都按开仓名义价值收取,计算会更简单,但账目就不一样了。
资金费结算时点:两笔 $18 的支出
假设资金费每 8 小时结算一次,在两个结算时点持仓方向都是做多,而且交易所的资金费率两次均为正 0.03%。按照常见规则,正资金费意味着多头支付给空头。在本例中,假设每次结算时的持仓标记名义价值为 $6,000:
$6,000 × 0.03% = $1.80
每次结算金额只有 $1.80,因此我们把计算说清楚:若持仓价值为 $60,000,相同费率对应每次结算 $18.00。这个计算中的仓位是 1.0 BTC,而非前文的 0.10 BTC。为使示例前后一致,应按实际 0.10 BTC 仓位缩放资金费计算:其 $6,000 名义价值每次结算产生 $1.80 支出,两次合计 $3.60。
因此,完整结果为:价格盈亏 $30 − 执行成本 $8 − 资金费 $3.60 = +$18.40。按这份账目,这笔交易仍然盈利,但与价格盈亏相比,扣除手续费后的净结果因资金费减少了近五分之一。如果价格变动是 $100 而非 $300,相同成本就会让这笔交易转为亏损。
结算规则:结算时持有的是什么仓位?
资金费的收取或支付取决于交易场所的结算规则,以及结算时点符合条件的仓位。若策略在结算后 1 秒才开仓,通常不应支付上一时段的资金费。若仓位跨越结算时点,通常就应计入资金费。订单恰好在结算时点成交是否算符合条件,可能取决于交易场所的处理方式,以及模拟器可用的数据。
进行历史回放时,要将每个资金费率与其实际生效的结算时间配对,再根据交易场所使用的仓位和标记价格计算。如果只有时段标签,先确认标签的含义:08:00 发布的费率可能在 08:00 结算,也可能描述截至该时刻结束的时段。若错移一个时段,就可能把正确的数字分配给错误的仓位。
回测记录:应该保存什么
在交易账本中,将资金费事件作为独立的现金流记录保存。记录结算时间戳、交易品种、带符号的费率、符合条件的持仓数量、所用标记价格或名义价值,以及最终支付金额。这样既能检查计算过程,也能将仓位层面的结果与账户权益核对。
- 使用带符号的数量:若符合所选规则,多头为正,空头为负。
- 记录每个交易场所的符号规则;仅知道“正资金费”并不能说明策略是支付还是收取。
- 只有仓位在该事件中符合条件时,才计入这笔结算。
- 分别核对价格盈亏、手续费、滑点和资金费,再汇总净盈亏。
对于反向合约,本例的美元计算不能原样套用:结算可能以标的资产计价,合约价值也可能取决于反向收益公式。不过,稳妥的做法相同:合并计算前,先写明每个数量和现金流的单位。
在上面的例子中,结论取决于能否在每一行都保持 0.10 BTC 的仓位数量一致。这听起来像是小事,却能决定资金费支出是 $3.60,还是因仓位规模不匹配而凭空变成 10 倍。
← 全部文章


