第十四章:基差交易进阶
各位同学,欢迎来到基差交易的进阶篇。说实话,前面几章我们把基差的基本概念、套利逻辑都讲透了。但真正到了实战层面,你会发现——纸上谈兵容易,真金白银进场就是另一回事了。
这一章,我打算把几个硬骨头啃下来:期现套利的实操细节、仓储和交割成本怎么算、基差回归模型怎么搭,还有季节性规律怎么用。嗯,这些都是我这些年踩坑踩出来的经验,希望能帮你少走弯路。
14.1 期现套利:不只是买现货卖期货
期现套利,说白了就是利用期货和现货之间的价差赚钱。但很多人以为,只要价差大了就无脑进场——我告诉你,没那么简单。
我在2019年做过一次螺纹钢的期现套利,当时基差拉到了历史极值,我兴冲冲地买了现货、空了期货。结果呢?仓储费、资金成本、交割损耗算下来,利润薄得像纸片。那次之后,我养成了一个习惯:进场前先把所有成本列清楚。
期现套利的核心逻辑是这样的:
- 正向套利:基差过大(现货便宜、期货贵)→ 买入现货,卖出期货 → 等待基差回归 → 平仓获利
- 反向套利:基差为负(现货贵、期货便宜)→ 卖出现货,买入期货 → 等待基差回归 → 平仓获利
但这里有个关键点:反向套利需要你手上有现货。如果你没有现货库存,那就只能做正向套利。所以,大部分散户和中小机构,做的都是正向套利。
核心公式:
套利利润 = 基差 - 持仓成本 - 交易费用 - 冲击成本
只有当这个利润 > 0 时,才值得进场。
14.2 仓储与交割成本计算
成本计算是期现套利里最容易出问题的地方。我见过太多人,只看基差大就冲进去,结果被各种隐性成本吃掉利润。
咱们一项一项拆开看:
14.2.1 仓储成本
仓储成本包括:仓库租金、装卸费、保管费、保险费。不同品种差异很大。
| 品种 | 仓储费(元/吨·天) | 备注 |
|---|---|---|
| 螺纹钢 | 0.15 - 0.25 | 露天堆放,成本较低 |
| 铜 | 0.5 - 1.0 | 需室内仓库,防潮 |
| 大豆 | 0.3 - 0.6 | 需控温控湿 |
| 原油 | 0.8 - 1.5 | 罐容租赁,按桶计 |
举个例子:如果你做螺纹钢套利,持仓30天,仓储费按0.2元/吨·天算,那就是6元/吨。如果基差只有20元/吨,光仓储费就吃掉30%的利润。
14.2.2 资金成本
资金成本 = 现货占用资金 × 利率 × 持仓天数 / 365
这里要注意:利率要用你的实际融资成本,不是无风险利率。我一般用银行间拆借利率+2%作为基准。
假设螺纹钢现货价格3500元/吨,持仓30天,融资成本5%,那么资金成本 = 3500 × 5% × 30/365 ≈ 14.38元/吨。你看,比仓储费还高。
14.2.3 交割成本
交割成本包括:交割手续费、质检费、运输费、增值税等。这部分比较固定,但容易被忽略。
- 交割手续费:交易所收,一般1-5元/手
- 质检费:按批次收,几百到几千不等
- 运输费:从仓库到交割库的距离决定
- 增值税:如果涉及开票,13%的税率要算进去
避坑指南:我曾经做过一次PTA的套利,基差看着有80元/吨,利润空间挺大。结果交割时发现,我的仓库不在交易所指定交割库范围内,需要转运,运输费加上去,利润直接变亏损。所以,进场前一定要确认仓库资质。
14.3 基差回归模型
基差回归模型,说白了就是预测基差什么时候会回归、回归到什么位置。这是量化套利的核心。
我个人习惯用三种模型:
14.3.1 均值回归模型
这是最基础的模型。假设基差围绕一个长期均值波动,偏离越大,回归概率越高。
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller
# 计算基差
basis = futures_price - spot_price
# 平稳性检验(ADF检验)
result = adfuller(basis)
if result[1] < 0.05:
print("基差序列平稳,适合均值回归模型")
else:
print("基差不平稳,需要差分或协整处理")
# 计算均值回归半衰期
half_life = -np.log(2) / np.polyfit(basis[:-1], np.diff(basis), 1)[0]
print(f"半衰期:{half_life:.2f}天")
半衰期是什么意思?就是基差偏离均值后,回到一半所需的时间。如果半衰期是5天,说明基差偏离后,平均需要5天才能恢复一半。这个参数决定了你的持仓周期。
14.3.2 协整模型
对于跨品种套利,两个品种的价格可能不平稳,但它们之间存在长期均衡关系。这时候用协整模型。
from statsmodels.tsa.vector_ar.vecm import coint_johansen
# 两个品种的价格序列
data = pd.DataFrame({'A': price_a, 'B': price_b})
# Johansen协整检验
result = coint_johansen(data, det_order=0, k_ar_diff=1)
print(f"迹统计量:{result.lr1}")
print(f"5%临界值:{result.cvt}")
# 如果迹统计量大于临界值,说明存在协整关系
# 可以构建价差组合进行套利
嗯,这里要注意:协整关系会随时间变化。我2018年做豆粕和菜粕的套利,协整关系维持了两年多,但2019年底突然失效了。后来发现是饲料配方变了。所以,模型要定期重新拟合。
14.3.3 机器学习回归模型
如果你觉得传统模型不够灵活,可以试试机器学习。我个人喜欢用XGBoost来预测基差走势。
import xgboost as xgb
from sklearn.model_selection import train_test_split
# 构造特征:库存、持仓量、成交量、季节性因子等
features = ['inventory', 'open_interest', 'volume', 'season_factor', 'days_to_expiry']
X = data[features]
y = data['basis']
# 训练测试分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 训练模型
model = xgb.XGBRegressor(n_estimators=100, max_depth=3)
model.fit(X_train, y_train)
# 特征重要性
importance = model.feature_importances_
for feat, imp in zip(features, importance):
print(f"{feat}: {imp:.3f}")
说实话,机器学习模型在基差预测上效果不错,但有个问题——过拟合。我刚开始用的时候,回测曲线漂亮得不行,一上实盘就崩。后来加了正则化和滚动验证,才稳定下来。
14.4 基差交易的季节性规律
季节性规律,说白了就是某些品种的基差在特定时间会表现出规律性。这跟农产品的生长周期、工业品的消费旺季、能源品的取暖需求都有关系。
我整理了几个典型品种的季节性规律:
| 品种 | 季节性规律 | 套利策略 |
|---|---|---|
| 豆粕 | 5-6月基差偏强(美豆种植季) 9-10月基差偏弱(新豆上市) |
5月做多基差,9月做空基差 |
| 螺纹钢 | 3-4月基差偏强(开工旺季) 11-12月基差偏弱(需求淡季) |
3月做多基差,11月做空基差 |
| 原油 | 冬季基差偏强(取暖需求) 夏季基差偏弱(炼厂检修) |
10月做多基差,4月做空基差 |
| 白糖 | 11-12月基差偏强(压榨季) 5-6月基差偏弱(消费淡季) |
11月做多基差,5月做空基差 |
但这里有个坑:季节性规律不是每年都准。2020年疫情打乱了所有季节性节奏,螺纹钢的开工旺季推迟了两个月。如果你死板地按季节性规律做,会亏得很惨。
我的建议:季节性规律只能作为参考,不能作为唯一依据。我一般会把季节性因子作为一个特征,放进机器学习模型里,跟其他因子一起综合判断。这样既利用了季节性信息,又不会过度依赖它。
14.5 知识体系总览
好了,这一章的内容比较多,我画了一张图帮你梳理一下整体逻辑:
这张图把这一章的核心内容串起来了。你看,从期现套利出发,成本计算是基础,回归模型是工具,季节性规律是辅助。三者缺一不可。
最后说一句:基差交易不是稳赚不赔的。我见过太多人,模型回测漂亮,实盘却亏钱。为什么?因为市场在变,你的模型也要跟着变。保持敬畏,持续迭代,这才是长期盈利的关键。