如何在Python中用Rolling Regression实现股票次日调整收盘价预测
滚动回归预测次日调整收盘价的正确实现
你的代码存在三个核心问题,直接导致结果不符合预期:
- 常数项未加入自变量矩阵:你虽然创建了
const列,但exog参数只传入了Open和Close,模型根本没用到常数项 - 预测目标错位:当前代码是用当日的
Open、Close预测当日的Adj Close,而你需要的是用当日特征预测次日的调整收盘价 - 窗口逻辑未匹配预测需求:窗口大小设为5时,需明确用前5天数据拟合模型,再预测第6天的价格
正确实现步骤
1. 预处理数据:创建滞后的目标变量
我们需要把Adj Close向后平移一期,让每一行的当日特征对应次日的调整收盘价,构建正确的预测关系:
# 生成次日调整收盘价作为预测目标,shift(-1)表示向下平移一行 df_20['next_adj_close'] = df_20['Adj Close'].shift(-1) # 删除最后一行(无次日数据,无法用于预测) df_20 = df_20.dropna(subset=['next_adj_close'])
2. 构建包含常数项的自变量矩阵
将你创建的const列加入自变量集合,确保模型包含截距项:
df_20['const'] = 1 # 自变量包含常数项、Open、Close exog_vars = ['const', 'Open', 'Close']
3. 拟合滚动回归模型
窗口大小设为5,意味着用连续5天的数据拟合模型,再预测第6天的价格:
from statsmodels.regression.rolling import RollingOLS # 目标变量是次日调整收盘价,自变量是包含常数项的特征集合 model = RollingOLS(endog=df_20['next_adj_close'], exog=df_20[exog_vars], window=5) rres = model.fit()
4. 生成预测值与查看参数
拟合完成后,可查看滚动系数或生成对应预测值:
# 查看各窗口的回归系数 print(rres.params) # 生成次日调整收盘价的预测值(前4行为NaN,因为凑不够5个样本的窗口) df_20['predicted_next_adj_close'] = rres.predict()
结果说明
- 前4行的参数和预测值为NaN:因为窗口大小为5,需要至少5个样本才能拟合第一个有效模型
- 每个窗口的系数基于过去5天数据计算,对应的预测值是该窗口下一个交易日的调整收盘价
内容的提问来源于stack exchange,提问作者Jean-Paul Azzopardi
相关产品推荐
相关产品推荐

