如何从yf.download返回的DataFrame中提取拟合所需的X、Y值
股票价格回归与求导分析实现方案
数据提取转换
yfinance返回的DataFrame索引为datetime格式,需要先转为numpy.polyfit支持的数值型X轴:
import numpy as np # Y轴取收盘价作为价格走势指标 Y = df['Close'].values # X轴转为从统计起始日开始的天数(整数格式) X = (df.index - df.index[0]).days.values
多项式回归拟合
通过np.polyfit实现拟合,阶数建议选1-3阶,阶数过高容易出现过拟合:
# 以2阶多项式拟合为例,返回系数按高次到低次排列 coeffs = np.polyfit(X, Y, deg=2) # 生成可直接调用的多项式拟合函数 poly_func = np.poly1d(coeffs) # 计算拟合后的价格序列用于绘图对比 Y_fit = poly_func(X)
拟合结果可视化
plt.figure(figsize=(12,6)) plt.scatter(df.index, Y, label='原始收盘价', s=8, alpha=0.6) plt.plot(df.index, Y_fit, label='2阶拟合曲线', color='red', linewidth=2) plt.title(f'{stock} 价格走势拟合') plt.xlabel('日期') plt.ylabel('价格(美元)') plt.legend() plt.grid(alpha=0.3) plt.show()
拟合函数求导分析
直接调用np.poly1d内置的求导方法即可,一阶导对应价格涨跌速度,二阶导对应涨跌加速度:
# 计算一阶导、二阶导函数 first_deriv = poly_func.deriv(m=1) second_deriv = poly_func.deriv(m=2) # 生成每日的导数值序列 daily_speed = first_deriv(X) daily_accel = second_deriv(X) # 可视化一阶导(涨跌速度) plt.figure(figsize=(12,4)) plt.plot(df.index, daily_speed, label='价格涨跌速度(一阶导)', color='orange') plt.axhline(y=0, color='gray', linestyle='--') plt.title(f'{stock} 拟合价格一阶导数走势') plt.legend() plt.grid(alpha=0.3) plt.show()
注意事项
- 多项式阶数不建议超过3,阶数过高会导致拟合曲线过度贴合历史波动,失去趋势参考价值
- 一阶导持续大于0说明拟合区间内价格整体处于上升趋势,数值由正转负可作为趋势反转的参考信号
- 本方法仅为历史走势拟合工具,不构成任何投资建议
内容的提问来源于stack exchange,提问作者BenjaminDiLorenzo
相关产品推荐
相关产品推荐

