2017-02-15 7 views
4

Ich habe es geschafft, eine lineare Regressionslinie für Zeitreihendaten zu erhalten, sehr dank stackoverflow vorher. So habe ich die folgenden Plots/Zeile von Python gezogen über:Python - Berechne laufend 1 Standardabweichung von der linearen Regressionslinie

Linear Regression Line

Ich habe diese Regressionslinie mit dem folgenden Code, der ursprünglich Preis/Zeitreihendaten aus einer CSV-Datei importieren:

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']) 

Was ich suche, ist in der Lage zu sein, 1 Standardabweichung von der Regressionslinie zu plotten/identifizieren (im Bild oben gezeigt). Der Großteil des obigen Codes dient lediglich dazu, die Daten so anzupassen, dass die Regressionslinie erfolgreich gezeichnet werden kann. Ändern Sie die Datums-/Zeitdaten so, dass sie in der ols-Formel funktionieren, schneiden Sie die Daten auf die letzten 300 Perioden ab. Aber ich bin mir nicht sicher, wie man eine Standardabweichung von der Linie nehmen kann, die über die lineare Regression gezeichnet wird.

So ideal, was ich suche etwas würde wie folgt aussehen:

Linear Regression channel

... mit den gelben Linien 1 Standardabweichung entfernt Linie von der Regression zu sein. Kann jemand hier 1 Standardabweichung von der linearen Regressionslinie erhalten? Als Referenz sind hier die Statistiken für die lineare Regression:

Linear Regression Stats

edit: Als Referenz hier ist, was ich am Ende tun:

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

Antwort

1

IIUC Sie können es auf diese Weise tun:

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> 

Ergebnis:

enter image description here

+0

Toll, danke sowas funktioniert für meine Daten. Also habe ich den 'Regressions-Kanal' ähnlich wie oben gezeichnet, aber wüssten Sie, wie man einen Wert für die Regressionslinie an einem bestimmten x-Punkt erhält? Zum Beispiel suche ich in meinem Beispiel nach dem Wert der Regressionslinie bei x = 60 (sieht in Ihrem Diagramm ungefähr wie 35 aus). –

+0

@ColeStarbuck, etwa so: 'y [np.where (x == 60) [0] [0]]'? – MaxU

+1

Ich verwende z = ES_1D ['Datum'] [- 1:] n = z * 1.8758 + 1865.8121 wo z mir das letzte Datum zum Beispiel, und dann n nehmen Sie die Intercept + Z * Steigung, um 2310.38 zu bekommen , die nach dem Diagramm richtig aussieht.Ich nehme an, das funktioniert, möchte nur bestätigen, dass es Sinn macht –

0

Ich wollte nur das Gleiche erreichen. Hier ist, wie ich es gemacht habe.

import matplotlib.pyplot as plt 
import numpy as np 

Angesichts dieser Daten:

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

enter image description here

Plot ein Fenster um die predicted_price Regressionslinie:

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

Verwandte Themen