[关闭]
@Channelchan 2018-01-06T13:49:22.000000Z 字数 4456 阅读 85838

通道策略

用Python量化你的技术分析

目录

通道是什么?

通道突破是技术分析中一个判断趋势的重要方法,其观念在于市场价格穿透了之前的价格压力或支撑,继而形成一股新的趋势,而交易策略的目标即是在突破发生时能够确认并建立仓位以获取趋势的利润。

不同通道是怎么计算的?


1. 均线百分比通道

Channel1.png-3.2kB


2. 布林带通道

Channel2.png-2.7kB


3. 平均波幅通道

Channel3.png-3kB


4. 高低价通道

Channel4.png-3.9kB

通道如何用图表显示?

  1. from jaqs.data import DataView
  2. from jaqs.data import RemoteDataService
  3. import os
  4. import numpy as np
  5. import talib as ta
  6. import pandas as pd
  7. from datetime import datetime
  8. import matplotlib.pyplot as plt
  9. import warnings
  10. warnings.filterwarnings("ignore")
  11. dataview_folder = 'JAQS_Data/hs300'
  12. dv = DataView()
  13. dv.load_dataview(dataview_folder)
Dataview loaded successfully.
  1. def change_index(df):
  2. df.index = pd.Index(map(lambda x: datetime.strptime(str(x),"%Y%m%d") , df.index))
  3. return df
  4. data = change_index(dv.get_ts('close_adj').loc[20170105:])
  1. #均线百分比通道
  2. middleband = ta.abstract.MA(data, timeperiod=20, price='600036.SH')
  3. upperband = middleband*1.03
  4. lowerband = middleband*0.97
  5. data_B = pd.concat([middleband, upperband , lowerband], axis=1)
  6. data_B.columns = ['middleband','upperband','lowerband']
  7. plt.figure(figsize=(15,7))
  8. plt.plot(data['600036.SH'])
  9. plt.plot(data_B['middleband'], 'r', alpha=0.3)
  10. plt.plot(data_B['upperband'], 'g', alpha=0.3)
  11. plt.plot(data_B['lowerband'], 'g', alpha=0.3)
  12. plt.show()

output_7_0.png-48.3kB

  1. #布林带
  2. data_B= ta.abstract.BBANDS(data, timeperiod=20, price='600036.SH')
  3. plt.figure(figsize=(15,7))
  4. plt.plot(data['600036.SH'])
  5. plt.plot(data_B['middleband'], 'r', alpha=0.3)
  6. plt.plot(data_B['upperband'], 'g', alpha=0.3)
  7. plt.plot(data_B['lowerband'], 'g', alpha=0.3)
  8. plt.show()

output_8_0.png-49.8kB

  1. high = change_index(dv.get_ts('high_adj').loc[20170105:])['600036.SH']
  2. low = change_index(dv.get_ts('low_adj').loc[20170105:])['600036.SH']
  1. stock = pd.concat([high,low,data['600036.SH']],axis=1)
  2. stock.columns=['high','low','close']
  1. #平均波幅率通道线
  2. atr = ta.abstract.ATR(stock, 20)
  3. middleband = ta.abstract.MA(data, 20, price='600036.SH')
  4. upperband = middleband + atr
  5. lowerband = middleband - atr
  6. data_B = pd.concat([middleband, upperband, lowerband], axis=1)
  7. data_B.columns = ['middleband', 'upperband', 'lowerband']
  8. plt.figure(figsize=(15,7))
  9. plt.plot(data['600036.SH'])
  10. plt.plot(data_B['middleband'], 'r', alpha=0.3)
  11. plt.plot(data_B['upperband'], 'g', alpha=0.3)
  12. plt.plot(data_B['lowerband'], 'g', alpha=0.3)
  13. plt.show()

