浅谈小市值策略

前几篇的教程都是关于择时的策略,今天打算写一篇选股的策略——基于市值的量化投资选股策略。

了解Alpha策略和Fama_French三因子模型的人都知道,市值因子是一个长期有效的超额收益来源,对股票收益率有一定的解释作用,小市值的股票更容易带来超额收益。这也比较好理解,因为小市值类股票往往表现活跃,容易引发炒作风潮。此外,还有IPO管制的原因(大量排队企业选择借壳),也有市场风险偏好提升的原因(市场恶性循环越来越偏爱小市值)。

现在,开始正式介绍策略部分吧。为方便小伙伴们理解,我们会介绍更详细和具体。

策略逻辑:市值可以带来超额收益

策略内容:每月月初买入市值最小的30只股票,持有至下个月月初再调仓

资金管理:等权重买入

风险控制:无单只股票仓位上限控制、无止盈止损

第一步:获取数据,并整理买入股票列表

BigQuant人工智能量化投资平台具有丰富的金融数据,包括行情数据和财报数据,并且具有便捷、简单的API调用接口。获取数据的代码如下:

 def prepare(context):
    # 引进prepare数据准备函数是为了保持回测和模拟能够通用
    # 获取股票代码
    instruments = D.instruments()
    start_date = context.start_date 
    # 确定结束时间
    end_date = context.end_date 
    # 获取股票总市值数据,返回DataFrame数据格式
    market_cap_data = D.history_data(instruments,context.start_date,context.end_date,
              fields=['market_cap','amount'])
    
    # 获取每日按小市值排序 (从低到高)的前三十只股票
    daily_buy_stock = market_cap_data.groupby('date').apply(lambda df:df[(df['amount'] > 0)].sort_values('market_cap')[:30])
    context.daily_buy_stock = daily_buy_stock

在上面的代码中,history_data是我们平台获取数据的一个重要API。fields参数为列表形式,传入的列表即为我们想要获取的数据。

第二步:回测主体
我们平台策略回测有丰富的文档介绍,请参考

# 回测参数设置,initialize函数只运行一次
def initialize(context):
    # 手续费设置
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) 
    # 调仓规则(每月的第一天调仓)
    context.schedule_function(rebalance, date_rule=date_rules.month_start(days_offset=0)) 

# handle_data函数会每天运行一次
def handle_data(context,data):
    pass

# 换仓函数
def rebalance(context, data):
    # 当前的日期
    date = data.current_dt.strftime('%Y-%m-%d')
    # 根据日期获取调仓需要买入的股票的列表
    stock_to_buy = list(context.daily_buy_stock.ix[date].instrument)
    # 通过positions对象,使用列表生成式的方法获取目前持仓的股票列表
    stock_hold_now = [equity.symbol for equity in context.portfolio.positions]
    # 继续持有的股票:调仓时,如果买入的股票已经存在于目前的持仓里,那么应继续持有
    no_need_to_sell = [i for i in stock_hold_now if i in stock_to_buy]
    # 需要卖出的股票
    stock_to_sell = [i for i in stock_hold_now if i not in no_need_to_sell]
  
    # 卖出
    for stock in stock_to_sell:
        # 如果该股票停牌,则没法成交。因此需要用can_trade方法检查下该股票的状态
        # 如果返回真值,则可以正常下单,否则会出错
        # 因为stock是字符串格式,我们用symbol方法将其转化成平台可以接受的形式:Equity格式

        if data.can_trade(context.symbol(stock)):
            # order_target_percent是平台的一个下单接口,表明下单使得该股票的权重为0,
            #   即卖出全部股票,可参考回测文档
            context.order_target_percent(context.symbol(stock), 0)
    
    # 如果当天没有买入的股票,就返回
    if len(stock_to_buy) == 0:
        return

    # 等权重买入 
    weight =  1 / len(stock_to_buy)
    
    # 买入
    for stock in stock_to_buy:
        if data.can_trade(context.symbol(stock)):
            # 下单使得某只股票的持仓权重达到weight,因为
            # weight大于0,因此是等权重买入
            context.order_target_percent(context.symbol(stock), weight)
 

第三步:回测接口

m=M.trade.v3( 
    instruments=D.instruments(),
    start_date= '2013-01-01', 
    end_date='2017-11-08',
    # 必须传入initialize,只在第一天运行
    prepare=prepare,
    initialize=initialize,
    #  必须传入handle_data,每个交易日都会运行
    handle_data=handle_data,
    # 买入以开盘价成交
    order_price_field_buy='open',
    # 卖出也以开盘价成交
    order_price_field_sell='open',
    # 策略本金
    capital_base=1000000,
    # 比较基准:沪深300
    benchmark='000300.INDX',
)

好嘞,策略就完全写好了。我们运行完曲线如下:

回测结果比较真实,小市值策略在过去几年确实是这样的表现。2017年以来,中小盘风格转换明显,创业板、中小板走势比较弱,因此该策略也面临较大回撤。

纸上得来终觉浅,绝知此事须躬行。还是请小伙伴自己动手去实现吧:在文末进入原文,点击 克隆策略按钮就可把完整策略复制到自己的账户了,赶紧试试吧。

 

原文链接:《量化投资策略——浅谈小市值策略

BigQuant——人工智能量化交易投资平台

posted @ 2018-11-23 18:45  BigQuant量化  阅读(174)  评论(0编辑  收藏  举报  来源