@Channelchan
2017-03-06T11:02:38.000000Z
字数 2677
阅读 26706
成交量 OBV A/D 量价策略
成交量有三种可能,分别是量增、量减、量平。
价格也有三种可能,分别是上涨、下跌、横盘。
量价理论表明价涨量增是上涨趋势的确认,反之价跌量增是下跌趋势的确认,我们可以就这样的理论来建立量化交易策略。接下来我们从成交量、OBV指标、A/D指标与量价策略来理解量价的关系。
import talib as taimport tushare as tsimport pandas as pdimport numpy as npimport matplotlib.pyplot as plt
计算成交量的斜率,再对斜率进行均线平滑来表示成交量的变化。
成交量上升:
data = ts.get_k_data('000001', start='2016-01-01', end='2016-12-31', ktype='D', autype='qfq')data.index = pd.to_datetime(data['date'], format='%Y-%m-%d')volume = np.array(data['volume'])slope = ta.LINEARREG_SLOPE(volume, 20)data['Volume_Slope_MA10'] = ta.MA(slope, 10)data['Volume_Slope_MA20'] = ta.MA(slope, 30)
plt.subplot(3, 1, 1)plt.plot(data.close)plt.subplot(3, 1, 2)plt.bar(data.index, data.volume,color='g')plt.subplot(3, 1, 3)plt.plot(data['Volume_Slope_MA10'])plt.plot(data['Volume_Slope_MA20'])plt.show()

OBV属于市场的领先指标,计算方法是如果当天价格高于前一天的价格,当天成交量就用加的,反之就用减的来计算出OBV指标,这样有助于分析成交量与价格的关系。
A/D 指标在OBV的基础上对价格的波幅进行了计算,真实波幅越大,指标中的成交量占比越大。
data['OBV'] = ta.abstract.OBV(data)data['AD'] = ta.abstract.AD(data)plt.subplot(3, 1, 1)plt.plot(data.close)plt.subplot(3, 1, 2)plt.plot(data.OBV,'g')plt.ylabel('OBV')plt.subplot(3, 1, 3)plt.plot(data.AD, 'y')plt.ylabel('AD')plt.show()

OBV与A/D指标用法:
突破(Breakout)
当OBV达到新的高点时,它确认牛市的力量,表明价格可能继续上升,并给出买入信号。当OBV低于之前的低点时,它确认熊市的力量,并给出卖空信号。
背离(Divergence)
价格创新高,而OBV或A/D的值没有创新高,顶背离,看跌。
价格创新低,而OBV或A/D的值没有创新低,底背离,看涨。
长期分歧比短期分歧更重要。在几个星期内发展的分歧产生比几天内产生的信号更强的信号。
领先指标 (Leading Indicator)
当价格处于交易区间并且OBV或A/D突破到新的高点时,它给出买入信号。当价格处于交易区间并且OBV或A/D下降并下降到新的低点时,它给出了卖空信号。
买入:
卖出:
import talib as taimport tushare as tsimport pandas as pdimport matplotlib.pyplot as pltdata = ts.get_k_data('000001', start='2016-01-01', end='2016-12-31', ktype='D', autype='qfq')data.index = pd.to_datetime(data['date'], format='%Y-%m-%d')data['OBV'] = ta.abstract.OBV(data)data['OBV_MAX20'] = ta.abstract.MAX(data, 20, price='OBV')data['OBV_MIN20'] = ta.abstract.MIN(data, 20, price='OBV')data['OBV_MID20'] = (data['OBV_MAX20'] + data['OBV_MIN20'])/2data['C_MA'] = ta.abstract.MA(data, 20)x_b = []y_b = []x_s = []y_s = []data = data.dropna()it = data.iterrows()t0, d0 = next(it)pos = 0for t1, d1 in it:if pos==0 and d1.OBV > d0.OBV_MAX20 and d1.close > d1.C_MA:x_b.append(t1)y_b.append(d1.close)pos=1elif pos==1 and (d1.OBV < d0.OBV_MIN20 or d1.close < d1.C_MA):x_s.append(t1)y_s.append(d1.close)pos=0t0, d0 = t1, d1plt.subplot(2,1,1)plt.plot(data['close'])plt.plot(data['C_MA'])plt.scatter(x_b, y_b, c='r', marker='^', linewidths=3)plt.scatter(x_s, y_s, c='g', marker='v', linewidths=3)plt.subplot(2,1,2)plt.plot(data.OBV)plt.plot(data.OBV_MAX20, 'g', alpha=0.3)plt.plot(data.OBV_MID20, 'r', alpha=0.3)plt.plot(data.OBV_MIN20, 'g', alpha=0.3)plt.show()

