You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python同图绘制多模型股价预测曲线时序错位问题解决

问题根因
  • 所有模型的预测日期生成逻辑错误:处理每个模型时,都动态取当前DataFrame的最后一行日期作为预测起点。处理完第一个模型后,DataFrame已经追加了该模型的预测时间段,处理第二个模型时起点自动变成第一个预测段的末尾,后续模型依次顺延,直接导致各预测段首尾衔接。
  • 数据结构初始化逻辑错误:没有提前生成统一的预测日期索引、初始化所有模型列,而是在每个模型的处理逻辑中单独追加新行,追加行时仅给当前模型列赋值、其余列填NaN,进一步放大了时间轴错位问题。
  • 绘图逻辑不一致:第一个模型的曲线调用.tail(500)截取片段,其余模型直接取全量数据,截取范围不统一也会导致展示错位。
修复方案
  • 固定预测基准起点:在遍历所有模型之前,先取未追加任何预测值的原始历史数据最后一天作为所有模型共用的预测起始点,禁止在模型循环内动态取DataFrame末尾日期。
  • 提前初始化数据结构:一次性生成覆盖所有预测步长的统一日期序列,提前创建所有模型列、追加所有预测日期行,默认值填NaN。
  • 统一赋值与绘图逻辑:每个模型计算完预测结果后,直接往预生成的日期行、对应模型列填值,不再单独追加行;绘图时所有模型列取相同的时间范围,保证时间轴对齐。
修复后代码
import datetime
import numpy as np
# (前面的模型训练、dfreg初始化、数据预处理逻辑保持原有逻辑不变)

# ---------- 提前初始化统一预测时间轴和列结构 ----------
# 取原始历史数据的最后一个日期作为所有模型的共同预测起点
base_last_date = dfreg.iloc[-1].name
# 生成和预测步长一致的统一日期序列
forecast_dates = [base_last_date + datetime.timedelta(days=i+1) for i in range(forecast_out)]
# 初始化所有模型列
model_cols = ["LinearRegression", "Quadratic2", "Quadratic3", "LassoCV"]
for col in model_cols:
    if col not in dfreg.columns:
        dfreg[col] = np.nan
# 提前把所有预测日期加入DataFrame索引
for d in forecast_dates:
    if d not in dfreg.index:
        dfreg.loc[d] = [np.nan] * len(dfreg.columns)

# 遍历模型填充预测值
for model in modelNames:
    if model == "LinearRegression":
        forecast = clfreg.predict(X_lately)
        # 直接往预定义的日期位置填值,不再追加新行
        for d, pred_val in zip(forecast_dates, forecast):
            dfreg.loc[d, "LinearRegression"] = pred_val
    if model == "Quadratic2":
        forecast = clfpoly2.predict(X_lately)
        for d, pred_val in zip(forecast_dates, forecast):
            dfreg.loc[d, "Quadratic2"] = pred_val
    if model == "Quadratic3":
        forecast = clfpoly3.predict(X_lately)
        for d, pred_val in zip(forecast_dates, forecast):
            dfreg.loc[d, "Quadratic3"] = pred_val
    if model == "LassoCV":
        forecast = clfLasso.predict(X_lately)
        for d, pred_val in zip(forecast_dates, forecast):
            dfreg.loc[d, "LassoCV"] = pred_val

# 绘图:统一取相同长度的片段展示,保证时间轴对齐
show_range = 500
plt.plot(dfreg['LinearRegression'].tail(show_range), label='LinearRegression')
plt.plot(dfreg['Quadratic2'].tail(show_range), label='Quadratic2')
plt.plot(dfreg['Quadratic3'].tail(show_range), label='Quadratic3')
plt.plot(dfreg['LassoCV'].tail(show_range), label='LassoCV')

plt.legend(loc=4)
plt.title("Price prediction (Best: "+str(modelNames[bsIndex[0]])+")")
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()
原错位效果参考

模型预测曲线首尾衔接错位效果

内容的提问来源于stack exchange,提问作者IT-03 Карпов Влад

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:36:17