wywy1995 发布于2021-09-11
回复 230
浏览 17732
373
**前言**
简单粗暴的选择最小市值股票,还能获得惊人收益的策略是过去特定市场背景下的产物,在股票供给愈发充足,退市机制与注册制逐步完善,投资者更加成熟的未来,大概率会完全失效。下图策略是个很典型的例子,在2017年之前,只要沾了小市值,无论使用多奇葩的因子都能获得超高收益。然而2017年后,眼见他起高楼,眼见他宴宾客,眼见他楼塌了...
图1:换手率结合小市值

图2:失效的不是小市值而是垃圾股

**小市值优化——与peg的结合**
美国股市上百年的经历告诉我们,小市值因子长期有效,但是必须结合更加过硬的逻辑,即引入peg这一经典的成长性指标。
首先观察当且仅当peg与小市值结合时的效果。使用聚宽因子看板经过中位数去极值,行业市值对数中性化,zscore标准化处理的干净的peg因子,选择因子值最小的10%,再应用小市值因子选出最小五只。为防止在指数选择上出现幸存者偏差,使用全市场指数作为初始股票池(剔除st,退市,新股,科创板)
注释:
1.peg因子的计算公式:
PEG = PE / (归母公司净利润(TTM)增长率 * 100)
如果 PE 或 增长率为负,则为 nan
2.使用以下代码进行洗股,因为涨跌停,停牌属于交易范畴,对股票因子影响不大,暂不剔除
```
#过滤ST及其他具有退市标签的股票
#输入选股列表,返回剔除ST及其他具有退市标签股票后的列表
def filter_st_stock(stock_list):
current_data = get_current_data()
return [stock for stock in stock_list
if not current_data[stock].is_st
and 'ST' not in current_data[stock].name
and '*' not in current_data[stock].name
and '退' not in current_data[stock].name]
#过滤科创板
#输入股票列表,返回剔除科创板后的列表
def filter_kcb_stock(context, stock_list):
return [stock for stock in stock_list if stock[0:3] != '688']
#过滤次新股
#输入股票列表,返回剔除上市日期不足250日股票后的列表
def filter_new_stock(context,stock_list):
yesterday = context.previous_date
return [stock for stock in stock_list if not yesterday - get_security_info(stock).start_date < datetime.timedelta(days=250)]
```
3.聚宽因子选股
https://www.joinquant.com/algorithm/apishare/get?apiId=4033
```
peg_list = get_factor_filter_list(context, initial_list, 'PEG', True, 0, 0.1)
```
2011/08/31-2021/08/31十年回测结果:
图3:对照组——仅有小市值因子

图4:实验组——小市值因子结合peg之后

从绝对收益上看,虽然实验组没有跑赢对照组,但是对照组的超额收益主要集中在2016年之前,在最近5年时间里超额收益呈下降趋势,而实验组的超额收益在2018年低点之后不断增加,策略整体收益也在最近创出新高,所以推测市场风格在不断认可peg的选股思路。但是目前为止策略的劣势也很明显,首先是因子数量的问题,全市场经过洗股后有3900只股票,仅使用两个因子,风险暴露太高,一旦因子失效会承担很大风险。而且peg本身也有一定问题,比如peg本身没有考虑到风险因素,也无法对未来增长的可持续性进行预判。最后考虑到2017-2018年回撤时间很长,实际使用很可能无法坚持下来,所以对回撤也要进一步处理。
**进一步优化——“因子海选”**
图5:在peg选股基础上添加额外因子的效果,所有因子来源于聚宽因子看板

