Python - 从线性回归线计算正在进行的1个标准偏差

时间:2017-02-15 19:23:04

标签: python pandas datetime dataframe linear-regression

我已经设法获得时间序列数据的线性回归线,这要归功于stackoverflow优先。所以我有以下从python中绘制的图/行:

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我只想达到同样的目的。这是我如何做到的。

import matplotlib.pyplot as plt
import numpy as np

鉴于此数据:

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

enter image description here

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

答案 2 :(得分:0)

我发现此方法更接近计划绘制回归图的方式,所以也许您也会发现它有趣:

使用函数“ plt.fill_between ”将均值和(均值+标准差)之间的区域变为灰色,如下所示: https://jakevdp.github.io/PythonDataScienceHandbook/04.03-errorbars.html