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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:05:05