第十七章:实盘交易注意事项
各位同学,前面我们讲了基差交易的策略逻辑、回测框架,甚至把对冲比例怎么算都掰开揉碎了。但说实话,从回测到实盘,中间隔着一道天堑。我见过太多策略在回测里漂亮得像艺术品,一上实盘就亏得亲妈都不认识。
为什么会这样?因为实盘交易里,有四个你绕不开的「隐形杀手」:滑点、冲击成本、交易对手风险,还有流动性分层。今天我们就来逐个拆解。
一、滑点与冲击成本:你的利润是怎么被吃掉的
先讲个我自己的教训。2019年我做螺纹钢和热卷的跨品种套利,回测里年化收益能做到18%,最大回撤不到3%。结果实盘第一天,一个300手的单子下去,滑点直接干掉了0.5个点。你想想看,基差套利本身利润就薄,0.5个点相当于吃掉了我一周的预期收益。
滑点,说白了就是你下单时的预期成交价和实际成交价之间的差值。而冲击成本,是你的订单本身对市场价格造成的影响。两者往往是伴生的——你单子越大,冲击成本越高,滑点也越严重。
核心公式(实战版):
实际执行成本 = 滑点 + 冲击成本 + 手续费
其中冲击成本 ≈ 订单规模 × 市场深度斜率
我个人习惯用「流动性系数」来估算冲击成本。比如在螺纹钢主力合约上,我统计过:每100手市价单大约会造成0.2个tick的滑移。这个系数每个品种都不一样,你得自己跑数据去拟合。
避坑指南:
我曾经在焦炭合约上吃过亏。焦炭一手100吨,流动性远不如螺纹钢。我按螺纹钢的经验去下焦炭的单子,结果冲击成本是预估的3倍。后来我学乖了——每个品种单独建一个冲击成本模型,绝不复用。
二、交易对手风险:你以为成交了就安全了?
基差交易里,我们经常要同时持有期货和现货(或者两个不同合约)。这里有个很多人忽略的问题:你的交易对手是谁?
在交易所场内交易,有中央清算所担保,对手风险几乎为零。但如果你做的是场外衍生品,或者通过做市商进行大宗交易,那对手风险就是实打实的。
| 交易类型 | 对手风险等级 | 应对措施 |
|---|---|---|
| 交易所期货(主力合约) | 极低 | 正常风控即可 |
| 交易所期货(非主力) | 中等 | 控制仓位,避免大单 |
| 场外互换/远期 | 高 | 必须做信用评估,设置授信额度 |
| 做市商报价交易 | 中等 | 多询价,分散交易对手 |
我记得2020年有个同行,做铜的保税区基差交易,跟一家中小型贸易商签了远期合约。结果铜价暴跌,那家贸易商直接违约,他这边现货端亏了,期货端的对冲头寸却还在,两头挨打。嗯,这就是典型的对手风险失控。
警告:
永远不要把所有头寸集中在一个交易对手上。哪怕对方是大型机构,也要设置单日最大交易限额。我个人的红线是:单一对手的敞口不超过净资产的15%。
三、流动性分层:你以为的流动性,可能只是假象
很多新手看盘口,只看买一卖一的价格和数量。但实盘里,这远远不够。流动性是分层的——你看到的买一可能只有10手,但买二到买五加起来有500手。如果你下个50手的卖单,可能直接砸穿三层盘口。
我习惯用「订单簿斜率」来衡量真实流动性。简单来说,就是看价格每变动一个tick,累计挂单量的变化速度。斜率越陡,说明流动性越差,你的冲击成本就越高。
# 订单簿斜率计算(Python伪代码)
def orderbook_slope(orderbook, depth=10):
"""
orderbook: 包含 bids 和 asks 的字典
depth: 计算深度(层数)
返回:斜率值,越大表示流动性越差
"""
bids = orderbook['bids'][:depth]
asks = orderbook['asks'][:depth]
# 计算累计挂单量
bid_volumes = [sum([b[1] for b in bids[:i+1]]) for i in range(len(bids))]
ask_volumes = [sum([a[1] for a in asks[:i+1]]) for i in range(len(asks))]
# 计算价格变化
bid_prices = [b[0] for b in bids]
ask_prices = [a[0] for a in asks]
# 斜率 = 价格变化 / 累计量变化
bid_slope = (bid_prices[-1] - bid_prices[0]) / bid_volumes[-1] if bid_volumes[-1] > 0 else float('inf')
ask_slope = (ask_prices[-1] - ask_prices[0]) / ask_volumes[-1] if ask_volumes[-1] > 0 else float('inf')
return (bid_slope + ask_slope) / 2
你看,这个代码很简单,但实战中非常有用。我每天开盘前都会跑一遍所有持仓品种的订单簿斜率,斜率超过阈值的品种,我会主动降低交易频率,或者改用限价单慢慢吃。
一个小技巧:
流动性分层还有一个容易被忽视的点——时间维度。早盘开盘和下午收盘前,流动性往往最差。我一般会避开这两个时间段做大规模调仓。午盘10:30到11:30,以及下午2:00到3:00,是流动性最好的窗口。
四、限价单策略:被动成交的艺术
说到限价单,很多人觉得就是「挂个单等着呗」。其实没那么简单。限价单的核心在于:你愿意用时间换价格,还是用价格换时间?
基差交易里,我强烈建议优先使用限价单。原因很简单——基差套利的利润空间本来就窄,市价单的滑点可能直接让策略从盈利变成亏损。
但限价单也有坑。比如你挂了一个买单在买一位置,结果行情快速上涨,你的单子一直没成交,等你想撤单重挂的时候,价格已经跑远了。这就是所谓的「挂单踏空」。
我的应对策略是「分层挂单法」:
- 核心仓位(60%): 挂在当前买一价,耐心等待成交
- 机动仓位(30%): 挂在买一和买二之间,稍微激进一点
- 应急仓位(10%): 用市价单处理,只在需要快速建仓或平仓时使用
另外,撤单重发的频率也很关键。我见过有人每秒撤单重发一次,结果被交易所当成「虚假申报」给限制了。我个人习惯是:如果挂单超过3秒没成交,且价格已经偏离了0.5个tick以上,我才考虑撤单重发。
实战口诀:
限价单,慢慢吃,
分层挂,不着急。
流动性差用冰山,
对手风险要隔离。
最后说一句,实盘交易没有银弹。滑点、冲击成本、对手风险、流动性分层——这四个问题你永远无法完全消除,只能管理。我做了十年量化,到现在每次上实盘前还是会紧张。但正是这种敬畏心,让我活到了现在。
好了,这一章的内容就到这里。记住:回测是艺术,实盘是科学。把细节抠到极致,你的策略才能从纸面走向真金白银。