【问题标题】:Python How to compute and store Residuals in a FOR-LOOP RegressionPython 如何在 FOR-LOOP 回归中计算和存储残差
【发布时间】:2020-02-07 00:15:45
【问题描述】:

标题概述了我对以下脚本的问题(请先运行它,然后阅读我的最后一个问题):

现在是整个代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pandas_datareader as pdr
from sklearn.linear_model import LinearRegression
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
import datetime    

tickers=['EXO.MI','LDO.MI']
end=datetime.date.today()
gap=datetime.timedelta(days=650)
start=end- gap

Bank=pdr.get_data_yahoo(tickers,start=start,end=end)
bank_matrix=Bank['Adj Close']
bank_matrix=bank_matrix.dropna()

exor=bank_matrix['EXO.MI']
leonardo=bank_matrix['LDO.MI']

Regressione=pd.DataFrame(data=np.zeros((len(exor),3)),columns=['Intercetta','Hedge','Residuals'],index=bank_matrix['EXO.MI'].index)
lookback=20
Hedge=[]
Intercetta=[]
Residuals=[]

for i in range(lookback,len(exor)):
    reg=LinearRegression().fit(bank_matrix[['LDO.MI']][i-lookback+1:i],bank_matrix[['EXO.MI']][i-lookback+1:i])
    # Regressione.iloc[Regressione[i,'Hedge']]=reg.coef_[0]
    Hedge.append(reg.coef_[0])
    Intercetta.append(reg.intercept_)
    y_pred=reg.predict(bank_matrix[['LDO.MI']][lookback:])
    Residuals.append(bank_matrix[['EXO.MI']][lookback:].to_numpy()-y_pred)
Regressione=pd.DataFrame(list(zip(Intercetta,Hedge,Residuals)),columns=['Intercetta','Hedge','Residuals'])
Regressione.set_index(bank_matrix[['EXO.MI']].index[lookback:],inplace=True)

代码有效,但我有 2 个问题:

  1. 'reg._residues' 是来自 Y('EXO.MI' 的实际值)和 y 预测的真实残差吗?我之所以这么问,是因为残差图除了正态分布或平稳之外,其余都是正常分布或静止的
  2. 伙计们,我快疯了:我如何计算“FOR”循环中的日常残差?????

我的意思是,我试图:

  1. 在实际 y 值和 reg.predict 之间做出区别
  2. 进行手动计算:y_predicted= Intercetta + Hedge*bank_matrix[['LDO.MI]]

但是 Python 总是向我报告问题。老实说,我很难理解 Python 是如何工作的......

谢谢

【问题讨论】:

  • sn-p 不起作用。我在import datetime 中进行了编辑,因为这不会以任何方式破坏代码。 y_pred=reg.predict(bank_matrix[['LDO.MI']][lookback:]) Residuals.append(bank_matrix[['EXO.MI']][lookback:].to_numpy()-y_pred) 也引发了我的错误,但 y_pred=reg.predict(bank_matrix[['LDO.MI']][lookback:]) Residuals.append(bank_matrix[['EXO.MI']][lookback:]-y_pred) 工作正常。但我没有将其包含在编辑中,因为由于版本可能不同,它可能对您有用。

标签: python loops for-loop regression


【解决方案1】:

我仍然不是 100% 清楚你想在这里做什么,但我希望这能让你有所收获。

首先,如果您只是在开头添加import datetime,然后将y_pred=reg.predict(bank_matrix[['LDO.MI']][lookback:]) Residuals.append(bank_matrix[['EXO.MI']][lookback:].to_numpy()-y_pred) 替换为y_pred=reg.predict(bank_matrix[['LDO.MI']][lookback:]) Residuals.append(bank_matrix[['EXO.MI']][lookback:]-y_pred),您的代码运行良好。

然后您可以使用以下方法直观地检查每个子期间的残差:

for df in Residuals:
    df.plot.hist()

使用Residuals[-3:] 将绘制您计算的最后三个残差系列:

您还可以轻松地为每个残差系列运行Shapiro-Wilk 正态性测试,并将结果附加到数据框中:

from scipy import stats
shapiro=[]

for df in Residuals[-3:]:
    shapiro.append(stats.shapiro(df[df.columns[0]].values))

df_shapiro = pd.DataFrame(shapiro)

df_shapiro[0] 返回 W 统计量,df_shapiro[1] 返回 p 值。

使用以下方法仔细查看 p 值:

df_pVal=df_shapiro[1].to_frame()
df_pVal['alpha']=0.05
df_pVal.plot()

查看here,了解有关如何使用测试的更多信息。


问题仍然是您在这里的目标是什么。一个详细的解释会很棒。在那之前,我希望我的努力能让你更进一步。

【讨论】:

  • 非常感谢 Vestland。我听从了您的建议,最后添加了这一行: res=[i.mean() for i in Residuals] 这为我提供了与我的长度相同的残差数组回归的时间序列。此时我可以添加: plt.hist(bubu) plt.plot(bubu) 最后得到一些合理的图表。
  • 顺便说一句,我不知道管理员修改我的代码时发生了什么,但这里漏掉了一点:而不是使用'Residuals.append........ ' 我使用了另一个 python 函数,它是:'Residuals.append(reg._residues)'。现在你终于可以理解为什么我做了关于“reg.residues”的两个问题中的第一个。这是我残差中每个子期间的平均值吗?无论如何,谢谢伙计!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 2020-02-28
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多