2017-02-15 13 views
4

Мне удалось получить линейную регрессионную линию для данных временных рядов, в основном благодаря stackoverflow. Таким образом, у меня есть следующие участки/линию, проведенную через из питона:Python - Вычислить текущее 1 Стандартное отклонение от линейной регрессионной линии

Linear Regression Line

Я получил эту линию регрессии с помощью следующего кода, первоначально импорта данных цена/время серии из CSV файла:

f4 = open('C:\Users\cost9\OneDrive\Documents\PYTHON\TEST-ASSURANCE FILES\LINEAR REGRESSION MULTI TREND IDENTIFICATION\ES_1H.CSV')  
ES_1H = pd.read_csv(f4) 
ES_1H.rename(columns={'Date/Time': 'Date'}, inplace=True) 
ES_1H['Date'] = ES_1H['Date'].reset_index() 
ES_1H.Date.values.astype('M8[D]') 
ES_1H_Last_300_Periods = ES_1H[-300:] 
x = ES_1H_Last_300_Periods['Date'] 
y = ES_1H_Last_300_Periods['Close'] 
x = sm.add_constant(x) 
ES_1H_LR = pd.ols(y = ES_1H_Last_300_Periods['Close'], x = ES_1H_Last_300_Periods['Date']) 
plt.scatter(y = ES_1H_LR.y_fitted.values, x = ES_1H_Last_300_Periods['Date']) 

Я ищу, чтобы иметь возможность отображать/идентифицировать 1 стандартное отклонение от линии регрессии (показано на рисунке выше). Большая часть приведенного выше кода состоит в том, чтобы просто согласовать данные, чтобы успешно смочь построить линию регрессии - изменить данные даты/времени, чтобы она работала в формуле ols, отключила данные до последних 300 периодов и так далее. Но я не уверен, как получить 1 стандартное отклонение от линии, которая выводится через линейную регрессию.

Так в идеале, что я ищу будет выглядеть примерно так:

Linear Regression channel

... с желтыми линиями, являющихся 1 стандартное отклонение от линии регрессии. Кто-нибудь знает, как получить 1 стандартное отклонение от линии линейной регрессии здесь? Для справки, вот статистика для линейной регрессии:

Linear Regression Stats

редактировать: Для справки, вот что я в конечном итоге делает:

plt.scatter(y = ES_1D_LR.y_fitted.values, x = ES_1D_Last_30_Periods['Date']) 
plt.scatter(y = ES_1D_Last_30_Periods.Close, x = ES_1D_Last_30_Periods.Date) 
plt.scatter(y = ES_1D_LR.y_fitted.values - np.std(ES_1D_LR.y_fitted.values), x = ES_1D_Last_30_Periods.Date) 
plt.scatter(y = ES_1D_LR.y_fitted.values + np.std(ES_1D_LR.y_fitted.values), x = ES_1D_Last_30_Periods.Date) 
plt.show() 

ответ

1

IIUC вы можете сделать это следующим образом:

In [185]: x = np.arange(100) 

In [186]: y = x*0.6 

In [187]: plt.scatter(x, y, c='b') 
Out[187]: <matplotlib.collections.PathCollection at 0xc512390> 

In [188]: plt.scatter(x, y - np.std(y), c='y') 
Out[188]: <matplotlib.collections.PathCollection at 0xc683940> 

In [189]: plt.scatter(x, y + np.std(y), c='y') 
Out[189]: <matplotlib.collections.PathCollection at 0xc69a550> 

Результат:

enter image description here

+0

Отлично, спасибо что-то похожее на то, что работает для моих данных. Таким образом, у меня есть «регрессионный канал», построенный аналогично выше, но знаете ли вы, как получить значение для линии регрессии в определенной точке х? Например, в вашем примере я ищу значение линии регрессии при x = 60 (примерно на 35 в вашем графике). –

+0

@ColeStarbuck, что-то вроде этого: 'y [np.where (x == 60) [0] [0]]'? – MaxU

+1

В настоящее время я использую z = ES_1D ['Date'] [- 1:] n = z * 1.8758 + 1865.8121 где z получает, например, последнюю дату, а затем n берет перехват + z *, чтобы получить 2310.38 , который выглядит правильно в соответствии с графиком.Я полагаю, что это работает, просто хотел бы проверить это имеет смысл –

0

Я просто хотел достичь того же. Вот как я это сделал.

import matplotlib.pyplot as plt 
import numpy as np 

Учитывая эти данные:

plt.plot(time, price) 
plt.plot(time, predicted_price) 
plt.show() 

enter image description here

Plot окно вокруг predicted_price линии регрессии:

sq_dis = (price - predicted_price) ** 2 
limit = (sq_dis.mean() + sq_dis.std()) * 0.3 # < - adjust window here 
filter = np.abs(sq_dis) < limit 
plt.plot(time, price) 
plt.plot(time, predicted_price) 
plt.plot(time[filter], price[filter]) 
plt.show() 

enter image description here