[关闭]
@Channelchan 2018-11-29T23:01:45.000000Z 字数 2213 阅读 65166

线性回归策略

用线性回归交易

目录

什么是线性回归?

在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。

Slope和intercept是什么?

image.png-0.8kB

其中k是slope,而b是intercept

Confidence Band是怎么算的?

一般是Y加减两个标准差的值

如何用线性回归做策略?

  1. Buy: 价格大于预测值
  2. Buy: 价格大于上方边界
  3. Buy: Slope>0
  4. Buy: 残差变化率的均线上涨
  1. import pandas as pd
  2. import warnings
  3. import numpy as np
  4. from datetime import datetime
  5. import matplotlib.pyplot as plt
  6. import talib as ta
  7. from talib import abstract
  8. warnings.filterwarnings('ignore')
  9. data = pd.read_excel('three.xlsx', sheetname='BTCUSDT.binance', index_col='datetime')
  1. slope = abstract.LINEARREG_SLOPE(data, 60, price='close').iloc[-300:]
  2. prediction = abstract.LINEARREG(data, 60, price='close').iloc[-300:]
  3. band = 2*abstract.STDDEV(data, 60, price='close').iloc[-300:]
  1. plt.figure(figsize=(15,9))
  2. plt.subplot(2,1,1)
  3. plt.plot(data['close'].iloc[-300:])
  4. plt.plot(prediction)
  5. plt.plot(prediction+band)
  6. plt.plot(prediction-band)
  7. plt.subplot(2,1,2)
  8. plt.hlines(y=0,xmax=slope.index[-1],xmin=slope.index[0])
  9. plt.plot(slope)
  10. plt.show()

output_8_0.png-62.3kB

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

output_9_0.png-80.4kB

  1. # 残差变化率的均线上涨
  2. # 参数设置
  3. regPeriod = 40
  4. residualSmaPeriod = 12; residualLmaPeriod = 30
  5. # 指标计算
  6. prediction = ta.LINEARREG(am.close, self.regPeriod)
  7. residual = (am.close - prediction) / am.close
  8. residualSma = ta.MA(residual, self.residualSmaPeriod)
  9. residualLma = ta.MA(residual, self.residualLmaPeriod)
  10. # 现象条件
  11. residualUp = residualSma[-1] > residualLma[-1]
  12. residualDn = residualSma[-1] < residualLma[-1]
  13. # 进出场条件
  14. if residualUp and (self.posDict[symbol + "_LONG"]==0):
  15. if self.posDict[symbol + "_SHORT"] == 0:
  16. self.buy(symbol, bar.close * 1.01, self.lot)
  17. elif self.posDict[symbol + "_SHORT"] > 0:
  18. self.cover(symbol, bar.close * 1.02, self.posDict[symbol + "_SHORT"])
  19. self.buy(symbol, bar.close * 1.01, self.lot)
  20. elif residualDnand (self.posDict[symbol + "_SHORT"]==0):
  21. if self.posDict[symbol + "_LONG"] == 0:
  22. self.short(symbol, bar.close * 0.99, self.lot)
  23. elif self.posDict[symbol + "_LONG"] > 0:
  24. self.sell(symbol, bar.close * 0.99, self.posDict[symbol + "_LONG"])
  25. self.short(symbol, bar.close *0.99, self.lot)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注