Python如何在FORLOOP回归中计算和存储残差

2024-10-01 17:27:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在整个代码:

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)

代码正常,但我有两个问题:

  1. 是不是“reg.\u residuals”是Y的真实残差(的真实值)EXO.MI公司’)y预测到了吗?我问这个问题是因为残差的曲线几乎是正态分布或平稳分布
  2. 伙计们,我快疯了:我怎么能在一个“FOR”循环中计算每天的残差?????你知道吗

我是说,我试着:

  1. 在实际y值和注册预测你知道吗
  2. 手工计算:y\u predicted=Intercetta+Hedge*bank\u matrix[['LDO.MI公司]]你知道吗

但是Python总是向我报告问题。我真的很难理解Python是如何工作的。。。。你知道吗

谢谢


Tags: importindexasregmatrixendbankmi
1条回答
网友
1楼 · 发布于 2024-10-01 17:27:27

我仍然不完全清楚你想在这里做什么,但我希望这能让你有所收获。你知道吗

首先,如果只在开头添加import datetime,并用y_pred=reg.predict(bank_matrix[['LDO.MI']][lookback:]) Residuals.append(bank_matrix[['EXO.MI']][lookback:]-y_pred)替换y_pred=reg.predict(bank_matrix[['LDO.MI']][lookback:]) Residuals.append(bank_matrix[['EXO.MI']][lookback:].to_numpy()-y_pred),那么代码运行良好。你知道吗

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

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

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

enter image description here

您还可以轻松地对每个残差序列运行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()

enter image description here

有关如何使用测试的更多信息,请参阅here。你知道吗


问题仍然是你的目标是什么。详细的解释就好了。在那之前,我希望我的努力能让你更进一步。你知道吗

相关问题 更多 >

    热门问题