使用statsmodels回归分析:代码输出NaN的原因排查求助
排查Statsmodels回归输出NaN的问题
我帮你梳理下代码里的问题,回归结果出现NaN主要是公式变量引用错误和数据残留缺失值导致的,下面一步步拆解并给出修正方案:
问题1:OLS公式的变量名不匹配
你用smf.ols('ydat ~ xdat', data=rets)来构建模型,但ydat和xdat是你单独定义的Series变量,而smf.ols的公式语法是基于传入的data(也就是rets)中的列名来识别变量的。rets里的列名是EUROSTOXX和VSTOXX,模型找不到ydat/xdat这两个变量,自然会输出NaN。
问题2:收益率计算产生的缺失值未处理
虽然你用fillna(method='ffill')处理了原始数据的缺失值,但计算日收益率时data.shift(1)会生成第一行的NaN,这行无效数据会干扰回归计算的结果。
修正后的完整代码
import numpy as np import statsmodels.api as sm import statsmodels.formula.api as smf import pandas as pd import matplotlib.pyplot as plt import math import datetime as dt # 导入数据 es_url = 'https://www.stoxx.com/document/Indices/Current/HistoricalData/hbrbcpe.txt' vs_url = 'https://www.stoxx.com/document/Indices/Current/HistoricalData/h_vstoxx.txt' cols=['SX5P','SX5E','SXXP','SXXE','SXXF','SXXA','DK5f','DKXF'] es=pd.read_csv(es_url,index_col=0,parse_dates=True,sep=';',dayfirst=True,header=None,skiprows=4,names=cols) vs=pd.read_csv(vs_url,index_col=0,header=2,parse_dates=True,sep=',',dayfirst=True) # 合并数据并处理缺失值 data=pd.DataFrame({'EUROSTOXX' : es['SX5E'][es.index > dt.datetime(1999,1,1)]},dtype=float) data=data.join(pd.DataFrame({'VSTOXX' : vs['V2TX'][vs.index > dt.datetime(1999,1,1)]},dtype=float)) data=data.fillna(method='ffill') # 计算收益率并删除首行缺失值 rets=(((data/data.shift(1))-1)*100).round(2) rets = rets.dropna() # 新增该行,移除收益率计算产生的无效缺失值 # 回归分析:使用DataFrame中的实际列名编写公式 model = smf.ols('VSTOXX ~ EUROSTOXX', data=rets).fit() print(model.summary())
关键修正说明
- 公式变量名修正:将
ydat ~ xdat替换为VSTOXX ~ EUROSTOXX,直接使用rets里的列名,让statsmodels能正确识别回归变量。 - 清理缺失值:新增
rets = rets.dropna(),移除收益率计算时产生的首行NaN,确保回归使用的是完整有效的数据。
运行修正后的代码就能得到正常的回归结果,不会再出现NaN了。
内容的提问来源于stack exchange,提问作者Dan Ghara
相关产品推荐
相关产品推荐

