Заполнение результатов линейной регрессии в кадре данных - PullRequest
1 голос
/ 07 октября 2019

У меня регрессия между двумя акциями:

(y = bank_matrix ['EXO.MI']

и

x = bank_matrix ['LDO. MI ']).

Моя задача - обновлять коэффициент наклона каждые 20 дней (просмотр назад). Короче говоря, я хочу получить список коэффициентов наклона, начиная с 20-го дня (мой обзор). Поэтому я запускаю эту регрессионную модель с именем reg.

. Тем временем я создаю:

A) 3 пустых списка: Intercetta = [], Hedge = [], Residuals = []

B) 1 Фрейм данных, называемый Regressione, в который я хочу скопировать результаты моей регрессии (Intercept, Slope и residuals) внутри столбцов этого фрейма данных (['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)

СЕЙЧАС ЗАКЛЮЧИТЕЛЬНЫЙ ВОПРОС: Почему в моем последнем кадре данных «Регрессия» третий столбец («Остатки») является горизонтальным массивом ???

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Итак, во-первых, я думаю, что эти 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 до конца и берете разницу между этим прогнозом и фактическими данными (учтите, что bank_matrix[['EXO.MI']][lookback:].to_numpy() не изменяется во время цикла for).

Полагаю, здесь было бы больше смысла:

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в последнем ряду. Поскольку это невязки, то есть у вас есть линия с уклоном и хеджирование 1 за данный промежуток времени, но затем у вас есть количество наблюдений в этом диапазоне, дающее каждый другой результат. Таким образом, в зависимости от того, как вы хотите выразить это - вы можете сделать это суммой квадратных остатков или, может быть, взять среднее значение остатка - вы можете сделать его одним числом, только применив к нему дальнейшие преобразования.

Надеюсь, это поможет...

0 голосов
/ 07 октября 2019

Из документа:

Если передан список dict / series и все ключи содержатся в индексе DataFrame, порядок столбцов в результирующем DataFrame не изменится.

Итеративное добавление строк в DataFrame может быть более сложным в вычислительном отношении, чем одна конкатенация. Лучшее решение - добавить эти строки в список, а затем объединить список с исходным кадром данных сразу.

Вам необходимо использовать, например, df.loc, чтобы изменить данные в вашем кадре данных. ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...