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

yfinance股价数据使用polyfit多项式拟合异常问题及优化方案咨询

问题根因

你代码的拟合异常主要来自2个核心错误:

  • 直接将datetime转int得到的是19位纳秒级时间戳,数值量级过大,7次多项式拟合时会出现严重的数值稳定性问题,系数计算完全失真
  • 生成拟合预测用的x序列时,np.linspace(200, 15.0, 200)是从大到小生成,且数值范围和实际的时间戳范围完全不匹配,绘制出来的曲线自然不对

现有方案修复代码

你提到的将日期映射为从0/1开始的连续整数的思路完全可行,修复后的代码如下:

import yfinance as yf
import matplotlib.pyplot as plt
import numpy as np

stock = 'TSLA'
start = '2020-11-01'

df = yf.download(stock , start=start)

y_data = df['Close']
# 日期映射为从0开始的连续整数,代表距离起始日期的交易日数量
xx = np.arange(len(df))
yy = np.asarray(y_data)

# 7次多项式拟合
p7 = np.polyfit(xx, yy, 7)
# 预测用的x序列和输入的xx范围对齐
y_p7 = np.polyval(p7, xx)

# 绘图
plt.plot(df.index, yy, 'o', markersize=2, label='实际收盘价')
plt.plot(df.index, y_p7, 'r:', linewidth=2, label='7次多项式拟合')
plt.ylim(0.,1200)
plt.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 求导示例:一阶导数代表股价每日涨跌的拟合斜率
p7_deriv = np.polyder(p7)
slope = np.polyval(p7_deriv, xx)

更适配需求的可选方案

如果你的核心需求是做走势拟合+求导分析,还有两个更适合股价时序数据的方案:

  • 样条拟合:使用scipy.interpolate.UnivariateSpline,可以手动控制平滑度,不会像高次多项式一样出现两端震荡的过拟合问题,同样支持求导操作
  • 低次多项式+滑动窗口拟合:股价长期走势非线性极强,全局高次多项式拟合很容易过拟合历史数据,对未来的预测参考价值极低,用3-5次多项式在滑动时间窗口内做局部拟合,得到的涨跌斜率参考性会更高

内容的提问来源于stack exchange,提问作者BenjaminDiLorenzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:48:03