第二章:回扣计算与结算机制
做量化交易的朋友都知道,手续费是隐形的利润杀手。但很多人不知道的是——如果你做对了方向,手续费反而能变成你的收入。这就是回扣的魅力。
今天我们就来聊聊回扣的计算与结算。这部分内容,说白了就是搞清楚「交易所到底怎么扣钱,又怎么返钱」。我做了这么多年风控,见过太多人因为算不清这笔账,策略明明赚钱,一扣手续费反而亏了。
2.1 Taker与Maker费用模型
先讲最基础的概念。交易所把订单分成两种角色:
- Maker(挂单者):你挂一个限价单,没有立即成交,而是挂在订单簿上等着。你提供了流动性,交易所通常给你优惠,甚至返钱。
- Taker(吃单者):你直接按市场价吃掉订单簿上的单子。你消耗了流动性,交易所会收你更高的手续费。
我个人习惯把Maker想象成「摆摊的」,Taker是「直接拿钱买东西的」。摆摊的给市场提供了商品选择,所以市场管理费低;直接买的图方便,多交点费也合理。
核心公式:
Maker手续费 = 成交金额 × Maker费率(通常为负值,即返钱)
Taker手续费 = 成交金额 × Taker费率(通常为正值,即扣钱)
举个例子。假设你在Binance做BTC/USDT交易,Maker费率是-0.01%,Taker费率是0.04%。你挂了100万U的Maker单,成交后交易所反而给你10U。如果你直接吃单,就要交400U。
嗯,这里要注意:不同交易所的费率差异很大。有的交易所Maker费率是0,有的是负的。我见过最夸张的是某小型交易所,Maker返佣高达0.02%,但Taker费率也高得吓人——0.1%。
2.2 回扣计算公式
回扣计算其实不复杂,但细节容易踩坑。我们拆开来看。
2.2.1 基础回扣公式
回扣金额 = 成交名义本金 × 回扣费率
其中:
- 成交名义本金 = 成交数量 × 成交价格
- 回扣费率 = 交易所规定的Maker返佣比例(通常为负值)
举个例子:
你在OKX挂单买入10个BTC,成交价30000 USDT
名义本金 = 10 × 30000 = 300,000 USDT
Maker费率 = -0.015%
回扣金额 = 300,000 × (-0.015%) = -45 USDT
(负值表示交易所给你钱,实际到账+45 USDT)
我曾经在项目中遇到过一个问题:某交易所对某些币种有最低回扣门槛。比如你挂单只成交了10U,按费率算应该返0.001U,但交易所规定最低返0.01U。这种细节不注意,对账时就会对不上。
避坑指南: 我曾经因为没注意「最小回扣单位」这个参数,导致策略回测和实盘差了0.3%的收益。后来我养成了一个习惯——每次接入新交易所,第一件事就是拉取它的费率规则JSON,逐条解析。
2.2.2 阶梯费率与VIP等级
大多数交易所都有阶梯费率。你交易量越大,费率越优惠。比如:
| 30天交易量(BTC) | Maker费率 | Taker费率 |
|---|---|---|
| < 100 | -0.01% | 0.04% |
| 100 - 1000 | -0.015% | 0.035% |
| > 1000 | -0.02% | 0.03% |
这里有个坑:阶梯费率是按「近30天累计交易量」计算的,而且是动态调整的。你今天交易量上去了,明天费率就变了。我见过有人策略跑得好好的,突然有一天手续费暴涨,一查才发现是交易量掉到了下一档。
2.3 结算周期与对账
回扣不是实时到账的。不同交易所的结算周期差异很大。
2.3.1 常见结算周期
- T+0 实时结算:成交后立即返佣。Binance、OKX等主流交易所都是这种。
- T+1 日结:第二天统一结算。部分中小交易所采用。
- 周结/月结:一周或一个月结算一次。多见于做市商协议。
我个人建议:做高频策略一定要选T+0结算的交易所。为什么?因为回扣是你的现金流。如果T+1结算,你的资金利用率就低了。我见过一个做市团队,因为选了月结的交易所,结果一个月下来回扣占了总利润的15%,但资金被占用了一个月,机会成本巨大。
注意: 有些交易所虽然宣称T+0,但实际到账有延迟。比如某交易所的API文档写的是「实时返佣」,但我实测发现平均延迟3-5秒。对于毫秒级高频交易来说,这个延迟足以影响策略。
2.3.2 对账方法
对账是风控的核心环节。我一般用三步法:
- 拉取交易记录:通过API获取每笔成交的详细信息,包括成交时间、价格、数量、手续费、回扣。
- 计算理论回扣:根据费率规则,手动计算每笔订单应该返多少。
- 比对差异:将理论值和实际值做差,超过阈值就报警。
# 伪代码示例
def check_rebate(trades, fee_rules):
for trade in trades:
expected = trade.amount * trade.price * fee_rules.maker_rate
actual = trade.rebate
if abs(expected - actual) > 0.0001:
alert(f"对账异常:订单{trade.id},预期{expected},实际{actual}")
我曾经用这个逻辑抓出过一次问题:某交易所的API返回的「手续费」字段,竟然包含了回扣和手续费的总和,而不是分开的。导致我算出来的回扣总是对不上。后来我仔细读了API文档才发现,人家把回扣直接算成了负数手续费。
2.4 常见交易所规则对比
我整理了一张对比表,方便大家快速了解主流交易所的差异:
| 交易所 | Maker费率 | Taker费率 | 结算周期 | 特殊规则 |
|---|---|---|---|---|
| Binance | -0.01% ~ 0% | 0.04% ~ 0.1% | T+0 | BNB抵扣可再打折 |
| OKX | -0.015% ~ 0% | 0.035% ~ 0.1% | T+0 | 阶梯费率按30天交易量 |
| Bybit | -0.01% ~ 0% | 0.04% ~ 0.075% | T+0 | USDC永续合约费率不同 |
| Deribit | -0.01% | 0.05% | T+1 | 期权合约费率固定 |
你想想看,同样是做Maker策略,在Binance和Deribit的费率差了0.005%。如果每天交易1亿U,一年下来就是18万U的差距。这就是为什么我每次接入新交易所,第一件事就是算清楚费率。
我的经验: 不要只看表面费率。有些交易所虽然Maker费率低,但Taker费率极高。如果你的策略有部分吃单需求,综合成本可能反而更高。我建议用「加权平均费率」来评估——根据你的策略中Maker和Taker的比例,算出一个综合费率。
知识体系结构图
下面这张图总结了本章的核心逻辑,方便你快速回顾:
这张图把本章的知识点串起来了。从左到右看:先理解费用模型,然后学会计算回扣,最后掌握对账方法。每一步都有坑,但只要你按这个框架走,基本不会出大问题。
最后说一句: 回扣计算看似简单,但实际落地时细节很多。我建议你写一个自动化对账脚本,每天跑一遍。别问我为什么——我曾经因为交易所改了费率没通知,导致对账差了2万U。从那以后,我再也不相信人工对账了。