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

实现线性回归模型时遇ValueError:股价数据维度不匹配

线性回归模型实现时的ValueError问题

报错信息

Shape of passed values is (13, 1), indices imply (22, 1)

问题背景

刚接触Python统计分析和机器学习基础,在实现基于SPY收盘价的线性回归模型时遇到上述报错,调整数据范围后仍未解决。

相关代码

# sklearn for importing regression model
from sklearn.linear_model import LinearRegression

# pandas and numpy are used for data manipulation 
import pandas as pd 
import numpy as np 

# matplotlib and seaborn are used for plotting graphs 
import matplotlib.pyplot as plt 
import seaborn 

# yfinance is used to fetch data 
import yfinance as yf

# get S&P500 ticker
stock_data = yf.download('SPY','2021-06-23','2022-11-23')

# Only keep close columns 
stock_data = stock_data[['Close']] 

# Drop rows with missing values 
stock_data = stock_data.dropna() 

# Plot the closing price 
stock_data.Close.plot(figsize=(10,5)) 
plt.ylabel("SPY Prices")
plt.show()

# 3-day and 9-day moving average
stock_data['S_3'] = stock_data['Close'].shift(1).rolling(window=3).mean() 
stock_data['S_9']= stock_data['Close'].shift(1).rolling(window=9).mean() 
stock_data= stock_data.dropna() 

# Explanatory Variables
X = stock_data[['S_3','S_9']] 
X.head()

# Dependent Variable
y = stock_data['Close']
y.head()

t=.8 
t = int(t*len(stock_data)) 

# Train dataset 
X_train = X[:t] 
y_train = y[:t]  

# Test dataset 
X_test = X[t:] 
y_test = y[t:]

linear = LinearRegression().fit(X_train,y_train)

predicted_price = linear.predict(X_test)  
predicted_price = pd.DataFrame(predicted_price, index=y_test.index, columns = ['price'])  
predicted_price.plot(figsize=(10,5))  
y_test.plot()  

plt.legend(['predicted_price','actual_price'])  
plt.ylabel("SPY Price")  
plt.show()

问题分析与解决

核心原因

报错本质是预测结果数组长度与指定的索引长度不匹配。用y_test.index作为predicted_price的索引时,linear.predict(X_test)返回的结果行数和y_test的行数不一致。

导致该问题的常见诱因:

  • 股票数据存在节假日休市情况,日期索引不连续,基于索引切片时容易出现隐形的长度偏差
  • 移动平均、缺失值删除操作后,索引连续性被破坏,直接用X[t:]和y[t:]划分数据集,可能因索引错位导致两者长度不一致

解决步骤

1. 改用位置索引划分数据集

避免日期索引干扰,用iloc按位置切片,确保训练集、测试集的特征和目标变量长度完全匹配:

# 替换原数据集划分代码
t = int(0.8 * len(stock_data))
X_train = X.iloc[:t]
y_train = y.iloc[:t]
X_test = X.iloc[t:]
y_test = y.iloc[t:]

2. 验证数据长度一致性

在预测前先确认X_test和y_test的长度,排查是否存在偏差:

print(len(X_test), len(y_test))

若输出的两个数值相等,再执行预测和后续操作。

3. 可选:重置连续索引

如果索引混乱问题频繁出现,可以重置数据集的索引为连续整数,彻底避免索引错位:

# 在删除缺失值后添加该行代码
stock_data = stock_data.reset_index(drop=True)

修正后完整代码

from sklearn.linear_model import LinearRegression
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn 
import yfinance as yf

# 获取并清理基础数据
stock_data = yf.download('SPY','2021-06-23','2022-11-23')
stock_data = stock_data[['Close']].dropna()

# 绘制收盘价走势
stock_data.Close.plot(figsize=(10,5)) 
plt.ylabel("SPY Prices")
plt.show()

# 计算移动平均并清理缺失值
stock_data['S_3'] = stock_data['Close'].shift(1).rolling(window=3).mean() 
stock_data['S_9']= stock_data['Close'].shift(1).rolling(window=9).mean() 
stock_data= stock_data.dropna()

# 重置索引(可选)
stock_data = stock_data.reset_index(drop=True)

# 划分特征与目标变量
X = stock_data[['S_3','S_9']] 
y = stock_data['Close']

# 按位置划分训练集、测试集
t = int(0.8 * len(stock_data))
X_train = X.iloc[:t]
y_train = y.iloc[:t]
X_test = X.iloc[t:]
y_test = y.iloc[t:]

# 训练模型并生成预测结果
linear = LinearRegression().fit(X_train,y_train)
predicted_price = linear.predict(X_test)  

# 格式化预测结果并绘图对比
predicted_price = pd.DataFrame(predicted_price, index=y_test.index, columns=['price'])  
predicted_price.plot(figsize=(10,5))  
y_test.plot()  
plt.legend(['predicted_price','actual_price'])  
plt.ylabel("SPY Price")  
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:25:42