量化交易策略—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)
:):):):):):)
页:
[1]