最近想把量化投资十大经典策略都重新复现一遍,作为回顾,也作为学习。就从最基础的双均线策略开始,为了程序编写的简便起见,直接采用了聚宽平台,不然的话,股票的基本面数据和历史数据需要我自己去爬取,需要自己写爬虫,或者使用tushare之类的第三方包,不过tushare现在很多功能都需要有一定的积分了才可以使用。
策略原理:
构建双均线交易策略。使用两根均线,一根长周期均线,一根短周期均线。当短期均线从下往上穿越长周期均线的时候,买入;当短期均线从上往下穿越长周期均线的时候,卖出。
附加条件:
加入止损和仓位管理,并计算买入的股票数量;测试时间最好从2010年开始跑过整轮牛熊;使用的均线周期为15日,60日均线。
算法:
1.根据设置的长短周期,计算均线值
2.每日收盘后判断,若出现金叉,则把该股列入买入股票池,并计算5日平均波幅ATR,确定止损价为当然最低价-ATR,并根据风险比例和仓位,计算出可以买入的数量amount,保存在待买入列表中;若出现死叉,或股价跌破止损价,则将股票保存到待卖出股票列表中;
3.第二天,开盘判断待买入股票是否在持仓列表中,如不在,则买入,加入到持仓列表中;对待卖出列表中的股票进行卖出。
策略回测表现:
采用宁波银行'002142.XSHE',今世缘'603369.XSHG',两个股票作为股票池进行回测
2019-8-1至2021-2-1,策略收益32.57%,跑输沪深300指数
2010-8-1至2021-2-1,策略收益151.55%,跑赢沪深300指数
由于投资标的特定为宁波银行和今世缘,因此不能说选别的股票也是这个效果,于是我增加了选股策略:
4.股票池中的列表从沪深300成分股中选择,选择净利润同比增长率为正,扣非净利润为正,roe为正,净资产回报率为正的股票,并取净利润增长率和eps倒序排序,选前三个股票,每天开盘前选股。
## 开盘更新股票池
pool = get_index_stocks('000300.XSHG') # 沪深300股票池
df = get_fundamentals(query(
valuation.code, valuation.market_cap, indicator.eps, valuation.pe_ratio, indicator.inc_net_profit_year_on_year
).filter(
indicator.inc_net_profit_year_on_year > 0,
indicator.adjusted_profit > 0,
indicator.roe > 0,
indicator.inc_return > 0,
valuation.code.in_(pool)
).order_by(
# 按净利润率降序排列
indicator.inc_net_profit_year_on_year.desc(),
indicator.eps.desc()
).limit(
3
), date=context.current_dt.strftime('%Y-%m-%d'))
log.info("stockList-------------》",df['code'])
g.stockList = df['code']
选股之后,对股票池内的股票进行双均线择时,回测了2010-8-1至2021-2-1的结果如下:
可以看到,还是略为跑输沪深300指数的,可见单纯的依靠双均线策略,长期来看很难跑赢沪深300指数,这也就是说,对于普通投资者,坚持定投指数基金,的确可以打败大部分的主动型投资基金经理。