期货对现货:赚取资金费率

套利课程第 14 课。什么是永续期货及其资金费率,如何在现货市场持有一枚币、在期货上持有相反仓位,以及手续费、负费率和强平如何影响结果。附有可手动核对数字的简短 Python 代码。

《自己动手做套利机器人》课程第 14 课。到现在为止,机器人寻找的是几秒内就会消失的价差。今天它会得到第二种策略:它缓慢而稳定地赚钱,但风险类型不同。

拥有同一枚币的两种方式

你可以在现货市场买一枚币:付钱、拿币,这枚币归你。

你也可以交易这枚币的期货。期货是一种价格跟随这枚币的合约。你不会拿到这枚币,而是得到一个仓位:如果你做多,价格上涨 10,每枚币赚 10;价格下跌 10,每枚币亏 10。做空时则相反。期货只需要把部分资金作为保证金,所以会带来杠杆。

你最常遇到的交易所会提供永续期货:没有到期日的合约。这带来一个问题。有到期日的期货会在最后一天被迫回到现货价格。永续期货永不到期,那么什么让它的价格保持在现货附近?

资金费率

答案是交易者之间的一笔支付,叫作资金费率。每 8 小时一次,在许多交易所中,一方支付给另一方。

  • 如果永续期货的价格高于现货,费率为正,多头支付给空头。
  • 如果它低于现货,费率为负,空头支付给多头。

这笔支付等于费率乘以仓位大小。过于热门的多头会变得昂贵,一些人就会平仓,价格会回到现货。这就是整个机制。

策略的思路

同时持有两边:在现货市场买 1 枚币,并在永续期货开 1 枚币的空头仓位。现在币价不重要。如果价格上涨 10,现货币赚 10,空头亏 10;如果价格下跌,情况相反。你的总额不变,交易者称之为德尔塔中性。

剩下的就是资金费率。费率为正时,你持有空头,每 8 小时收到一次支付。持有一个没有价格风险的仓位,别人会向你付钱。这叫现货持有套利或资金费率套利。

直接的方法:看年度数字

假设费率每 8 小时是 0.01%。每天有 3 次支付,因此 3 × 365 × 0.01% = 每年 10.95%。直接的结论是:投入 100,每年无风险收到 10.95,所以应该把全部资金都投进去。

用一个考虑更多因素的循环来检查这个结论。下面的代码以 100 的价格开这组仓位,经过 90 次资金费率支付,也就是 30 天,并加上手续费。费用是:现货交易为 0.1%,永续期货交易为 0.05%,开仓和平仓时各付一次。

SPOT_FEE, PERP_FEE = 0.001, 0.0005          # taker fees, per trade
price = 100.0

# funding rate per 8 hours, 3 payments a day, 30 days = 90 payments
rates = [0.0001] * 45 + [0.00005] * 20 + [-0.0001] * 15 + [0.0001] * 10

def carry(rates, exit_when_negative=False):
    cost_in = price * SPOT_FEE + price * PERP_FEE        # buy spot, open short
    cost_out = price * SPOT_FEE + price * PERP_FEE       # sell spot, close short
    income = 0.0
    for r in rates:
        if exit_when_negative and r < 0:
            break
        income += price * r                              # the short side receives r * notional
    return income - cost_in - cost_out, income

for name, flag in [("hold all 30 days", False), ("leave at first negative", True)]:
    net, gross = carry(rates, flag)
    print(f"{name:24} funding {gross:6.3f}  fees {2*(price*SPOT_FEE+price*PERP_FEE):.3f}  net {net:+.3f}")

fees = 2 * (price * SPOT_FEE + price * PERP_FEE)
print("payments to cover fees", round(fees / (price * 0.0001)), "=", round(fees / (price * 0.0001) / 3, 1), "days")

输出:

hold all 30 days         funding  0.500  fees  0.300  net +0.200
leave at first negative  funding  0.550  fees  0.300  net +0.250
payments to cover fees 30 = 10.0 days

