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

Python中Rolling Regression运行报错:AttributeError: 'NoneType' object has no attribute 'f_locals'求助

解决RollingOLS运行时的AttributeError: 'NoneType' object has no attribute 'f_locals'问题

你遇到的这个错误在statsmodels的RollingOLS使用中比较常见,核心原因要么是statsmodels版本存在bug,要么是数据缺失导致拟合窗口返回空结果,下面给你一步步的解决方案:

1. 优先检查并调整statsmodels版本

这个f_locals相关的错误是statsmodels部分过渡版本(比如0.12.x到0.13.x区间)的已知问题,建议先升级到最新稳定版:

pip install --upgrade statsmodels

如果升级后问题依然存在,可以尝试降级到经过验证的稳定版本(比如0.12.2):

pip install statsmodels==0.12.2

2. 清理数据中的缺失值

你的代码中使用了shift(1),这会生成大量缺失值,而RollingOLS在窗口内没有有效数据时会返回None,进而导致后续访问params、bse等属性报错。修改数据处理逻辑:

# 先截取时间范围并清理初始缺失值
pred = pred[beg_date:end_date].dropna(subset=var_list_all)
# 生成滞后变量
pred[var_list_all] = pred[var_list_all].shift(1)
# 清理滞后产生的新缺失值
pred = pred.dropna(subset=var_list_all)
# 标准化(先拟合再转换,避免潜在的数据泄露)
scaler = preprocessing.StandardScaler()
pred[var_list_all] = scaler.fit_transform(pred[var_list_all])

3. 替换from_formula为直接矩阵输入(可选但更稳定)

有时候公式解析会带来隐式问题,改用直接传入变量矩阵的方式初始化RollingOLS,兼容性更好:

import statsmodels.api as sm

# 初始化存储字典
d = {'coeff': [], 't-stat': [], 'r2': []}
y_var = 'EP'
y = pred[y_var]

for x_var in var_list_all:
    # 添加常数项,对应公式中的截距
    X = sm.add_constant(pred[x_var])
    # 初始化滚动回归模型
    rolling_model = RollingOLS(y, X, window=60)
    rolling_results = rolling_model.fit()
    
    # 提取对应变量的系数、t统计量和R²
    coeff_series = rolling_results.params.iloc[:, 1]  # 索引1对应x_var的系数(索引0是截距)
    d['coeff'].append(coeff_series)
    d['t-stat'].append(coeff_series / rolling_results.bse.iloc[:, 1])
    d['r2'].append(rolling_results.rsquared * 100)

4. 添加异常捕获(避免程序崩溃)

如果部分变量的拟合窗口始终存在问题,可以添加异常捕获,确保程序能继续运行:

for x_var in var_list_all:
    try:
        formula = y_var + ' ~ ' + x_var
        rolling_model = RollingOLS.from_formula(formula, window=60, data=pred)
        rolling_results = rolling_model.fit()
        
        d['coeff'].append(rolling_results.params[x_var])
        d['t-stat'].append(rolling_results.params[x_var] / rolling_results.bse[x_var])
        d['r2'].append(rolling_results.rsquared * 100)
        print(f"✅ 成功处理变量: {x_var}")
    except Exception as e:
        print(f"❌ 处理变量 {x_var} 时出错: {str(e)}")
        # 填充空Series避免后续绘图报错
        d['coeff'].append(pd.Series(dtype='float64'))
        d['t-stat'].append(pd.Series(dtype='float64'))
        d['r2'].append(pd.Series(dtype='float64'))

按照上面的步骤逐一排查,应该能解决你遇到的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:12:43