1.图中展示了15个基本面因子和15个技术面因子,由于在测试中发现额外因子自身的收益率越高,结合后效果一般也更好,所以对于10年间自身受益为负的额外因子没有进行测试。
2.图中的数据按照从好到坏标记了红黄绿三种颜色,对于最大回撤时间,出现的越早,对现在影响越小,故标为红色。
3.观察后发现,技术面因子选择最小的成交量标准差和换手率波动率对策略提升明显,基本面因子大多表现不佳,唯一出现“三红二黄”的基本面因子为EBIT,即息税前利润。
4.进一步比较技术面因子和基本面因子发现,在最近4年时间里,技术面因子的超额收益持续下降!而EBIT却恰恰相反,有一种逐步被市场认可的感觉,而且基本面因子往往拥有过硬的逻辑支持,有效性可能会更强,所以决定进一步挖掘EBIT的特点。
额外说明:测试范围选择了中小创(399006+000905),而且使用了择时(rsrs+ma),所以这张图中会看到peg收益高于单纯小市值,跟上面说的结论不一致。严格来说,应该选择全市场无择时以控制变量,但是刚开始测试时我使用了一个以前模板的克隆,测试一部分后才发现问题,此时已经消耗了太多积分,只好将错就错,不过从比较额外因子的角度考虑,结果也可以接受。
**反向分析后发现的奇怪现象**
在确定深挖EBIT之后,我们手里现在有三个因子——PEG,EBIT,SMLCAP,查看聚宽因子看板后可以确定,三个因子都表现为单调性,PEG越小说明增长率(分母越大)越好,EBIT作为利润的前身越大越好,小市值的公司更容易成长。为了进一步观察每项因子对策略的影响,我进行了如下实验:将两项因子按单调性固定为最佳状态,将第三项因子设定为最差状态进行回测(均使用中小创股池,未择时),结果如下
图6 peg高估

即使选择了小市值和高EBIT,成长性差的公司收益也会非常差,完全符合预期。
图7 大市值

选择了低PEG高EBIT,大市值公司整体没有跑输,主要是近年来ETF投资兴起,权重股被超配,与指数关联性高的大企业不容易跑输,这点在沪深300上尤其突出,基本符合预期。
图8 低息税前利润

