pandas实现滚动窗口回归出现IndexError索引越界如何解决
报错根因
- 循环逻辑错误:你写的双层
for循环会遍历所有y从1到1160、x从52到1160的组合,属于笛卡尔积遍历,根本不是y和x同步+1的滑动窗口逻辑,会生成大量无效切片区间。 iloc用法错误:rolling_window.iloc[y,x]的写法是取第y行、第x列的单个单元格值,不是对行做切片。pandas会把传入的第二个整数参数识别为列索引,你的数据集总共只有十多列,传入x=52作为列索引直接触发越界,也就是你看到的index 52 is out of bounds for axis 0 with size 14报错。- 硬编码循环上限不合理:直接写死循环到1161没有适配实际数据长度,就算修复了iloc写法,数据行数不足时也会触发行索引越界。
修复后代码
import pandas as pd import statsmodels.formula.api as smf df = pd.read_excel("dataset\Special_Proj.xlsx") df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%y') tickers = ['FDX', 'BRK', 'MSFT', 'NVDA', 'INTC', 'AMD', 'JPM', 'T', 'AAPL', 'AMZN', 'GS'] window_size = 52 # 固定滚动窗口长度为52周 def rolling_regression_stats(): total_rows = len(df) # 单层循环实现滑动:窗口结束位置从第52周开始,逐周向后滑动直到数据末尾 for window_end in range(window_size, total_rows): window_start = window_end - window_size # 正确iloc切片:取window_start到window_end行的所有列作为当前窗口数据 window_data = df.iloc[window_start:window_end, :] print(f"===== 当前滚动窗口:第{window_start+1}周 - 第{window_end}周 =====") for t in tickers: model = smf.ols(f'{t} ~ SP50', data=window_data).fit() # 匹配全量回归的输出格式 print(f"{t} Alpha {model.params['Intercept']:.6f}") print(f"{t} Beta {model.params['SP50']:.6f}") print(f"{t} Alpha STD Err {model.bse['Intercept']:.6f}") print(f"{t} Beta STD Err {model.bse['SP50']:.6f}\n") rolling_regression_stats()
关键修改说明
- 移除无效的双层循环,只用单层循环遍历窗口结束位置,窗口起始位置自动计算为
结束位置-窗口长度,天然实现两个边界同步+1的滑动逻辑,不会生成无效窗口。 - 修正
iloc的切片写法,明确指定行范围和列范围,避免参数识别错误导致的索引越界。 - 循环上限通过
len(df)动态获取数据实际行数,兼容不同长度的输入数据集,不会因为硬编码数值触发越界。 - 回归结果直接通过参数名提取截距(Alpha)和SP50系数(Beta),输出格式和全量回归的输出格式完全一致。
内容的提问来源于stack exchange,提问作者Trevor Seibert
相关产品推荐
相关产品推荐

