金融老法师 发表于 2019-7-18 07:14:23

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

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


收益风险


源码:

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

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

def handle_data(context, data):
    security = g.security
   
    # 根据大盘指数进行止损
    his = attribute_history('000300.XSHG', 10, '1d', 'close')
    if ((1-float(his['close'][-1]/his['close']))>=0.1):
      if len(context.portfolio.positions)>0:
            for stock in list(context.portfolio.positions.keys()):
                order_target(stock, 0)
      return
   
    # 分配资金
    if len(context.portfolio.positions) < g.stocknum :
      Num = g.stocknum- len(context.portfolio.positions)
      Cash = context.portfolio.cash/Num
    else:
      Cash = context.portfolio.cash
   
    selllist = []
    # 买入
    for stock in security:
      if stock not in context.portfolio.positions.keys():
            g.PVMA = g.VMA
            his = history(13,unit='1d',field='volume')
            # 计算RV
            AV6 = sum(his)/6.0
            AV5 = sum(his)/6.0
            AV4 = sum(his)/6.0
            AV3 = sum(his)/6.0
            AV2 = sum(his)/6.0
            AV1 = sum(his)/6.0
            AV = sum(his)/6.0
            HAV = max(AV1,AV2,AV3,AV4,AV5,AV6)
            LAV = min(AV1,AV2,AV3,AV4,AV5,AV6)
            RV = (AV-LAV)/max((HAV-LAV),2e-16)
            # 计算VMA
            hist = attribute_history(stock, 7, '1d', ('volume','close','open','high'))
            Close = hist['close'][-2]
            g.VMA = RV*Close + (1-RV)*g.PVMA
            
            # 判定,符合条件买入
            if (Close
                if (hist['high'][-1]>=max(hist['high'][-2],hist['high'][-3])):
                  order_value(stock,Cash)
                  
            #判定,不符合的加入selllist
            if Close >= g.VMA:
                selllist.append(stock)
               
    # 卖出
    for stock in context.portfolio.positions.keys():
      if stock in selllist:
            order_target(stock, 0)

geek168 发表于 2019-7-18 08:57:22

:):):):):):)
页: [1]
查看完整版本: 量化交易策略—Volume-weighted Moving Average交易策略