将线性回归结果填入数据框

2024-06-24 13:10:28 发布

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

我在两个股票之间做回归分析:

(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”中,第三列(“残差”)是一个水平数组???你知道吗


Tags: importindexasregmatrixendbankmi
2条回答

所以,首先,我认为这两条线你做的是完全错误的:

y_pred=reg.predict(bank_matrix[['LDO.MI']][lookback:])
Residuals.append(bank_matrix[['EXO.MI']][lookback:].to_numpy()-y_pred)

你基本上试着对所有的点进行线性回归,从1到20,然后从2到21,从3到22等等。然后你试着将回归拟合到从观察20开始的数据。因此,你得到了5到24的模型,并在此基础上预测了20个观测值直到最后,并得到了预测值和实际值之间的差异(请注意,在你的for循环中bank_matrix[['EXO.MI']][lookback:].to_numpy()不会改变)。你知道吗

我想这里更有意义的是:

y_pred=reg.predict(bank_matrix[['LDO.MI']][i-lookback+1:i])
Residuals.append(bank_matrix[['EXO.MI']][i-lookback+1:i].to_numpy()-y_pred)

所以你要考虑模型的误差,或者:

y_pred=reg.predict(bank_matrix[['LDO.MI']][i:])
Residuals.append(bank_matrix[['EXO.MI']][i:].to_numpy()-y_pred)

因此,您可以尝试将基于当前时间跨度的预测与未来的数据相匹配。你知道吗

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

希望这有帮助。。。你知道吗

从文件中:

If a list of dict/series is passed and the keys are all contained in the DataFrame’s index, the order of the columns in the resulting DataFrame will be unchanged.

Iteratively appending rows to a DataFrame can be more computationally intensive than a single concatenate. A better solution is to append those rows to a list and then concatenate the list with the original DataFrame all at once.

例如,您需要使用df.loc来修改数据帧中的数据。。。你知道吗

相关问题 更多 >