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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:21:46