如何搭建时序股价预测模型并实现滚动增量训练与预测?
实现方案
第一步:数据预处理
首先需要确保数据集按日期正序排列,避免时序数据泄露:
import pandas as pd from sklearn.linear_model import LinearRegression # 转换日期格式并按时间排序 df['Date'] = pd.to_datetime(df['Date']) df = df.sort_values('Date').reset_index(drop=True)
第二步:滚动训练+预测实现
核心逻辑是先拿前3000行训练初始模型,之后按天迭代:预测当日所有股票价格→将当日真实数据加入训练集→更新模型→预测下一日数据:
# 配置参数 initial_train_rows = 3000 all_unique_dates = df['Date'].unique() # 定位初始训练集截止日期,后续所有日期都进入滚动预测流程 last_initial_date = df.loc[initial_train_rows - 1, 'Date'] predict_dates = all_unique_dates[all_unique_dates > last_initial_date] # 初始化模型和初始训练集 model = LinearRegression() X_train = df.loc[:initial_train_rows-1, ['Stock_id', 'last_price']] y_train = df.loc[:initial_train_rows-1, 'price'] model.fit(X_train, y_train) result_collect = [] for cur_date in predict_dates: # 取当日所有股票的待预测数据 cur_data = df[df['Date'] == cur_date].copy() X_cur = cur_data[['Stock_id', 'last_price']] # 生成预测值 cur_data['Predicted'] = model.predict(X_cur) # 存储结果 result_collect.append(cur_data[['Date', 'price', 'Predicted']].rename(columns={'price':'Actual'})) # 将当日真实数据加入训练集,更新模型 X_train = pd.concat([X_train, X_cur], ignore_index=True) y_train = pd.concat([y_train, cur_data['price']], ignore_index=True) model.fit(X_train, y_train) # 输出格式化结果 final_result = pd.concat(result_collect, ignore_index=True) final_result['Date'] = final_result['Date'].dt.strftime('%m-%d-%Y') print(final_result)
优化建议
- 原方案中随机拆分训练测试集的方法不适用时序预测场景,会引入未来数据导致效果评估失真,本次滚动训练的逻辑完全贴合真实线上预测的情况,结果可信度更高。
- 线性回归拟合能力有限,可以尝试替换为XGBoost、LightGBM等树模型,对结构化数据的拟合效果更好,也不需要额外做特征标准化预处理。
- 如果后续数据量持续增大,可以改用支持增量训练的模型(比如sklearn的
SGDRegressor),无需每次全量重训,能大幅节省计算资源。
内容的提问来源于stack exchange,提问作者TroyMcClure8998
相关产品推荐
相关产品推荐

