[关闭]
@Channelchan 2017-03-06T19:02:38.000000Z 字数 2677 阅读 26492

TA_Lib 成交量篇

成交量 OBV A/D 量价策略


成交量有三种可能,分别是量增、量减、量平。
价格也有三种可能,分别是上涨、下跌、横盘。
量价理论表明价涨量增是上涨趋势的确认,反之价跌量增是下跌趋势的确认,我们可以就这样的理论来建立量化交易策略。接下来我们从成交量、OBV指标、A/D指标与量价策略来理解量价的关系。


  1. import talib as ta
  2. import tushare as ts
  3. import pandas as pd
  4. import numpy as np
  5. import matplotlib.pyplot as plt

Volume

计算成交量的斜率,再对斜率进行均线平滑来表示成交量的变化。
成交量上升:

  1. data = ts.get_k_data('000001', start='2016-01-01', end='2016-12-31', ktype='D', autype='qfq')
  2. data.index = pd.to_datetime(data['date'], format='%Y-%m-%d')
  3. volume = np.array(data['volume'])
  4. slope = ta.LINEARREG_SLOPE(volume, 20)
  5. data['Volume_Slope_MA10'] = ta.MA(slope, 10)
  6. data['Volume_Slope_MA20'] = ta.MA(slope, 30)
  1. plt.subplot(3, 1, 1)
  2. plt.plot(data.close)
  3. plt.subplot(3, 1, 2)
  4. plt.bar(data.index, data.volume,color='g')
  5. plt.subplot(3, 1, 3)
  6. plt.plot(data['Volume_Slope_MA10'])
  7. plt.plot(data['Volume_Slope_MA20'])
  8. plt.show()

1


OBV

OBV属于市场的领先指标,计算方法是如果当天价格高于前一天的价格,当天成交量就用加的,反之就用减的来计算出OBV指标,这样有助于分析成交量与价格的关系。


A/D 指标在OBV的基础上对价格的波幅进行了计算,真实波幅越大,指标中的成交量占比越大。


  1. data['OBV'] = ta.abstract.OBV(data)
  2. data['AD'] = ta.abstract.AD(data)
  3. plt.subplot(3, 1, 1)
  4. plt.plot(data.close)
  5. plt.subplot(3, 1, 2)
  6. plt.plot(data.OBV,'g')
  7. plt.ylabel('OBV')
  8. plt.subplot(3, 1, 3)
  9. plt.plot(data.AD, 'y')
  10. plt.ylabel('AD')
  11. plt.show()

2


OBV与A/D指标用法:
突破(Breakout)
当OBV达到新的高点时,它确认牛市的力量,表明价格可能继续上升,并给出买入信号。当OBV低于之前的低点时,它确认熊市的力量,并给出卖空信号。
背离(Divergence)
价格创新高,而OBV或A/D的值没有创新高,顶背离,看跌。
价格创新低,而OBV或A/D的值没有创新低,底背离,看涨。
长期分歧比短期分歧更重要。在几个星期内发展的分歧产生比几天内产生的信号更强的信号。

领先指标 (Leading Indicator)
当价格处于交易区间并且OBV或A/D突破到新的高点时,它给出买入信号。当价格处于交易区间并且OBV或A/D下降并下降到新的低点时,它给出了卖空信号。


OBV突破策略

买入:

卖出:

  1. import talib as ta
  2. import tushare as ts
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. data = ts.get_k_data('000001', start='2016-01-01', end='2016-12-31', ktype='D', autype='qfq')
  6. data.index = pd.to_datetime(data['date'], format='%Y-%m-%d')
  7. data['OBV'] = ta.abstract.OBV(data)
  8. data['OBV_MAX20'] = ta.abstract.MAX(data, 20, price='OBV')
  9. data['OBV_MIN20'] = ta.abstract.MIN(data, 20, price='OBV')
  10. data['OBV_MID20'] = (data['OBV_MAX20'] + data['OBV_MIN20'])/2
  11. data['C_MA'] = ta.abstract.MA(data, 20)
  12. x_b = []
  13. y_b = []
  14. x_s = []
  15. y_s = []
  16. data = data.dropna()
  17. it = data.iterrows()
  18. t0, d0 = next(it)
  19. pos = 0
  20. for t1, d1 in it:
  21. if pos==0 and d1.OBV > d0.OBV_MAX20 and d1.close > d1.C_MA:
  22. x_b.append(t1)
  23. y_b.append(d1.close)
  24. pos=1
  25. elif pos==1 and (d1.OBV < d0.OBV_MIN20 or d1.close < d1.C_MA):
  26. x_s.append(t1)
  27. y_s.append(d1.close)
  28. pos=0
  29. t0, d0 = t1, d1
  30. plt.subplot(2,1,1)
  31. plt.plot(data['close'])
  32. plt.plot(data['C_MA'])
  33. plt.scatter(x_b, y_b, c='r', marker='^', linewidths=3)
  34. plt.scatter(x_s, y_s, c='g', marker='v', linewidths=3)
  35. plt.subplot(2,1,2)
  36. plt.plot(data.OBV)
  37. plt.plot(data.OBV_MAX20, 'g', alpha=0.3)
  38. plt.plot(data.OBV_MID20, 'r', alpha=0.3)
  39. plt.plot(data.OBV_MIN20, 'g', alpha=0.3)
  40. plt.show()

3

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