@Channelchan
2018-11-29T15:01:45.000000Z
字数 2213
阅读 65380
用线性回归交易
在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。

其中k是slope,而b是intercept
一般是Y加减两个标准差的值
import pandas as pdimport warningsimport numpy as npfrom datetime import datetimeimport matplotlib.pyplot as pltimport talib as tafrom talib import abstractwarnings.filterwarnings('ignore')data = pd.read_excel('three.xlsx', sheetname='BTCUSDT.binance', index_col='datetime')
slope = abstract.LINEARREG_SLOPE(data, 60, price='close').iloc[-300:]prediction = abstract.LINEARREG(data, 60, price='close').iloc[-300:]band = 2*abstract.STDDEV(data, 60, price='close').iloc[-300:]
plt.figure(figsize=(15,9))plt.subplot(2,1,1)plt.plot(data['close'].iloc[-300:])plt.plot(prediction)plt.plot(prediction+band)plt.plot(prediction-band)plt.subplot(2,1,2)plt.hlines(y=0,xmax=slope.index[-1],xmin=slope.index[0])plt.plot(slope)plt.show()

# 残差residual = ((data['close']-prediction)/data['close']).iloc[-300:]smaR = pd.Series(ta.MA(residual.values, 5),index=residual.index).iloc[-300:]lmaR = pd.Series(ta.MA(residual.values, 25),index=residual.index).iloc[-300:]f,(a1,a2)=plt.subplots(2,1,sharex=True,figsize=(15,9))a1.plot(data['close'].iloc[-300:])a2.plot(smaR)a2.plot(lmaR)a2.plot(residual)plt.show()

# 残差变化率的均线上涨# 参数设置regPeriod = 40residualSmaPeriod = 12; residualLmaPeriod = 30# 指标计算prediction = ta.LINEARREG(am.close, self.regPeriod)residual = (am.close - prediction) / am.closeresidualSma = ta.MA(residual, self.residualSmaPeriod)residualLma = ta.MA(residual, self.residualLmaPeriod)# 现象条件residualUp = residualSma[-1] > residualLma[-1]residualDn = residualSma[-1] < residualLma[-1]# 进出场条件if residualUp and (self.posDict[symbol + "_LONG"]==0):if self.posDict[symbol + "_SHORT"] == 0:self.buy(symbol, bar.close * 1.01, self.lot)elif self.posDict[symbol + "_SHORT"] > 0:self.cover(symbol, bar.close * 1.02, self.posDict[symbol + "_SHORT"])self.buy(symbol, bar.close * 1.01, self.lot)elif residualDnand (self.posDict[symbol + "_SHORT"]==0):if self.posDict[symbol + "_LONG"] == 0:self.short(symbol, bar.close * 0.99, self.lot)elif self.posDict[symbol + "_LONG"] > 0:self.sell(symbol, bar.close * 0.99, self.posDict[symbol + "_LONG"])self.short(symbol, bar.close *0.99, self.lot)
