新手最友好策略:详解所内期现资金费率套利
新手最友好策略:详解所内期现资金费率套利
目前,量化圈已经从5年前的手动点击就可以印钞变成顶尖机构团队高频互相收割,连做市商都过不下去,交易所被迫推出了RPI这玩意(只与散户成交的订单)
那现在还有小白就能轻松赚钱的策略吗?
还真有!
期限套利
如下图是我实际的 PnL 收益曲线,几乎是不会有回撤发生,即使有,也是微乎其微。
并且,以我在行业内的人脉了解,运行在此策略上的资金不少于100亿
你要问我收益怎么样,只能说比存银行高,反正我看不上
什么是资金费率?
在传统金融期货中,合约有“交割日”,随着交割日临近,期货价格会强制回归现货价格,因为合约有兑换现货的权力,从而实现了价格的锚定。但在加密市场,有一种特殊也是交易量最大的合约:永续合约,它没有交割日。没有交割日这一个特征,使得永续合约的价格脱离现货是一件容易的事情,从而也难免价格被人操控。而对于金融资产持续的恶意操控也是交易所不支持的一种行为,为了杜绝该现象的发生,并且确保市场的流动性,交易所设计了一个机制,便是资金费率机制。资金费率机制保证了现货价格和期货价格不会距离很远,因为持仓是有成本的,从而在一定程度上遏制了价格操纵的行为。资金费率的具体机制如下:
- 当行情火爆,做多情绪高涨时: 合约价格通常高于现货价格(溢价)。此时,资金费率为正,多头需要向空头支付费用,用于抑制做多,使得价格回归到现货。
- 当行情低迷,做空情绪主导时: 合约价格通常低于现货价格(折价)。此时,资金费率为负,空头需要向多头支付费用,用于抑制做空,使得价格回归到现货。。
在加密市场的大多数时间里,永续合约处于“正费率”的时间占据了绝大多数。这意味着,在永续合约的这个市场做空,往往能躺着收钱。 从而这个市场特征,为我们接下来的期限资费套利创造了生存的环境。
交易核心:如何实现“Delta中性”来过滤掉价格波动带来的盈亏?
期现套利的核心在于 “对冲”,即剥离价格波动的风险,只赚取确定的收益。只有这样,才能过滤掉因为涨跌带来的盈亏,只赚取最纯粹的利率,因此对新手来说,这是一个非常好的路子,不会亏大钱。
具体的对冲逻辑和方法如下,我们假设合约的杠杆都是 10 倍杠杆,并且我们此时有 110,000 USDT:
这里的资金分配需要满足条件:我使用 100,000 USDT 发送现货订单,使用一倍杠杆,来避免资金借贷产生的利息。同时,用剩余的 10,000 USDT 发送永续合约做空订单,使用 10 倍杠杆,获得名义价值为 100,000 的订单。此时,在名义价值上,现货和合约是相等的,那么价格的变化应该也是一样的。从而过滤掉了价格波动带来的盈亏。注:更实战的做法应该是持有相同份额的现货,因为以合约价格计价的现货和现货的价格,会出现价差波动。合约和对应的现货权益不同的合约是有不同的对应关系。可以通过 OpenQuant 中的 self.trader.get_instruments() 函数接口来查询每个币种单独的信息。
假设 BTCUSDT 价格为 100,000 USDT。现在我们需要同时做多现货和做空合约,来赚取合约大部分时间的正资金费率。那么我们需要按照如下两步的行为来做:
- 现货买入: 花 100,000 USDT 买入 1 个 BTC。
- 合约做空: 在永续合约中,以 10 倍杠杆做空 1 个 BTC(价值 100,000 USDT, 保证金使用 10,000 USDT)。
此时你的账户状态:
- 如果 BTC 上涨 10%,你的现货赚 10%,合约亏 10%,盈亏抵消。
- 如果 BTC 下跌 10%,你的现货亏 10%,合约赚 10%,盈亏抵消。
无论市场的价格怎么变,你持有的仓位本金总价值几乎不变。这就构成了 Delta 中性,也是一个中性的仓位。
在 OpenQuant 中,可以非常简单来实现 Delta 中性的对冲下单,以下是我的示例代码:
"""
注:以下代码仅为演示教学,用于讲述 Delta 中性的发单逻辑应该如何设计。OpenQuant 中实际使用时,还需要根据自己的函数变量、版本来进行细节上的调整。
"""
def on_strategy(self, symbol):
if self.fundings[1][symbol] > 0: # 表示永续合约费率为负
self.trader.place_order(symbol, side="Sell", pos="Short")
def on_order(self, account_id, order):
if account_id:
# 假设 account_id 为 1 表示永续合约端,account_id 为 0 表示现货端
self.place_order(self, symbol, side="Buy", pos="Long", is_spot=True)
def place_order(self, symbol, side, pos_side, is_spot):
idx = 1 if not is_spot else 0
if side == "Buy":
price = self.bbos[idx][symbol]['ask_price']
amount = self.bbos[idx][symbol]['ask_qty']
else:
price = self.bbos[idx][symbol]['bid_price']
amount = self.bbos[idx][symbol]['bid_qty']
order = {
"cid": self.trader.create_cid(self.ex_map[idx]), # 客户端订单ID
"symbol": symbol,
"order_type": "Limit", # 限价单
"side": side, # Buy/Sell
"pos_side": pos_side, # 单向持仓模式
"time_in_force": "GTC", # 持续直到取消
"price": price,
"amount": amount,
"reduce_only": False,
}
params = {
'is_dual_side': False,
"margin_mode": "Cross",
"leverage": self.leverage if not self.is_spot or (self.is_spot and idx == 1) else 1,
"process_amount": "Floor",
}
if self.is_spot and idx == 0:
order['quote_amount'] = local_order.amount * local_order.price
result = self.trader.place_order(idx, order, params=params)
self.trader.log(f"下单结果: {result}", level="INFO", color="blue", web=False)
利润来源:
既然不赚价差,赚什么?赚资金费。因为在永续合约端持有空单,只要资金费率为正,每隔 n 个小时就会收到多头支付的利息。
资金费计算的原理
接下来从理论的角度来说,交易所是怎么计算资金费率的。资金费率并非随意制定,而是由交易所算法实时计算的。主要由两部分组成:
Funding_Rate = Clamp(MA((FuturePrice - SpotPrice)/SpotPrice) + InterestRate)
简单来说:
- 利率分量(Interest Rate): 基础利率,通常固定在每天 0.03% 或 0.01% 左右,每个交易所有所不同,因为基础利率高,这也是币圈利润高的原因之一。
- 溢价指数(Premium Index): 反映合约价格相对于现货价格的偏离程度。偏离越大,费率越夸张。
接下来我将介绍在 OpenQuant 中订阅资金费率的一些细节操作和注意事项:
Open Quant 提供了非常简便的订阅资金费的方法:
def subscribes(self):
subs = []
for i in range(self.base_index):
if not self.is_spot(i): # 现货没有资金费率,不能订阅,只订阅非现货的,is_spot 方法需要用户自己实现判断
subs.append(
{
"account_id": i,
"sub": {
"SubscribeRest": { # 推荐使用 Rest 接口订阅,因为会返回下一次结算时间,便于进行风险控制管理和统计
"update_interval": {"secs": 60, "nanos": 0},
"rest_type": "Funding",
}
},
}
)
return subs
当订阅好了资金费之后,OpenQuant 系统收到了资金费率数据的时候,会主动回调接口 on_funding ,我们只需要在该函数里处理资金费率数据,就可以完成对交易所所有币种的实时资金费进行数据分析。
def on_funding(self, exchange, fundings):
try:
# 使用 update() 方法更新,而不是直接赋值,避免覆盖其他 symbol
exchange_idx = self.ex_map[exchange]
new_fundings = {
item["symbol"]: item for item in fundings if item["symbol"] in self.symbols
}
self.fundings[exchange_idx].update(new_fundings)
if self.is_spot:
# 因为是现货,所以资金费率都是 0, funding_interval 和 next_funding_at 和期货保持一致即可。
spot_fundings = {
item["symbol"]: {"symbol":item["symbol"], \
"funding_rate": 0, \
"funding_interval": item["funding_interval"], \
"next_funding_at": item["next_funding_at"]} for item in fundings if item["symbol"] in self.symbols
}
self.fundings[0].update(spot_fundings)
except:
logger.error(f"{traceback.format_exc()}")
收益计算公式:
单次收益 = 持仓名义价值 × 当期资金费率
- 举例: 你持有价值 10 万 U 的 BTC 空单,当前费率为 0.01%,结算时间为 8 小时,每天结算 3 次。
- 收益: 每 8 小时收入 10 U,一天收入 30 U。
- 年化: 如果平均费率维持在 0.01%,年化约 11%;若牛市费率飙升至 0.1%,年化可达 100%+。
如何进行期现套利?
进行所内期现套利,流程相对简单,无需跨平台转账,但是需要创建统一账户,让U本位永续合约账号和现货账号可以互相充当保证金,来避免强平风险:
- 准备资金: 假设你有 11,000 USDT。
- 分配资金: 将 10,000 USDT 买入现货,剩下 1,000 USDT 转入合约账户作为保证金。
- 建立空单: 在永续合约页面,选择10倍杠杆(或更低),开立与现货等值的空单(Short)。
- 注意:必须保证 空单价值 = 现货持仓数量。
- 自动印钞: 只要费率为正,系统每 n 小时会自动将资金费结算到你的合约账户。
- 结束套利: 卖出现货的同时平掉空单,进行止盈止损。
以下是我自己的一些研究数据和结果,左侧是资金费率,起点是 0 轴,可以看到大部分的资金费率都是在 0 轴之上的,曲线密密麻麻看不到底部,但是也有少部分极端情况,资金费率是持续为负数,意味着在这些极端情况下,期限套利的模式是会亏损。
从资金费的统计结果来看,绝大部分的币种的永续合约资金费率,在绝大多数情况下,都是维持 正利率 的状态,因此给了市场进行套系的空间和丰厚的回报。而这些前提,也符合策略最开始的假设,更是策略长期有效的 生命线。但是也可以看到,仍然有部分币种的资金费率,会维持较长时间的 负利率 的状态,这是策略的最主要风险点。
风险管理:
虽然期现套利被称为低风险策略,但绝非零风险。以下风险点必须注意并且进行一定的风险管理:
-
爆仓风险: 虽然是对冲模式,但如果你的合约杠杆过高,当币价短时暴涨时,又来不及转账,合约端的保证金可能不足以支撑亏损而被强制平仓,导致对冲失败,只剩下亏损的现货。
- 对策:使用统一账户。
-
费率反转风险: 如果市场进入深熊,资金费率可能长期为负。此时做空不仅收不到钱,还要付钱给多头。如上图所示的一些极端费率情况,负费率可以很夸张。
-
对策:监控费率,一旦长期转负,及时平仓离场。
-
需要有对应的风控代码进行监控
def risk_monitor(self, symbol): if self.fundings[1][symbol] < 0 and self.position[symbol]: # 表示在该 symbol 上有仓位,并且资金费率发生了反转 self.trader.log(f"持仓 {symbol} 产生了资金费率反转,请注意", level="INFO", web=True) -
-
价差: 在开仓和平仓的瞬间,如果买入现货和做空合约没有同时完成,可能会产生滑点磨损,吃掉部分利润。并且可能每单位的现货价格和期货价格在开仓时会有价差,吞噬一部分利润。
- 对策:深入使用 OpenQuant 交易系统并且在流动性好的主流币种上操作。
总结
当看到这里已经可以创造出一个很完整的期限套利策略了,就问你,货干不干?硬不硬?关注点不点?





