一、套利交易基础:什么是套利?
说实话,我做了这么多年量化交易,被问得最多的问题就是——「套利到底是个啥?」
很多人一听到「套利」两个字,脑子里就浮现出电影里那种疯狂敲键盘、屏幕上数字乱跳的画面。其实没那么玄乎。
套利,说白了就是「捡钱」。
同一个东西,在两个地方卖不同的价格。你从便宜的地方买,到贵的地方卖,中间的差价就是你的利润。这就是套利的本质。
嗯,这里要注意——真正的套利是无风险的。或者说,理论上应该是无风险的。
核心定义:套利是指利用同一资产在不同市场、不同时间或不同形式之间的价格差异,通过同时买入和卖出操作,获取无风险收益的交易策略。
1.1 套利的数学本质
我个人习惯把套利拆成数学公式来看。这样更清楚,也更方便写代码实现。
假设有两个市场 A 和 B,同一个资产的价格分别是 P_A 和 P_B。
套利条件就是:
|P_A - P_B| > C
其中 C 是交易成本(手续费、滑点、冲击成本等)。
当这个不等式成立时,就存在套利机会。
套利利润的计算公式:
利润 = |P_A - P_B| - C
如果利润 > 0,就可以动手了。
我在项目中遇到过不少新手,看到价格差就兴奋地冲进去,结果忘了算手续费。最后发现忙活半天,利润全给交易所打工了。
我的经验:套利交易的核心不是「发现差价」,而是「扣除成本后还有差价」。成本控制是套利策略的生命线。
1.2 套利的核心逻辑
套利听起来简单,但背后的逻辑其实挺深的。我总结了三句话:
- 价格发现机制失效——市场暂时「犯错了」
- 均值回归——价格最终会回到合理区间
- 市场效率提升——套利行为本身在修复价格偏差
你想想看,如果所有市场都是完全有效的,那就不存在套利机会了。但现实是,市场经常「走神」。
比如,同一只股票在 A 股和港股同时上市,价格按理说应该差不多。但因为两个市场的投资者结构不同、交易时间不同、汇率波动等因素,价格经常出现偏差。
这就是套利者的机会。
1.3 套利的三种基本形态
根据我的经验,套利可以分成三大类。每一类的逻辑和操作方式都不一样。
| 套利类型 | 核心逻辑 | 典型场景 | 风险来源 |
|---|---|---|---|
| 空间套利 | 同一资产在不同市场的价差 | 跨交易所套利、跨境套利 | 交易延迟、流动性不足 |
| 时间套利 | 同一资产在不同时间的价差 | 期现套利、跨期套利 | 持仓成本、基差风险 |
| 统计套利 | 相关资产之间的价差回归 | 配对交易、ETF套利 | 相关性突变、模型失效 |
空间套利是最直观的。比如比特币在币安卖 50000 美元,在 OKX 卖 50050 美元。你在币安买,在 OKX 卖,净赚 50 美元(扣除手续费后)。
但说实话,这种机会现在越来越少了。高频交易和做市商把价差压得很低。
时间套利稍微复杂一点。比如期货和现货之间的价差。期货价格按理说应该等于现货价格加上持仓成本。如果偏差太大,就存在套利空间。
我曾经做过一个期现套利的策略,回测效果特别好。结果实盘第一天就遇到了交割日效应,差点翻车。嗯,这个坑后面会详细讲。
统计套利是我个人最喜欢的。它不依赖绝对价格的偏差,而是看两个相关资产之间的相对关系。
比如茅台和五粮液,历史上它们的价格走势高度相关。如果某天茅台涨了 5%,五粮液只涨了 1%,那这个价差大概率会回归。你就可以做多五粮液、做空茅台,赚回归的钱。
避坑指南:统计套利最大的风险是「相关性突变」。我曾经在 2020 年 3 月做过一个配对交易策略,两个资产的历史相关性高达 0.95。结果疫情一来,相关性直接变成负的,一天亏了 8%。从那以后,我每次做统计套利都会加上「相关性监控」和「止损线」。
1.4 套利的数学建模框架
做量化的人,不能光靠感觉。我们需要一个数学框架来量化套利机会。
我个人习惯用以下步骤:
- 定义价差:S = P_A - P_B(或者用对数价差)
- 检验平稳性:用 ADF 检验判断价差是否均值回归
- 设定阈值:通常用均值 ± k × 标准差
- 生成信号:价差超过上阈值 → 做空价差;低于下阈值 → 做多价差
- 风险控制:设置止损、仓位管理、最大回撤限制
代码实现大概是这样的:
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller
def detect_arbitrage_opportunity(price_a, price_b, window=20, z_threshold=2):
"""
检测套利机会
price_a, price_b: 两个资产的价格序列
window: 滚动窗口
z_threshold: 触发交易的 Z-score 阈值
"""
spread = price_a - price_b
# 计算滚动均值和标准差
mean = spread.rolling(window).mean()
std = spread.rolling(window).std()
# 计算 Z-score
z_score = (spread - mean) / std
# 生成信号
signals = pd.Series(0, index=price_a.index)
signals[z_score > z_threshold] = -1 # 做空价差
signals[z_score < -z_threshold] = 1 # 做多价差
return signals, z_score
小技巧:实际交易中,我一般会把 z_threshold 设成 2.5 或 3,而不是 2。因为 2 个标准差以内的波动太常见了,频繁交易只会增加手续费。记住,套利不是做高频,是做确定性。
1.5 套利策略的知识体系
下面这张图是我自己整理的套利策略知识体系。每次做新策略前,我都会对照着过一遍,确保没有遗漏。
1.6 套利交易的核心原则
最后,我想分享几条我这些年总结出来的原则。算不上什么金科玉律,但确实帮我避了不少坑。
- 不要追求完美——套利机会转瞬即逝,等你想清楚再动手,黄花菜都凉了
- 成本是第一位的——手续费、滑点、冲击成本,每一项都能吃掉你的利润
- 流动性是生命线——再好的套利机会,没有流动性就是纸上谈兵
- 风险永远存在——所谓的「无风险套利」只是理论上的,现实中总有意外
- 回测不可全信——我见过太多回测漂亮、实盘翻车的策略了。回测只是起点,不是终点
一句话总结:套利交易的本质不是「发现机会」,而是「管理风险」。你赚的每一分钱,都是你承担了别人不愿意承担的风险换来的。
好了,第一章就到这里。套利的基础概念和核心逻辑,我觉得已经讲得比较清楚了。下一章我们会深入聊套利策略的具体实现和回测框架搭建。