第十二章:套利策略实战
套利,说白了就是赚「定价错误」的钱。同一个东西,在不同地方、不同时间,价格不一样,你低买高卖,这就是套利。听起来简单吧?但实际做起来,坑多得很。
我做了这么多年量化,套利策略一直是我的「压舱石」。为什么?因为套利策略的风险相对可控,收益虽然不高,但胜在稳定。今天我就把几种常见的套利玩法,掰开揉碎了讲给你听。
12.1 跨期套利
跨期套利,就是同一个品种,不同月份的合约之间,价格出现了偏差。比如螺纹钢,主力合约是2401,次主力是2405。正常情况下,远月合约应该比近月贵一点,因为要算上持仓成本。但如果价差偏离了正常范围,就有机会了。
核心逻辑:价差会回归均值。
我习惯用「价差序列」来做分析。先算一下历史价差的均值、标准差,然后设定一个阈值。比如价差超过2倍标准差,我就开仓。等它回归到均值附近,平仓走人。
- 选流动性好的合约,别碰那些一天成交不了几手的品种
- 注意交割月临近时的逼仓风险
- 价差回归的时间不确定,要有耐心
# 跨期套利价差计算示例
import numpy as np
def calc_spread(price_near, price_far):
"""计算跨期价差"""
spread = price_far - price_near
return spread
def detect_arbitrage_opportunity(spread_series, threshold=2):
"""检测套利机会"""
mean = np.mean(spread_series)
std = np.std(spread_series)
z_score = (spread_series[-1] - mean) / std
if abs(z_score) > threshold:
return True, z_score
return False, z_score
12.2 跨市场套利
同一个品种,在不同交易所上市,价格按理说应该差不多。但实际中,因为时差、流动性、交易规则不同,经常会出现价差。比如A股和港股,同一只股票,两地价格经常不一样。
跨市场套利最大的难点是什么?是执行速度。你这边看到价差出来了,等你在两个市场都下完单,价差可能已经没了。所以,跨市场套利对交易系统的延迟要求很高。
我曾经做过一个沪港通套利策略,当时发现一个很有意思的现象:A股开盘前半小时,价差波动特别大。为什么?因为港股已经交易了一段时间,而A股刚开盘,信息不对称导致的。嗯,这个窗口期,就是套利的好时机。
12.3 统计套利
统计套利,说白了就是找「亲戚」。两只股票,走势高度相关,比如茅台和五粮液。正常情况下,它们的价差会在一个范围内波动。如果某天价差突然拉大,那就说明其中一只被高估了,另一只被低估了。
怎么做?用协整检验。先找出一对协整关系的股票,然后建立回归模型,算出残差。残差就是价差的偏离程度。当残差超过阈值时,开仓做多被低估的,做空被高估的。
# 统计套利协整检验示例
from statsmodels.tsa.stattools import coint
def find_cointegrated_pairs(price_df):
"""寻找协整对"""
n = price_df.shape[1]
pvalue_matrix = np.ones((n, n))
for i in range(n):
for j in range(i+1, n):
_, pvalue, _ = coint(price_df.iloc[:, i], price_df.iloc[:, j])
pvalue_matrix[i, j] = pvalue
return pvalue_matrix
12.4 延迟套利
延迟套利,听起来有点玄乎,其实原理很简单:利用信息传递的时间差。比如,某个重大消息先在一个市场反应,另一个市场还没反应过来,这就是机会。
举个例子:美国非农数据公布后,黄金期货瞬间波动。但国内的黄金ETF,因为交易机制不同,反应会慢几秒钟。如果你能在这几秒钟内完成交易,就能赚到钱。
但说实话,延迟套利现在越来越难做了。为什么?因为大家都在拼速度,拼算法。你想想看,机构都用上了FPGA、微波通信,普通散户拿什么跟人家比?
12.5 套利机会检测
说了这么多,怎么才能发现套利机会?总不能天天盯着屏幕看吧。当然不行,我们要用程序来检测。
我一般会建一个「套利机会检测系统」,流程是这样的:
- 数据采集:实时获取多个市场的行情数据
- 价差计算:实时计算各种价差指标
- 阈值判断:当价差超过设定阈值时,触发警报
- 风险评估:计算当前机会的风险收益比
- 执行决策:如果风险可控,自动下单
# 套利机会检测框架
class ArbitrageDetector:
def __init__(self, threshold=2.0):
self.threshold = threshold
self.opportunities = []
def check_opportunity(self, price_a, price_b):
"""检测套利机会"""
spread = price_a - price_b
z_score = self.calc_z_score(spread)
if abs(z_score) > self.threshold:
opportunity = {
'spread': spread,
'z_score': z_score,
'direction': 'long_short' if z_score > 0 else 'short_long'
}
self.opportunities.append(opportunity)
return opportunity
return None
def calc_z_score(self, spread):
"""计算z-score"""
# 这里用滚动窗口计算均值和标准差
return (spread - self.mean) / self.std
- 套利机会检测要快,延迟越低越好
- 阈值设置要合理,太宽了抓不到机会,太窄了全是假信号
- 一定要做风险控制,别因为一次套利把之前的利润都亏回去
最后说一句,套利策略不是稳赚不赔的。市场在变,套利机会也在变。我见过太多人,回测做得漂亮,实盘一跑就亏。为什么?因为回测的时候用的是历史数据,但市场结构已经变了。所以,做套利策略,一定要持续监控、持续优化。