wywy1995 发布于2021-12-04
回复 269
浏览 13725
307
之前写过一个peg搭配小市值的策略,虽然收益很高,但有个明显的缺点,就是在回撤幅度太大。我一向不太会择时,所以当时的解决方案是又写了个与大盘股结合进行轮动的策略,主要是为了避免2017年小盘股的下跌。但这样做又有个新的问题,就是总体收益少了一半,而回撤只减少了10%。
那么有没有一个小盘策略能符合以下三点呢:
1.与不加任何修饰的小市值因子策略相比,近10年收益相差不大,且最近一年能跑赢基准(纯小市值因子最近一年明显跑输基准);
2.不择时不止损的情况下回撤控制在40%以内。毕竟小盘策略属于高风险高收益,所以想控制在30%以内很难,之前的小盘策略回撤甚至达到50%多,与大盘轮动也会有40%多的回撤。
3.交易次数不要太频繁,一年交易不要超过30次,这样受滑点的影响较低。
尝试了一圈下来,发现其实满足上述三条中至少两条的策略还是很多的!核心选股思路是,先用某个分层性质较好的因子选出最优的10%,在其中用小市值进行轮动即可。下图总结了我筛选了将近200个因子后保留的适合小盘轮动的因子:



测试时间包含了15,16年股灾,18年熊市,没有选择15年之前是因为之前无论什么牛鬼蛇神策略全赚钱,没有区分度。因子数据来源于聚宽因子看板,可以根据图中的关键词搜索因子相关的信息。
因为这个策略本身没什么技术含量(穷举测试纯体力劳动),所以我把核心的选股代码写在这里,有能力的可以直接移植过去,节省积分。
```
#1-1 选股模块
def get_factor_filter_list(context,stock_list,jqfactor,sort,p1,p2):
yesterday = context.previous_date
score_list = get_factor_values(stock_list, jqfactor, end_date=yesterday, count=1)[jqfactor].iloc[0].tolist()
df = pd.DataFrame(columns=['code','score'])
df['code'] = stock_list
df['score'] = score_list
df = df.dropna()
df.sort_values(by='score', ascending=sort, inplace=True)
filter_list = list(df.code)[int(p1*len(stock_list)):int(p2*len(stock_list))]
return filter_list
#1-2 选股模块
def get_stock_list(context):
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)
growth_list = get_factor_filter_list(context, initial_list, 'sales_growth', False, 0, 0.1)
q = query(valuation.code,valuation.circulating_market_cap,indicator.eps).filter(valuation.code.in_(growth_list)).order_by(valuation.circulating_market_cap.asc())
df = get_fundamentals(q)
df = df[df['eps']>0]
final_list = list(df.code)
return final_list
```
下面的回测以上图中一个我比较满意的因子——5年营业收入增长率为例,依旧是没有择时和止损,每周最多交易一次,截止到本文发表前一天,收益是创了新高的,目前看还有效。不过鉴于本人的策略经常刚一发表就是最高点,各位朋友权当看个乐呵,不要实盘!不要实盘!不要实盘!
评论
感谢作者的分享,有几点疑问:
1.营业收入增长率和5年营业收入增长率都是不错的因子。 简单的使用营业收入增长率,不知道聚宽有没有进行数据处理?
2 不复权价格因子,是类似于直接按价格排序吗?
3. 收益最高的市值立方因子,这是个什么因子?
2021-12-04
@xiaoyao518 谢谢
2021-12-05
@小散a 问题1,聚宽的说明里写的是没有进行数据处理。问题2,不复权价格就是价格的排序,也没有进行数据处理。问题3,市值立方的官方解释如下:“标准化市值因子的三次方,之后将结果和标准化市值因子回归取残差(去除和市值因子的共线性),然后残差值进行缩尾处理(将3倍标准差之外的点处理成3倍标准差)和标准化”。
所有因子信息可以在https://www.joinquant.com/view/factorlib/list查询,不过有些数据的具体计算公式和处理方式聚宽没有公开。
2021-12-05
@Ty_13890403114 1
2021-12-05
根据作者的回测,基本能解决好行业,好公司的问题,感觉如果能解决好价格的问题就更完美了
2021-12-05