什么是动量策略
动量策略的思想来源于行为金融学,认为市场不是完全有效的,股价对信息的反应可能是迟钝的,即今天涨的股票明天可能会继续涨,就像一列行驶的火车一样,停下来或者加速都需要时间。
动量策略一般是通过预先设定股票收益和交易量的过滤准则,当股票收益或股票收益和交易量同时满足过滤准则就买入或卖出股票来实现的。股票在表现强劲的时候有很大可能会持续上涨,表现差劲的接下来有很大可能继续低迷。
不少投资者将动量策略跟价值投资结合起来,先用基础数据先选出心仪的股票,然后再用动量策略的思路确定入场和离场的时机。
说了这么多概念性的东西,下面就展示一个来自优矿网的动量策略实例
思路:
股票池:沪深300成分股
回测区间:2011年11月1日 —— 2015年3月1日
调仓频率:月度
每次调仓买入月度收益排名前20%的股票
等权重买入
代码长度大概只有30行。
结果:
年化收益35.7%。回撤不小,23.8%。
运行时间大概40秒。
下面链接可以看到原图和完整的策略:
https://uqer.io/community/share/5590a4d4f9f06cb5604f187e
是用优矿网—通联量化实验室(https://uqer.io/home/)完成的,对量化研究感兴趣的同学都可以上去玩玩。
最后献上代码:
import pandas as pd
start = '2011-11-01'
end = '2015-03-01'
benchmark = 'HS300'
universe = set_universe('HS300') # 股票池为沪深300
capital_base = 10000000
refresh_rate = 10
def initialize(account):
pass
def handle_data(account):
history = account.get_attribute_history('closePrice', 20)
momentum = {'symbol':[], 'c_ret':[]}
for stk in account.universe:
momentum['symbol'].append(stk)
momentum['c_ret'].append(history[stk][-1]/history[stk][0])
# 按照过去20日收益率排序,并且选择前20%的股票作为买入候选
momentum = pd.DataFrame(momentum).sort(columns='c_ret').reset_index()
momentum = momentum[len(momentum)*4/5:len(momentum)] # 选择
buylist = momentum['symbol'].tolist()
for stk in account.valid_secpos:
if stk not in buylist:
order_to(stk, 0)
# 等权重买入所选股票
portfolio_value = account.referencePortfolioValue
for stk in buylist:
if stk not in account.valid_secpos:
order_to(stk, int(portfolio_value / account.referencePrice[stk] \
/ 100.0 / len(buylist))*100)