偏爱小市值策略的,进来了解下这个策略
程序员文章站
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)
最终回测结果:
当下小市值策略已经成为了基金行业内部公开的“秘密”。谁也不知道未来能否继续获得超额收益,但谁也不能说未来一定会失效。
声明:本文观点仅供交流探讨,不够成任何投资建议,否则后果自负。
推荐阅读