请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化平台 帖子:3354044 新帖:27

基于Morningstar二八轮动小市值优化版 v2

此人已认证发表于:5 月 9 日 18:33回复(1)

非常感谢@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
  • 更新filter_new方法,没有整合进回测代码

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

  • author: @Cath

  • author_origin: @Morningstar

  • date: 2016.12.03

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

  • setreset方法

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指代

  • 止损器分为dayminute两种,day级别方法会在每日调仓时间执行,minute级别方法会每分钟调用

  • 指数止损器会触发全部平仓操作,依照原版本方式,暂停当天交易

trade

  • 新增_order方法,买卖指定数量

  • 平仓时,使用position.closeable_amount代替_order_target_value(security, 0),提高成交成功率

utils

  • 改进了get_close_price方法,获取前n日内的第一个close数据,以保证计算涨幅的相对准确

  • 新增func_register方法,注册过滤器、止损器等

log

  • 新增log_section方法,记录日志小节

  • 新增log_filterlog_stop_loss方法,记录过滤器和止损器

全部回复

0/140

量化课程

    移动端课程