欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

偏爱小市值策略的,进来了解下这个策略

程序员文章站 2022-07-13 15:00:57
...

了解Alpha策略和Fama_French 三因子模型的人都知道,市值因子是一个长期有效的超额收益来源,对股票收益率有一定的解释作用,小市值的股票更容易带来超额收益。这也比较好理解,因为小市值类股票往往表现活跃,容易引发炒作风潮。此外,还有IPO管制的原因(大量排队企业选择借壳),也有市场风险偏好提升的原因(市场恶性循环越来越偏爱小市值)。小市值通常选到的是刚起步的公司,具有较强的成长能力,在一定范围领域内有较强实力(否则谁让你上市的),特别是在发展中国家此类因子有强力的alpha。

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

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

资金管理:等权重买入

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

源代码如下:

# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
from gm.api import *
from datetime import timedelta
"""
小市值策略
本策略每个月触发一次,计算当前沪深市场上市值最小的前30只股票,并且等权重方式进行买入。
对于不在前30的有持仓的股票直接平仓。
回测时间为:2018-07-01 08:00:00 到 2019-10-01 16:00:00 
"""
def init(context):
    # schedule 定时任务详见: https://www.myquant.cn/docs/python/python_basic#7bce6621a1abafe8
    # 每月第一个交易日的09:40 定时执行algo任务
    schedule(schedule_func=algo, date_rule='1m', time_rule='09:40:00')
    # 使用多少的资金来进行开仓。
    context.ratio = 0.8
def algo(context):
    # 获取当前时间
    now = context.now
    # 选取全A股(剔除停牌和st股和上市不足50日的新股和退市股和B股)
    date1 = (context.now - timedelta(days=100)).strftime("%Y-%m-%d %H:%M:%S")
    date2 = context.now.strftime("%Y-%m-%d %H:%M:%S")
    # 通过get_instruments获取所有的上市股票代码 详见:https://www.myquant.cn/docs/python/python_select_api#8ba2064987fb1d1f
    all_stock = get_instruments(exchanges='SHSE, SZSE', sec_types=[1], fields='symbol, listed_date, delisted_date',
                                df=True)
    code = all_stock[(all_stock['listed_date'] < date1) & (all_stock['delisted_date'] > date2) &
                            (all_stock['symbol'].str[5] != '9') & (all_stock['symbol'].str[5] != '2')]
    # 获取所有股票在这个时候的市值, 详见: https://www.myquant.cn/docs/python/python_select_api#8ba2064987fb1d1f
    fundamental = get_fundamentals_n('trading_derivative_indicator', code['symbol'].to_list(),
                                     context.now, fields='TOTMKTCAP', order_by='TOTMKTCAP', count=1, df=True)
    # 对市值进行排序,并且获取前30个。 最后将这个series 转化成为一个list即为标的池
    trade_symbols = fundamental.reset_index(drop=True).loc[:29, 'symbol'].to_list()
    print('本次股票池有股票数目: ', len(trade_symbols))
    # 计算每个个股应该在持仓中的权重
    percent = 1.0 / len(trade_symbols) * context.ratio
    # 获取当前所有仓位 详见 https://www.myquant.cn/docs/python/python_concept#8079e2e4dad05879
    positions = context.account().positions()
    # 平不在标的池的仓位
    for position in positions:
        symbol = position['symbol']
        if symbol not in trade_symbols:
            order_target_percent(symbol=symbol, percent=0, order_type=OrderType_Market,
                                 position_side=PositionSide_Long)
            print('市价单平不在标的池的', symbol)
    # 将标中已有持仓的和还没有持仓的都调整到计算出来的比例。
    for symbol in trade_symbols:
        order_target_percent(symbol=symbol, percent=percent, order_type=OrderType_Market,
                             position_side=PositionSide_Long)
        print(symbol, '以市价单调整至权重', percent)
if __name__ == '__main__':
    '''
    strategy_id策略ID,由系统生成
    filename文件名,请与本文件名保持一致
    mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
    token绑定计算机的ID,可在系统设置-**管理中生成
    backtest_start_time回测开始时间
    backtest_end_time回测结束时间
    backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
    backtest_initial_cash回测初始资金
    backtest_commission_ratio回测佣金比例
    backtest_slippage_ratio回测滑点比例
    '''
    run(strategy_id='strategy_id',
        filename='main.py',
        mode=MODE_BACKTEST,
        token='token_id',
        backtest_start_time='2010-07-01 08:00:00',
        backtest_end_time='2019-10-01 16:00:00',
        backtest_adjust=ADJUST_PREV,
        backtest_initial_cash=1000000,
        backtest_commission_ratio=0.0001,
        backtest_slippage_ratio=0.0001)

最终回测结果

偏爱小市值策略的,进来了解下这个策略

当下小市值策略已经成为了基金行业内部公开的“秘密”。谁也不知道未来能否继续获得超额收益,但谁也不能说未来一定会失效。

声明:本文观点仅供交流探讨,不够成任何投资建议,否则后果自负。

相关标签: 量化交易