@Channelchan
2018-11-29T14:31:52.000000Z
字数 2243
阅读 64991
用Python量化你的技术分析
均线理论是当今应用最普遍的技术指标之一,它帮助交易者确认现有趋势、判断将出现的趋势、发现过度延生即将反转的趋势。另外均线与趋势是西蒙斯被TED采访时提到的关键词,因此做量化你必须懂,而且是深入地懂这两个词的真正意义。






import pandas as pdimport warningsimport numpy as npfrom datetime import datetimeimport matplotlib.pyplot as pltwarnings.filterwarnings('ignore')data = pd.read_excel('three.xlsx', sheetname='BTCUSDT.binance', index_col='datetime').iloc[-300:]
from talib import abstract#直接读取DataFrame,默认读取cloumns名为close的数据。data['close'] = data.closedata['SMA'] = abstract.MA(data, 20)data['WMA'] = abstract.WMA(data, 20)data['TRIMA'] = abstract.TRIMA(data, 20)data['EMA'] = abstract.EMA(data, 20)data['DEMA'] = abstract.DEMA(data, 20)data['KAMA'] = abstract.KAMA(data, 20)
fig = plt.figure(figsize=(15, 7))plt.plot(data['close'])plt.plot(data['SMA'], alpha=0.5)plt.plot(data['WMA'], alpha=0.5)plt.plot(data['TRIMA'], alpha=0.5)plt.plot(data['EMA'], alpha=0.5)plt.plot(data['DEMA'], alpha=0.5)plt.plot(data['KAMA'], alpha=0.5)plt.legend(loc='lower right')plt.show()

两条均线的三种交易方法
1. 当均线金叉(短期大于长期均线)时候买进,死叉(短期小于长期)时卖出。
2. 当价格上穿两条均线时买入,但价格下穿其中一条均线时卖出。
3. 当两条均线都处于向上方向时买入,当两条均线都处于下跌方向时卖出。
# 策略参数fastWindow = 20 # 快速均线参数slowWindow = 55 # 慢速均线参数# 指标计算fastMa = ta.SMA(am60.close, self.fastWindow)slowMa = ta.SMA(am60.close, self.slowWindow)# 现象条件crossOver = (fastMa[-1] > slowMa[-1]) and (fastMa[-2] <= slowMa[-2])crossBelow = (fastMa[-1] < slowMa[-1]) and (fastMa[-2] >= slowMa[-2])# 需要避免同时持有多空头寸# 金叉, 多头无头寸,准备买入进场if (crossOver) and (self.posDict[symbol + "_LONG"] == 0):# 检查空头头寸,为0直接买入进场if self.posDict[symbol + "_SHORT"] == 0:self.buy(symbol, bar.close*1.02, self.lots)# 空头有持仓,先买平再买入进出elif self.posDict[symbol + "_SHORT"] > 0:self.cover(symbol, bar.close*1.02, self.posDict[symbol + "_SHORT"])self.buy(symbol, bar.close*1.02, self.lots)# 死叉, 空头无头寸,准备卖空进场elif (crossBelow) and (self.posDict[symbol + "_SHORT"] == 0):# 检查多头头寸,为0直接卖出进场if self.posDict[symbol + "_LONG"] == 0:self.short(symbol, bar.close*0.98, self.lots)# 多头有持仓,先卖平,再卖出进场elif self.posDict[symbol + "_LONG"] > 0:self.sell(symbol, bar.close*0.98, self.posDict[symbol + "_LONG"])self.short(symbol, bar.close*0.98, self.lots)
更换标的与均线类型回测策略。
