第七讲:多元线性回归模型——引入多个因子(库存、持仓、期限结构)与多重共线性诊断

各位同学,咱们今天聊点硬核的。上一讲我们只用了单一因子做回归,说白了就是「一招鲜」。但实际做基差交易,你想想看,市场是多个力量共同作用的结果。库存、持仓、期限结构,这些因子之间互相影响,单因子模型往往不够用。

我个人习惯,做基差策略的第一步就是搭建多元回归框架。为什么?因为基差本身就是一个「综合指标」,它反映的是市场参与者的集体预期。你只用库存去解释基差,就像只用温度去解释天气——湿度、风速、气压你都不管,那预测肯定不准。

7.1 为什么需要多元回归?

先讲个我踩过的坑。几年前我做螺纹钢的基差策略,一开始只用了「社会库存」这一个因子。回测结果漂亮得很,年化收益30%+。结果实盘一跑,连续三个月亏损。我复盘才发现,那段时间钢厂在搞环保限产,供给端收缩导致基差走强,但库存数据根本没反映这个变化。

所以,多元回归的核心价值在于:把多个维度的信息融合进一个模型。对于基差交易,我通常关注三类因子:

  • 库存因子:社会库存、厂库库存、港口库存。库存高,现货压力大,基差容易走弱。
  • 持仓因子:主力合约持仓量、前20大会员净多单占比。持仓变化反映资金博弈。
  • 期限结构因子:近远月价差、升贴水率。期限结构本身就是基差的「影子指标」。

嗯,这里要注意:不是因子越多越好。我见过有人把CPI、PMI、甚至天气数据都塞进去,结果模型过拟合得一塌糊涂。选因子的原则就一条——逻辑上说得通,统计上显著

7.2 多元回归的数学形式

咱们直接上公式。假设我们要预测的基差是 \( y \),三个因子分别是 \( x_1 \)(库存)、\( x_2 \)(持仓)、\( x_3 \)(期限结构),那么模型就是:

y = β₀ + β₁·x₁ + β₂·x₂ + β₃·x₃ + ε

其中 \( β₀ \) 是截距项,\( β₁, β₂, β₃ \) 是回归系数,\( ε \) 是残差。每个系数的含义是:在其他因子不变的情况下,该因子每变动一个单位,基差平均变动多少

举个例子。假设我们跑完回归得到:

基差 = 50 - 0.3×库存 + 0.15×持仓 + 0.8×期限结构

这个结果告诉我们:库存每增加1万吨,基差平均下降0.3元/吨;持仓每增加1万手,基差平均上升0.15元/吨;期限结构(近月-远月)每扩大1元,基差平均上升0.8元。

你看,每个因子都有明确的业务解释。这就是多元回归的魅力——可解释性强

7.3 代码实现:用Python跑多元回归

我习惯用statsmodels库,因为它输出统计指标很全。直接上代码:

import pandas as pd
import statsmodels.api as sm

# 假设df包含四列:basis, inventory, open_interest, term_structure
X = df[['inventory', 'open_interest', 'term_structure']]
X = sm.add_constant(X)  # 添加截距项
y = df['basis']

model = sm.OLS(y, X).fit()
print(model.summary())

输出结果里,我最关注三个东西:

  • R-squared:模型整体解释力。一般0.3以上就算不错,0.5以上算很好。
  • P值:每个系数的显著性。我通常取0.05为阈值,不显著的因子会考虑剔除。
  • Durbin-Watson:残差自相关检验。理想值在2附近,偏离太多说明模型有遗漏变量。
我的小技巧:跑完回归后,我会把残差画出来看看。如果残差有明显的趋势或周期性,说明模型没捕捉到某些重要信息。这时候别急着加因子,先想想是不是数据预处理有问题。

7.4 多重共线性:多元回归的「隐形杀手」

好,现在问题来了。你加了三个因子,结果发现库存和持仓的相关系数高达0.85。这意味着什么?这两个因子几乎在说同一件事。模型会变得「不稳定」——你今天跑出来的系数,明天换一段数据就完全不一样了。

这就是多重共线性。说白了,就是自变量之间高度相关,导致模型无法准确估计每个因子的独立贡献。

我曾经在分析豆粕基差时,把「大豆到港量」和「压榨利润」同时放进模型。结果两个系数的P值都大于0.3,但单独跑每个因子又都很显著。后来一查,两者相关系数0.92。嗯,这就是典型的共线性问题。

7.5 如何诊断多重共线性?

最常用的指标是VIF(方差膨胀因子)。VIF的计算逻辑不复杂,但咱们直接看怎么用:

from statsmodels.stats.outliers_influence import variance_inflation_factor

vif_data = pd.DataFrame()
vif_data['feature'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)

判断标准:

  • VIF < 5:共线性轻微,可以接受。
  • 5 ≤ VIF < 10:中等共线性,需要关注。
  • VIF ≥ 10:严重共线性,必须处理。
注意:截距项的VIF通常很高,这不代表有问题。我们只看自变量的VIF。

7.6 处理多重共线性的几种方法

发现共线性后怎么办?我一般按这个顺序尝试:

  1. 删除高度相关的因子:如果两个因子相关系数超过0.8,保留逻辑上更直接的那个。比如库存和持仓高度相关,我会优先保留库存,因为库存对基差的解释更直观。
  2. 主成分分析(PCA):把相关因子合成一个综合指标。缺点是解释性变差,但预测效果往往不错。
  3. 岭回归(Ridge Regression):给回归系数加一个惩罚项,牺牲一点无偏性换取稳定性。我一般在VIF超过15时才会用这个方法。

举个例子。有一次我做PTA基差模型,发现「PTA社会库存」和「聚酯开工率」的VIF都超过12。我最后选择了保留库存,把开工率作为辅助判断指标,不放进回归模型。结果模型稳定性明显提升。

7.7 本章知识体系图

下面这张图总结了多元回归在基差交易中的应用逻辑:

多元线性回归在基差交易中的应用 库存因子 持仓因子 期限结构因子 多元线性回归模型 y = β₀ + β₁x₁ + β₂x₂ + β₃x₃ + ε 多重共线性诊断(VIF < 5 为佳) VIF高 → 删除因子/PCA/岭回归 VIF低 → 模型可用,进入回测

7.8 实战中的几点提醒

最后,分享几个我在实战中总结的经验:

  • 数据频率要匹配:库存数据通常是周度,持仓和基差是日度。我一般会把库存数据向前填充,或者用周度数据做回归,避免频率不一致带来的偏差。
  • 因子要标准化:库存的单位是万吨,持仓是万手,期限结构是元/吨。量纲不同,回归系数没法直接比较。我习惯把所有因子做Z-score标准化,这样系数大小就能反映因子的相对重要性。
  • 滚动窗口训练:市场结构会变,固定参数模型容易失效。我通常用过去60个交易日的数据滚动训练,每天更新一次模型参数。
核心要点:多元回归不是「因子越多越好」,而是「因子越精越好」。多重共线性是常见陷阱,VIF诊断是必做步骤。处理共线性时,优先考虑删除冗余因子,其次才是PCA或岭回归。

好了,这一讲的内容就到这里。多元回归是基差量化交易的基础工具,但用好它需要你对市场有深刻理解。下一讲我们会聊如何用这些模型构建实际的交易信号,到时候再细说。


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