选择低PEG,小市值,低息税前利润的企业效果竟然这么好?这个结果刚出来的时候看的我一头雾水,要知道EBIT单独使用年化收益-9%,收益曲线长期来看就是条从左上到右下的直线。而且咱们之前分析过,2017年之后“炒烂”的风格就过去了,又检查了下代码确定是选低利润,所以到底为什么会这样?
查阅了关于EBIT的资料后,总结出以下几条猜想:
1.成本说
有些企业会故意压低EBIT从而达到“合法避税”的目的,比如茅台总公司向销售公司销售酒时价格极低,就是为了降低税费支出。
2.预期说
在全市场范围内EBIT确实越大越好,但是我们在考虑EBIT之前,第一因子选择了全市场最小10%PEG,也就是说在增长有保证的前提下,选择当前利润较低的公司,低基数可能更容易维持高增长,同时较低的EBIT意味着较大的空间以及向市场均值回归的可能性。很多初创企业的利润开始也很低,甚至亏损,如果这是为了在市场中获得竞争优势而做出的牺牲,那么可以预期未来EBIT会增加。
3.风险说
以下内容来源网络
```
1. 经营风险
经营风险是指企业未使用债务时,在经营过程中的内在风险。衡量企业的经营风险可以用经营杠杆,这里还要引入一个新的概念,就是边际贡献。具体是:边际贡献=(售价-变动成本)*销售数量,此时是去掉了固定成本的影响。
经营杠杆系数=边际贡献/EBIT
边际贡献=EBIT+固定成本
也就是经营杠杆的大小是由企业的固定性成本和EBIT共同决定的,固定成本越大,经营杠杆越大,经营风险也就越大。如何降低经营杠杆呢?比如提高产品价格、降低变动成本、扩大市场需求、降低固定成本等。
例如:企业的EBIT=100,固定成本=30,那么经营杠杆系数=(100+30)/100=1.3
如果EBIT和固定成本均增加10,经营杠杆系数=(110+40)/110=1.36
1.36>1.3,企业的经营风险加大了。
因此,不能单考虑EBIT的绝对值,还要考虑与固定成本的相对关系。
2. 财务风险
财务风险指的是企业利用债务融资要承担固定性的融资成本所带来的风险。衡量财务风险的指标可以用财务杠杆,具体为:财务杠杆=EBIT/(EBIT-税前利息),即财务杠杆是由EBIT和固定性利息支出所共同决定的。利息费用越高,财务杠杆越高,财务风险也就越大。但是利息费用可以抵税,也会给企业带来抵税收益,因此企业要适度借款,否则无限增加借款,会使企业的债务成本抵销了利息抵税收益,进而增加了财务风险。
例如,企业的EBIT=100,税前利息=20,那么财务杠杆=100/(100-20)=1.25
如果将EBIT和税前利息均增加10,那么财务杠杆=110/(110-30)=1.375
1.375>1.25,同时财务风险也增加了。
最后,简单地说,就是企业想要提高EBIT可以通过经营高风险行业来获得高额利润,此时的经营风险也加大; 也可以通过高额的借款来满足迅速扩张,进而提高EBIT,那么财务风险会加大。因此EBIT不一定是越高越好,还要评估企业的经营风险和财务风险,要使其在可控的范围内
```
从预期的角度,如果EBIT能回归均值,那么PEG的持续性就可以得到保证;从风险的角度来看,EBIT又正好解决了PEG对风险解释不足的缺点。综上,从背后的逻辑判断,EBIT弥补了PEG的主要缺点,因此低PEG低EBIT组合带来的超额收益应该具有一定合理性。
之后我又进行了不同分位EBIT的实验,2014-2021年从小到大排列一到五分位年化收益结果分别是0.48,0.19,0.11,0.31,0.22。具有确定性,偏价值风格的较大分位也能获得还不错的收益,不过最高收益还是最小分位的。
注释:核心选股代码
```
initial_list = get_all_securities().index.tolist()
initial_list = filter_new_stock(context,initial_list)
initial_list = filter_kcb_stock(context, initial_list)
initial_list = filter_st_stock(initial_list)
peg_list = get_factor_filter_list(context, initial_list, 'PEG', True, 0.1)
ebit_list = get_factor_filter_list(context, peg_list, 'EBIT', True, 0.25)
q = query(valuation.code,valuation.circulating_market_cap).filter(valuation.code.in_(test_list)).order_by(valuation.circulating_market_cap.asc())
df = get_fundamentals(q)
final_list = list(df.code)
```
**择时办法的选择**
文章开头提到的最后一个没有解决的问题就是回撤。传统方法是使用择时方法来降低回撤,但是在测试了大多数技术指标甚至宏观择时指标后,效果都不太理想,甚至不如不择时。硬要选择的化,目前我所发现的最优解还是rsrs+ma的方法。
图9 rsrs+ma择时后

另一种解决回撤的方法是轮动。
图10 大小市值轮动后的收益

后者虽然绝对收益不如前者,但是回撤幅度与时间更小,心理上更容易接受。
**最后**
就最近表现怎么样的问题,可以与纯小市值因子在中小综指(399101)上选股进行比较,可以看到改良后的策略最近一年来明显更为优秀。
图11 无择时传统小市值

图12 无择时改良后

克隆策略放上的是只有因子,没有择时或轮动的纯净版,数据全部来源于聚宽,无第三方,可放心运行,希望读者们能在其基础上添加更有效的择时方法或额外因子。
评论
老师的这篇文章几乎给了我设计策略的标准模板,从想法到实验,再在实验的基础上一步一步调整,探究结果背后的逻辑,在实验--探究--改进的过程中得到不错的结果,这就是我要学习的榜样呀!谢谢老师✧( ु•⌄• )◞
2021-09-11
@Jasmine777 加油,加油
2021-09-11
@Jasmine777 加油,加油
2021-09-11
@Jasmine777 加油,加油
2021-09-11
@Jasmine777 加油,加油
2021-09-11
@Anmicius 加油,加油
2021-09-11
点赞,学习。支持老师持续发优质代码
2021-09-11
@TianTian Star 确实如此哈
2021-09-11
@Jasmine777 确实如此哈
2021-09-11
@Anmicius 确实如此哈
2021-09-11
@Jasmine777 确实如此哈
2021-09-11
@Jasmine777 大家一起加油
2021-09-11
@Jasmine777 确实如此哈
2021-09-11
@TianTian Star 感谢支持
2021-09-11