[关闭]
@Channelchan 2018-01-06T14:00:52.000000Z 字数 3032 阅读 86024

成交量指标策略

市场短期是投票机,长期是称重机

目录

  1. 什么是成交量?
  2. 如何计算成交量指标?
  3. 如何用图形展示成交量?
  4. 如何用成交量指标来编写策略?

什么是成交量?

成交量有三种可能,分别是量增、量减、量平。

价格也有三种可能,分别是上涨、下跌、横盘。

量价理论表明价涨量增是上涨趋势的确认,反之价跌量增是下跌趋势的确认。

如何计算成交量指标?


1. ADV-平均成交量

MA(volume,20)


2. OBV

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


3. A/D

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

V1.png-3.6kB


4. WVAP

按成交量来衡量价格的权重,成交量越大价格权重越大。

V2.png-4.2kB

如何用图形展示成交量?

  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. close = change_index(dv.get_ts('close_adj').loc[20170105:])
  5. volume = change_index(dv.get_ts('volume').loc[20170105:])
  1. adv10 = ta.abstract.MA(volume, 10, price='600036.SH')
  2. adv20 = ta.abstract.MA(volume, 20, price='600036.SH')
  3. fig, (ax, ax1) = plt.subplots(2, 1, sharex=True, figsize=(15,7))
  4. ax.plot(close['600036.SH'], label='600036')
  5. ax.legend(loc='upper left')
  6. ax1.bar(volume.index, volume['600036.SH'],color='g')
  7. ax1.plot(adv10, label='Volume_MA10')
  8. ax1.plot(adv20, label='Volume_MA20')
  9. plt.legend(loc='upper left')
  10. plt.show()

output_7_0.png-44.7kB

  1. #OBV & A/D
  2. Close = close['600036.SH'].values
  3. Volume = volume['600036.SH'].values
  4. Low = change_index(dv.get_ts('low_adj').loc[20170105:])['600036.SH'].values
  5. High = change_index(dv.get_ts('high_adj').loc[20170105:])['600036.SH'].values
  6. OBV = pd.Series(ta.OBV(Close, Volume), index=close.index)
  7. AD = pd.Series(ta.AD(High, Low, Close, Volume), index=close.index)
  8. fig, (ax, ax1,ax2) = plt.subplots(3, 1, sharex=True, figsize=(15,9))
  9. ax.plot(close['600036.SH'], label='600036')
  10. ax.legend(loc='upper left')
  11. ax1.plot(OBV,'g', label='OBV')
  12. ax1.legend(loc='upper left')
  13. ax2.plot(AD, 'y', label='A/D')
  14. ax2.legend(loc='upper left')
  15. plt.show()

output_8_0.png-52.2kB

  1. def ts_sum(ts, window=20):
  2. return ts.rolling(window).sum()
  3. VWAP = ts_sum(pd.Series(Volume,index=volume.index)*close['600036.SH'])/ts_sum(pd.Series(Volume,index=volume.index))
  4. plt.figure(figsize=(15,7))
  5. plt.plot(close['600036.SH'])
  6. plt.plot(VWAP)
  7. plt.show()

output_10_0.png-35.2kB

如何用成交量指标来编写策略?

VWAP策略

买入:

close>VWAP

卖出:

close

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

output_12_0.png-64.6kB

作业

参考以上代码用其他成交量指标做策略

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