Python 将线性回归结果填充到数据框中

Python 将线性回归结果填充到数据框中,python,pandas,Python,Pandas,我正在两支股票之间进行回归: (y=银行矩阵['EXO.MI'] 及 x=银行矩阵['LDO.MI']) 我的任务是每20天更新一次坡度系数(回顾)。简言之,我希望从第20天开始(我的回顾)有一个斜率系数列表。所以我运行了一个叫做reg的回归模型 同时,我创建: A) 3个空列表:区间=[]、对冲=[]、残差=[] B) 1个名为Regressione的数据框,其中我希望在此数据框列(['Intercept','Hedge','residuals')内复制回归结果(截距,斜率和残差) 现在,整个

我正在两支股票之间进行回归:

(y=银行矩阵['EXO.MI']

x=银行矩阵['LDO.MI'])

我的任务是每20天更新一次坡度系数(回顾)。简言之,我希望从第20天开始(我的回顾)有一个斜率系数列表。所以我运行了一个叫做reg的回归模型

同时,我创建:

A) 3个空列表:区间=[]、对冲=[]、残差=[]

B) 1个名为Regressione的数据框,其中我希望在此数据框列(['Intercept','Hedge','residuals')内复制回归结果(截距,斜率和残差)

现在,整个代码:

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()


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)
现在,最后一个问题是:为什么在我的最后一个数据帧“Regressione”中,第三列(“残差”)是一个水平数组??

来自文档:

如果传递了dict/series列表,并且键都包含在数据帧的索引中,则生成的数据帧中的列顺序将保持不变

迭代地将行追加到数据帧可能比单个串联更需要计算。更好的解决方案是将这些行附加到列表中,然后一次将列表与原始数据帧连接起来


例如,您需要使用
df.loc
来修改数据帧中的数据…

因此,首先,我认为这两行代码是完全错误的:

y_pred=reg.predict(银行矩阵['LDO.MI']]][lookback:]
附加(bank_matrix['EXO.MI']][lookback:].to_numpy()-y_pred)
基本上,你试着对从1到20,然后从2到21,从3到22等等的所有点进行线性回归。然后你试着将回归拟合到从观察20开始的数据。因此,你得到例如5到24的模型,并在此基础上预测观测值20,直到最后,并计算预测值和实际值之间的差异(请注意,
bank_矩阵[['EXO.MI']]][lookback:][.to_numpy()
for
循环期间不会改变)

我想这里更有意义的是:

y_pred=reg.predict(银行矩阵['LDO.MI']][i-lookback+1:i])
附加(bank_matrix[['EXO.MI']][i-lookback+1:i].to_numpy()-y_pred)
因此,您可以考虑模型的错误,或者:

y_pred=reg.predict(银行矩阵['LDO.MI']][i:]
残差。追加(bank_matrix[['EXO.MI']][i:][.to_numpy()-y_pred)
因此,您可以尝试将基于当前时间跨度的预测与未来的数据相匹配

现在,第一个选项将生成每行19个元素的列表,而另一个选项将生成430个元素的列表,每行减少1个元素,直到最后一行中有1个元素。因为这些都是残差-所以你有一条线,有一个斜率,每给定的时间跨度有一个树篱,但是你有在这个范围内的观察数量,产生每个不同的结果。所以,根据你想表达它的方式,你可以用平方残差求和,或者取平均残差,你只需要对它进行进一步的变换,就可以得到一个数字


希望这有助于…

因为这样插入它。更好的问题是——你们想要什么?例如,您想要的输出是什么?我的输出是我已经说过的:一个数据帧(回归),有3列(中间值、对冲、残差)。每行必须包含3个元素,1个为列。但我真的不明白,为什么在“残差”后面加上“y_pred”,它会变成一个水平序列。我错在哪里?好吧,不执行你的代码,你在每一行残差后面加的是:
bank_matrix[['EXO.MI']]][lookback:.to_numpy()-y_pred
它看起来确实像一个水平列表……好吧,但是如何让我的第三列(残差)看起来和其他两列(中间列,残差)一样????我需要残差的列向量来构建我的信号,所以我必须处理并绘制它们。好的,仔细看看,什么是
exor
-我得到
exor没有定义执行期间的错误HI Gregorz谢谢你的帮助,很抱歉我的延迟。你是对的,我混淆了回归期的时间框架,但更糟糕的是,我不明白,即使每20天只计算1个对冲和中间交易,残差仍然是20!所以,我想我应该对我的每一行残差做一个平均值。我写道:res=[I.mean()代表残差中的I]。当时我刚刚写了:plt.hist(res)和plt.plot(res)来确认我的残差的准正态分布。顺便说一下:在我的for循环回归中,我用“residuals.append”(reg.residuals)替换了“residuals.append…”。“登记残留量”是否与每20天子周期的残留量平均值相同???