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
相关产品推荐
相关产品推荐

