非常感谢@Morningstar 大神提供原版本代码。这里主要修改了源代码结构,更方便后期修改,未改动代码含义。
update
2016.12.09
修正个股止损代码,请自行复制替换
之前使用的中文逗号
# func_register(g.stop_loss_minute,stop_loss_by_stock,'个股止损')# func_register(g.stop_loss_minute,stop_profit_by_stock,'个股止盈')
缓存参数忘了修改了,现在可以了
def _get_pct_change(security, n, m):
'''
获取个股前n天的m日增幅值序列
增加缓存避免当日多次获取数据
'''
pct_change = None
if security in g.cache['pct_change'].keys():
pct_change = g.cache['pct_change'][security] else:
h = attribute_history(security, n, unit='1d',
fields=('close'), skip_paused=True)
pct_change = h['close'].pct_change(m) # 3日的百分比变比(即3日涨跌幅) g.cache['pct_change'][security] = pct_change return pct_change
2016.12.05
def filter_new(stock_list, context, data):'''
过滤新股
'''delta = 60start_date = context.current_dt.date() - datetime.timedelta(delta)return [stock for stock in stock_list if get_security_info(stock).start_date < start_date]
VERSION
summary
依据 Morningstar 二八轮动小市值优化版 v2.0.7
(https://www.joinquant.com/post/1667?tag=algorithm) 修改而成
首个版本,旨在模块化源代码,实现完美*原版本回测效果
修改部分函数变量命名,次级函数(utils函数除外)均以_
开头
默认开启性能分析
注释没有做完全修正
策略参数只改动了一处,调仓计数改为4天
代码结构
引入外部模块
主体函数
pick & filter
stop loss
trade
utils
log
主体函数
包含全部预制函数,已注释掉未使用部分
initialize
process_initialize
after_code_changed
before_trading_start
after_trading_end
handle_data
handle_data相关函数
定时运行模块
reset_day_param
方法在盘前调用
initialize
pick & filter
选股仅依赖过滤器,筛选出stock_list
后,使用buy_stock_count
截取
现有过滤器如下:
filter_paused
filter_st
filter_gem
filter_limitup
filter_limitdown
filter_by_growth_rate
filter_blacklist
filter_new
filter_by_query
filter_by_rank
因为query查询数据库相对比较慢,目前把所有数据库查询筛选放在filter_by_query
中
过滤器会依照_filter_register
顺序执行,先后顺序会影响速度,filter_by_rank
必须放在最后
当前顺序为原版本顺序,为了回测速度进行妥协。实测效果,将filter_by_query
放在评分前更好,采取全评分效果最佳,但速度非常慢
stop loss
止盈和止损最终都会触发卖出操作,所以这里均以stop_loss
指代
止损器分为day
和minute
两种,day
级别方法会在每日调仓时间执行,minute
级别方法会每分钟调用
指数止损器会触发全部平仓操作,依照原版本方式,暂停当天交易
trade
utils
log