逐条来看。

  • 测试中的费率不是恒定的:45 次支付为 0.01%,接着 20 次为其一半,接着 15 次负费率支付,最后 10 次又回到 0.01%。这模拟了真实市场,费率会随交易者情绪变化。
  • 持有全部 30 天:资金费率收入为 0.45 + 0.10 − 0.15 + 0.10 = 0.50。费用为 0.30,开仓 0.15,平仓 0.15。100 的净结果是 +0.20,即一个月 0.2%,一年约 2.4%,而不是标题里的 10.95%。
  • 费率一转负就离场,可多赚 0.05:15 次负支付花掉 0.15,最后 10 次正支付又带回 0.10。
  • 即使费率处于完整水平,也要 30 次支付、10 天才能打平。交易者以 0.01% 的费率持有这组仓位 3 天会亏钱。

因此,10.95% 只是一个上限,只有费率始终为 0.01% 且你长期持仓时才存在。这个循环解释了第一种想法为什么过于乐观:费率会改变符号,手续费则在两端都要支付。

开仓前机器人会检查什么

  • 当前和预期费率。 看过去几天的平均值,而不仅是最新值。
  • 两端的费用。 把它们计入打平时间,并与费率保持稳定的时长比较。
  • 哪家交易所支付。 同一枚币在不同交易所的费率不同。机器人可能在一家交易所使用现货市场,在另一家使用永续期货,这也增加了将资金放在两处的成本。
  • 离场规则。 例如,“当平均费率转负时离场”。像上面的循环一样,规则应当写下来并经过测试。

真正的危险:空头使用保证金

现货币和空头位于不同账户。空头是带杠杆的仓位,亏损吃掉保证金时,交易所会强制平仓,称为强平。忽略较小的维持保证金时,一个粗略公式是:杠杆为 L 的空头会在价格上涨约 100 / L% 时被强平:

for L in (2, 5, 10):
    print(f"leverage {L:>2}: perp short liquidated near price {price*(1+1/L):6.1f} (+{100/L:.0f}%)")
leverage  2: perp short liquidated near price  150.0 (+50%)
leverage  5: perp short liquidated near price  120.0 (+20%)
leverage 10: perp short liquidated near price  110.0 (+10%)

现在情况改变了。如果杠杆为 5 时价格一天上涨 20%,你持有的币赚了 20,但交易所已经以 20 的亏损强平了空头。你会留下一个没有计划过的、带有价格风险的开放币仓位。纸面上的总额原本不变,强制平仓打破了它。解决办法虽然朴素但有效:使用低杠杆,1 到 2 倍,准备一笔备用资金,价格上涨时机器人可以把它转入保证金账户,并让第 12 课的风险限制在保证金水平变低时停止一切。

让 AI 智能体编写并测试代码

一个含糊的请求:

构建一个资金费率套利机器人。

一个自带检查条件的请求:

编写 carry.py,其中 carry(rates, price, spot_fee, perp_fee, exit_when_negative) 返回 (net, gross)。当 price 为 100、费用为 0.001 和 0.0005,且费率列表使用第 14 课的数值,45 次 0.0001、20 次 0.00005、15 次 -0.0001、10 次 0.0001,持有全部期间时必须返回 net 0.2,使用 exit_when_negative 时必须返回 net 0.25。添加 break_even_payments(rate, price, spot_fee, perp_fee),当 rate 为 0.0001 时它必须返回 30。添加 liquidation_price(entry, leverage) = entry * (1 + 1 / leverage)。不要发起网络请求,不要下真实订单。

在信任代码前,手动核对这三个数字。

练习

  1. 运行代码,将每一个打印出的数字与本课对照。
  2. 将现货费率改为 0.0002,将永续期货费率改为 0.0002,这是一位享受折扣的交易者。现在需要多少天完整费率才能打平?先手算:费用为 2 × (0.02 + 0.02) = 0.08。
  3. 更改费率列表,让负费率部分持续 40 次支付。现在是继续持有更好,还是在第一次负费率时离场更好?差多少?
  4. 对于 5 倍杠杆的情况,价格一天上涨 20%。在纸上写下现货一侧和空头一侧会发生什么,以及机器人为了保持安全,本应在这次移动前做什么。

接下来

机器人现在有两种策略:交易所间快速消失的价差,以及缓慢的资金费率收入。第 15 课会给它第三种策略,你可以选择交易一对会共同移动的币,统计套利,或在已有信号上加入机器学习筛选器。