|
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]))>=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[stock][0:6])/6.0
- AV5 = sum(his[stock][1:7])/6.0
- AV4 = sum(his[stock][2:8])/6.0
- AV3 = sum(his[stock][3:9])/6.0
- AV2 = sum(his[stock][4:10])/6.0
- AV1 = sum(his[stock][5:11])/6.0
- AV = sum(his[stock][6:12])/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)
复制代码 |
|