第十四章:基差交易进阶

各位同学,欢迎来到基差交易的进阶篇。说实话,前面几章我们把基差的基本概念、套利逻辑都讲透了。但真正到了实战层面,你会发现——纸上谈兵容易,真金白银进场就是另一回事了。

这一章,我打算把几个硬骨头啃下来:期现套利的实操细节、仓储和交割成本怎么算、基差回归模型怎么搭,还有季节性规律怎么用。嗯,这些都是我这些年踩坑踩出来的经验,希望能帮你少走弯路。

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 知识体系总览

好了,这一章的内容比较多,我画了一张图帮你梳理一下整体逻辑:

基差交易进阶知识体系 基差交易进阶 期现套利 正向套利 反向套利 成本计算 仓储成本 资金成本 交割成本 回归模型 均值回归 协整模型 机器学习 季节性规律 农产品季节性 工业品季节性 核心:成本控制 + 模型驱动 + 季节性参考

这张图把这一章的核心内容串起来了。你看,从期现套利出发,成本计算是基础,回归模型是工具,季节性规律是辅助。三者缺一不可。

最后说一句:基差交易不是稳赚不赔的。我见过太多人,模型回测漂亮,实盘却亏钱。为什么?因为市场在变,你的模型也要跟着变。保持敬畏,持续迭代,这才是长期盈利的关键。


公众号:蓝海资料掘金营,微信deep3321