output_11_0.png-47.9kB

  1. #高低价通道
  2. upperband = ta.abstract.MAX(stock, 20, price='high')
  3. lowerband = ta.abstract.MIN(stock, 20, price='low')
  4. middleband = (upperband+lowerband)/2
  5. data_B = pd.concat([middleband, upperband, lowerband], axis=1)
  6. data_B.columns = ['middleband', 'upperband', 'lowerband']
  7. plt.figure(figsize=(15,7))
  8. plt.plot(data['600036.SH'])
  9. plt.plot(data_B['middleband'], 'r', alpha=0.3)
  10. plt.plot(data_B['upperband'], 'g', alpha=0.3)
  11. plt.plot(data_B['lowerband'], 'g', alpha=0.3)
  12. plt.show()

output_12_1.png-40.4kB

如何用通道构建策略?

1. Bollinger Band

Buy: 价格突破UpperBand 和 Sigma<0.005

Sell: b%>0.05

2. ATR Band

Buy : 价格突破upperBand

Sell: 价格跌穿lowerband

  1. # Bollinger Band
  2. import rqalpha
  3. from rqalpha.api import *
  4. import talib
  5. def init(context):
  6. context.s1 = "000001.XSHE"
  7. context.PERIOD = 20
  8. def handle_bar(context, bar_dict):
  9. prices = history_bars(context.s1, context.PERIOD+2, '1d', 'close')
  10. upperband, middleband, lowerband = talib.BBANDS(prices, context.PERIOD)
  11. sigma = (upperband[-1]-prices[-1])/(2*prices[-1])
  12. cur_position = context.portfolio.positions[context.s1].quantity
  13. shares = context.portfolio.cash/bar_dict[context.s1].close
  14. if sigma>0.05 and cur_position > 0:
  15. order_target_value(context.s1, 0)
  16. if prices[-2]<=upperband[-2] and prices[-1]>=upperband[-1] and sigma<0.005:
  17. order_shares(context.s1, shares)
  18. config = {
  19. "base": {
  20. "start_date": "2015-06-01",
  21. "end_date": "2017-12-30",
  22. "accounts": {'stock':1000000},
  23. "benchmark": "000001.XSHE"
  24. },
  25. "extra": {
  26. "log_level": "error",
  27. },
  28. "mod": {
  29. "sys_analyser": {
  30. "enabled": True,
  31. "plot": True
  32. }
  33. }
  34. }
  35. rqalpha.run_func(init=init, handle_bar=handle_bar, config=config)

output_14_0.png-71.6kB

  1. #ATR_Channel_1
  2. import rqalpha
  3. from rqalpha.api import *
  4. import talib
  5. def init(context):
  6. context.s1 = "000001.XSHE"
  7. context.PERIOD = 20
  8. def handle_bar(context, bar_dict):
  9. price = history_bars(context.s1, context.PERIOD+1, '1d', 'close')
  10. high = history_bars(context.s1, context.PERIOD+1, '1d', 'high')
  11. low = history_bars(context.s1, context.PERIOD+1, '1d', 'low')
  12. MA = talib.SMA(price, context.PERIOD)
  13. atr = talib.ATR(high,low,price,timeperiod=context.PERIOD)
  14. upperband = MA[-1]+atr[-1]
  15. lowerband = MA[-1]-atr[-1]
  16. # print upperband
  17. cur_position = context.portfolio.positions[context.s1].quantity
  18. shares = context.portfolio.cash/bar_dict[context.s1].close
  19. if price[-1] < lowerband and cur_position > 0:
  20. order_target_value(context.s1, 0)
  21. if price[-1] > upperband:
  22. order_shares(context.s1, shares)
  23. config = {
  24. "base": {
  25. "start_date": "2015-06-01",
  26. "end_date": "2017-12-30",
  27. "accounts": {'stock':1000000},
  28. "benchmark": "000001.XSHE"
  29. },
  30. "extra": {
  31. "log_level": "error",
  32. },
  33. "mod": {
  34. "sys_analyser": {
  35. "enabled": True,
  36. "plot": True
  37. }
  38. }
  39. }
  40. rqalpha.run_func(init=init, handle_bar=handle_bar, config=config)

output_15_0.png-71.4kB

作业:

写一个高低价通道突破策略

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注