# 拟合15阶多项式
poly15 = Pipeline([
('poly', PolynomialFeatures(degree=15)), # 15阶多项式特征
('lr', LinearRegression()) # 线性回归
])
poly15.fit(time_features, close_price) # 拟合模型
pred_poly15 = poly15.predict(time_features) # 预测
# 拟合df=15的自然样条
basis_full = dmatrix('cr(x, df=15)', {'x': time_index}, return_type='dataframe') # 生成全量样条基
spline15_model = sm.OLS(close_price, basis_full).fit() # 拟合样条模型
pred_spline15 = spline15_model.fittedvalues # 获取拟合值
fig, axes = plt.subplots(1, 2, figsize=(12, 4)) # 创建1行2列子图
axes[0].scatter(time_index, close_price, s=1, alpha=0.3, color='gray') # 左图:原始数据
axes[0].plot(time_index, pred_poly15, color='red', linewidth=2) # 15阶多项式拟合线
axes[0].set_title('15阶多项式(边界剧烈振荡)') # 子图标题
axes[0].set_ylim(-50, 100) # 限制纵轴范围避免极端值
axes[1].scatter(time_index, close_price, s=1, alpha=0.3, color='gray') # 右图:原始数据
axes[1].plot(time_index, pred_spline15, color='blue', linewidth=2) # 自然样条拟合线
axes[1].set_title(f'自然样条 df=15(CV MSE ≈ {min(cv_mse_spline):.2f})') # 子图标题
plt.tight_layout() # 自动调整布局
plt.show() # 显示图表