量化交易策略—Volume-weighted Moving Average交易策略

1
回复
3719
查看
[复制链接]

294

主题

20

回帖

1380

积分

专栏作家

积分
1380
来源: 2019-7-18 07:14:23 显示全部楼层 |阅读模式
Volume-weighted Moving Average, VMA(交易量比重均值),此策略综合了价格预测、均值回归和趋势跟踪三种思路的系统,适用于交易量文档的品种,如股票、股指等。发布于2001年7月。该系统的预测利用了成交量的信息对标的的短期走势,而基于成交量的价格预测是其最核心的部分:


    实际上VMAt是基于过去的信息预测价格,而它的预测是基于两个值:上一期的收盘价格 Closet−1Closet−1 和上一期预测的 VMAt−1VMAt−1 。我们相信当上一期的相对成交量 RVt−1RVt−1 越大,这个成交价的参考价值越高,因为它是由市场上大量买方、买方撮合而成的价格,而且得到了大量投资者的认可。所以,当上一期的相对成交量RVt−1越大时,上一期真实发生的收盘价Closet−1上放的比重就会越大,而上一期我们预测值VMAt−1上放的比重会较小;反之亦然。在对短期的价格走势做出预测之后,当价格Closet−1低于预测值VMAt时,我们认为价格短期有较大的概率会上涨,准备开多;反之则准备开空。



具体策略如下:

1)如果Closet−2=Max(Hight−2,Hight−3)开多仓;
(2)持多头时:如果Closet−2>=VMAt−1平多仓;
(3)根据大盘止损;
注:代码证PVMA是VMAt−2


收益风险



源码:

  1. def initialize(context):
  2.     # g.security = get_index_stocks('000300.XSHG')
  3.     # set_universe(g.security)
  4.     set_benchmark('000300.XSHG')
  5.     set_commission(PerTrade(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
  6.     g.VMA = 0
  7.     g.PVMA = 0
  8.     g.stocknum = 15

  9. def before_trading_start(context):
  10.     g.security = get_index_stocks('000300.XSHG')
  11.     set_universe(g.security)

  12. def handle_data(context, data):
  13.     security = g.security
  14.    
  15.     # 根据大盘指数进行止损
  16.     his = attribute_history('000300.XSHG', 10, '1d', 'close')
  17.     if ((1-float(his['close'][-1]/his['close'][0]))>=0.1):
  18.         if len(context.portfolio.positions)>0:
  19.             for stock in list(context.portfolio.positions.keys()):
  20.                 order_target(stock, 0)
  21.         return
  22.    
  23.     # 分配资金
  24.     if len(context.portfolio.positions) < g.stocknum :
  25.         Num = g.stocknum  - len(context.portfolio.positions)
  26.         Cash = context.portfolio.cash/Num
  27.     else:
  28.         Cash = context.portfolio.cash
  29.    
  30.     selllist = []
  31.     # 买入
  32.     for stock in security:
  33.         if stock not in context.portfolio.positions.keys():
  34.             g.PVMA = g.VMA
  35.             his = history(13,unit='1d',field='volume')
  36.             # 计算RV
  37.             AV6 = sum(his[stock][0:6])/6.0
  38.             AV5 = sum(his[stock][1:7])/6.0
  39.             AV4 = sum(his[stock][2:8])/6.0
  40.             AV3 = sum(his[stock][3:9])/6.0
  41.             AV2 = sum(his[stock][4:10])/6.0
  42.             AV1 = sum(his[stock][5:11])/6.0
  43.             AV = sum(his[stock][6:12])/6.0
  44.             HAV = max(AV1,AV2,AV3,AV4,AV5,AV6)
  45.             LAV = min(AV1,AV2,AV3,AV4,AV5,AV6)
  46.             RV = (AV-LAV)/max((HAV-LAV),2e-16)
  47.             # 计算VMA
  48.             hist = attribute_history(stock, 7, '1d', ('volume','close','open','high'))
  49.             Close = hist['close'][-2]
  50.             g.VMA = RV*Close + (1-RV)*g.PVMA
  51.             
  52.             # 判定,符合条件买入
  53.             if (Close
  54.                 if (hist['high'][-1]>=max(hist['high'][-2],hist['high'][-3])):
  55.                     order_value(stock,Cash)
  56.                     
  57.             #判定,不符合的加入selllist
  58.             if Close >= g.VMA:
  59.                 selllist.append(stock)
  60.                
  61.     # 卖出
  62.     for stock in context.portfolio.positions.keys():
  63.         if stock in selllist:
  64.             order_target(stock, 0)
复制代码

回复

使用道具 举报

63

主题

36

回帖

1915

积分

管理员

积分
1915
2019-7-18 08:57:22 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册
关注微信