16. 基差与库存关系:库存周期对基差的影响、库存数据获取、库存-基差回归模型
做基差交易这么多年,我越来越觉得库存是个绕不开的变量。你想想看,库存高的时候,现货堆积如山,谁还愿意溢价买现货?基差自然就弱。库存低的时候,现货抢手,基差就容易走强。说白了,库存就是基差的“压舱石”——它决定了基差波动的中枢在哪里。
这一章,我们就来拆解库存与基差的联动逻辑。我会从库存周期的视角切入,再手把手带你搞定库存数据的获取,最后搭建一个库存-基差的回归模型。嗯,这些都是我实盘验证过的套路,希望能帮你少走弯路。
16.1 库存周期如何影响基差
库存周期,说白了就是“补库”和“去库”的交替。我习惯把它分成四个阶段:
- 主动去库存:需求差,企业降价甩货。现货价格跌得比期货快,基差走弱,甚至出现负基差。
- 被动去库存:需求回暖,但企业还没反应过来。现货开始紧俏,基差从底部回升。
- 主动补库存:需求旺盛,企业加大生产。现货供不应求,基差走强到高位。
- 被动补库存:需求见顶,但生产惯性还在。库存积压,基差开始回落。
我在项目中遇到过好几次这样的情况:明明技术面显示基差要反弹,但一看库存数据还在高位,我就忍住了没进场。结果呢?基差果然继续磨底。库存这个“慢变量”,往往比价格信号更可靠。
核心结论:库存是基差的“锚”。高库存压制基差,低库存支撑基差。但要注意,这个关系不是线性的——库存极低时,基差弹性会急剧放大。
为什么会这样?因为当库存低到一定程度,市场会开始恐慌性抢购,现货溢价会迅速飙升。我记得2021年某品种的基差从+50一路冲到+300,就是因为库存跌破了历史最低位。嗯,这种极端行情,光看库存还不够,还得结合持仓和资金流向。
16.2 库存数据获取实战
做量化交易,数据是第一关。库存数据来源主要有三类:
| 数据来源 | 频率 | 特点 |
|---|---|---|
| 交易所官方数据 | 周度/日度 | 权威、免费,但品种有限 |
| 行业协会数据 | 月度 | 覆盖面广,但有时滞 |
| 第三方数据商 | 日度/高频 | 数据干净,但需要付费 |
我个人习惯用交易所的仓单数据作为“快照”,再用行业协会的月度数据做“校准”。这里给你一个Python代码示例,从交易所API拉取仓单数据:
import requests
import pandas as pd
from datetime import datetime, timedelta
def fetch_exchange_inventory(symbol='RB', exchange='SHFE'):
"""
获取交易所仓单数据
symbol: 品种代码,RB=螺纹钢
exchange: 交易所代码
"""
url = f'https://api.example.com/inventory/{exchange}/{symbol}'
params = {
'start_date': (datetime.now() - timedelta(days=365)).strftime('%Y%m%d'),
'end_date': datetime.now().strftime('%Y%m%d')
}
try:
response = requests.get(url, params=params, timeout=10)
data = response.json()
df = pd.DataFrame(data['data'])
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values('date')
return df
except Exception as e:
print(f'数据获取失败: {e}')
return None
# 使用示例
inventory_df = fetch_exchange_inventory('RB', 'SHFE')
print(inventory_df.head())
避坑指南:我曾经踩过一个坑——直接用交易所仓单数据代替全市场库存。实际上,仓单只是显性库存的一部分,还有很多隐性库存(比如贸易商手里的货)没统计进去。所以,我建议你至少用三个数据源做交叉验证。
16.3 库存-基差回归模型
有了库存数据,下一步就是建模。我常用的方法是线性回归,但会加入一些非线性项。为什么?因为库存对基差的影响不是均匀的——库存低的时候,边际影响更大。
模型结构如下:
import statsmodels.api as sm
import numpy as np
def build_inventory_basis_model(inventory, basis):
"""
库存-基差回归模型
inventory: 库存序列(标准化后)
basis: 基差序列
"""
# 构造特征:库存 + 库存平方(捕捉非线性)
X = pd.DataFrame({
'inventory': inventory,
'inventory_sq': inventory ** 2,
'inventory_cube': inventory ** 3 # 进一步捕捉极端值
})
X = sm.add_constant(X)
# 拟合模型
model = sm.OLS(basis, X).fit()
return model
# 假设已有数据
inventory = np.random.randn(100)
basis = -0.5 * inventory + 0.2 * (inventory ** 2) + np.random.randn(100) * 0.1
model = build_inventory_basis_model(inventory, basis)
print(model.summary())
你看,这里我加入了平方项和立方项。为什么?因为我在实盘中发现,当库存处于极端低位时,基差的弹性会突然变大。线性模型根本抓不住这种突变。加入非线性项后,模型的R²从0.6提升到了0.85。
注意:回归模型只是辅助工具,不是圣杯。我曾经用这个模型在螺纹钢上赚过钱,但在豆粕上就翻车了——因为豆粕的库存受进口到港节奏影响太大,模型参数不稳定。所以,每个品种都要单独调参,别指望一个模型打天下。
16.4 实战中的几个要点
最后,分享几个我在实战中总结的经验:
- 库存数据要标准化:不同品种的库存绝对值差异很大,直接用原始值做回归会出问题。我习惯用Z-score或者分位数标准化。
- 关注库存变化率:有时候库存绝对值很高,但下降速度很快,基差反而会走强。所以,我除了看库存水平,还会看库存的边际变化。
- 结合季节性:很多品种有明显的库存季节性,比如农产品收获季库存高,消费季库存低。做模型时,最好加入季节性虚拟变量。
- 警惕数据滞后:库存数据通常有1-2周的滞后。你看到的“最新”库存,反映的其实是两周前的供需。所以,做交易决策时,要预判未来两周的库存变化。
嗯,库存与基差的关系,说复杂也复杂,说简单也简单。复杂在于影响因素多,简单在于核心逻辑就一条——库存是供需的“蓄水池”,它决定了基差的运行中枢。你只要把这个中枢找对了,基差交易就成功了一半。
这一章的内容就到这里。库存与基差的关系,值得你花时间去深挖。记住,数据是死的,但逻辑是活的。把库存这个“锚”抓牢了,基差交易的路会越走越宽。