‘index 0 is out of bounds for axis 0 with size 0’错误解析及股票预测模型代码修复方案
解决IndexError: index 0 is out of bounds for axis 0 with size 0错误
错误含义解释
这个错误直白来说就是:你试图访问一个空数组的第0个元素,但这个数组里根本没有任何数据(长度为0),所以索引0自然就超出了数组的有效范围,程序直接报错。
问题根源分析
看你的代码就能定位问题:
你初始化了pred_price = np.array([]),这是一个完全空的数组。然后在循环的day != 1分支里,直接尝试访问pred_price[0][0]等元素,但在第一次循环(day=1)时,你并没有对pred_price做任何赋值操作——也就是说,当循环走到day=2时,pred_price还是空的,这时候访问它的索引0肯定会触发越界错误。
修复方案
核心思路是:在第一次循环(day=1)时,必须先完成第一次预测,给pred_price赋值,这样后续循环才能基于这个结果继续迭代预测。
这里给你修改后的代码示例(补充了关键的预测逻辑,你需要根据自己的模型训练细节调整):
# Get price for next days: # Get the last timestep days closing price new_df = stock_data.filter(['Open', 'High', 'Low', 'Close']) last_timestep_days = new_df[-time_step:].values # 用列表存储每天的预测结果,比空数组更直观不易出错 predicted_days = [] # 复用训练时的scaler(建议训练时保存scaler,预测时直接加载,不要重新fit) scaler = MinMaxScaler(feature_range=(0,1)) scaler.fit(new_df) # 仅第一次fit,后续用transform for day in range(1, 6): # 1. 对当前时间步数据做预处理(和训练逻辑完全一致) scaled_data = scaler.transform(last_timestep_days) X_test = np.array([scaled_data]) # 调整形状适配LSTM输入:(样本数, 时间步长, 特征数),这里特征数是4 X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 4)) # 2. 用训练好的模型做预测 pred_price = model.predict(X_test) # 反归一化得到真实价格范围 pred_price = scaler.inverse_transform(pred_price) predicted_days.append(pred_price[0]) # 保存当天预测结果 # 3. 如果不是第一天,更新时间步数据用于下一次预测 if day != 1: last_day_predicted_data = np.array( [round(pred_price[0][0], 2), round(pred_price[0][1], 2), round(pred_price[0][2], 2), round(pred_price[0][3], 2)]) # 把预测数据加到时间步末尾,再移除最旧的一行 last_timestep_days = np.concatenate((last_timestep_days, [last_day_predicted_data])) last_timestep_days = np.delete(last_timestep_days, 0, axis=0)
额外注意事项
- 确保你的
model已经完成训练,输入形状、预处理逻辑必须和训练阶段完全一致(比如归一化的scaler,最好训练时保存下来,预测时直接加载,不要重新fit,否则会导致数据分布不匹配)。 - 如果你的模型只预测Close价格,需要调整特征处理逻辑,避免维度不匹配。
- 用列表存储预测结果比直接操作空数组更灵活,也更容易排查问题。
内容的提问来源于stack exchange,提问作者Dark040
相关产品推荐
相关产品推荐

