基于Stockranker的超跌反弹策略 (副本)
由small_q创建,最终由small_q 被浏览 16 用户
策略思路逻辑
上一篇 在华泰的研报中,我们知道了
四类因子(流入类因子、流出类因子、主力净流入类因子、开盘主力净流入类因子)在选股上存在一定的实用性。
研报链接:华泰单因子测试之资金流向因子
\
因子灵感来源
基于Stockranker的超跌反弹策略
这次我们--从研报中获取到了灵感,
结合一些收益率和量价因子,来进一步合成我们的资金流因子,
制作反转策略。
我们的这次的策略,采用stockRanker排序算法 拟合出一个能选出超跌反弹股票的选股模型。
结合传统量化策略的开发思路,对我们的AI策略进行迭代。
我们想要做的是: 防守的套利策略。
做超跌反弹,或者回踩反弹的套利策略。
想要找出这类形态的股票,那我们就要对股票的反弹形态有一定的认识。
从主观量化的角度来说,一般股票处于下跌通道,且跌破
20日ma均线的,短期反弹力度太弱的,套利机会会少一点。
适合我们做套利的股票形态,一般都是回踩了支撑位,或者达到了底部开始反弹的策略。
比如:猪肉的牧原,形态上就属于超跌反弹的一种,叠加了猪周期。
而视觉中国,就属于回踩了20日MA均线开始走第二浪的走势
很多朋友会选择通过写选股指标的方法来描述这些股票的形态,这样的方法不是说不好。
只是比较复杂,而且限定比较多,太复杂的条件也容易过拟合。
因此,在这里我给大家介绍一种方式可以通过对因子值的一些相关关系进行分析,通过
条件约束,找到其内在联系。
超跌因子构建方法
首先通过因子分析模块 测试了几个样例因子
alpha1=rank(((close_0-open_0)/open_0)/((close_0-open_4)/open_4))
alpha3=rank(((high_0-low_0)/close_1)/ts_max(((high_0-low_0)/close_1), 20))
#这两个因子的含义是,alpha1(当天的收益/最近4日内收益率)的排序
Alpha3 (当天的振幅 /还有20天内最高振幅)的排序
目的是为了找出这几日内股票收益率与振幅的关系
我们把股票池分为30组,做一个粗略的测试。
(为何要分成30组?)
答:相比与5组,20组,30组会分的更细致。
通过测试结果我们会发现,
相比alpha1因子不明显,但是alpha3因子的收益存在一个明显的分层效应。
且alpha因子值越大,越靠近头部,选股的分位数收益越高。
而且大部分头部的股票,选择的都是一些反弹的和超跌的股票
接下来,我们可以把这两个因子通过传统量化的手段,按天调仓。
我们需要简单的对因子进行约束,使得他的选股风格更接近我们想要的效果
约束的基本条件为:
- 我希望alpha1因子值的权重尽量低一点,因为他的高分位数和低分位数的特征不明显
- 我希望alpha3因子值的权重尽量高一点,因为头部区域的选股收益更高
- Alpha1<0.01 & Alpha3>0.85
回测一下看看效果。
在不加入风控还有条件选股拟合的情况下测试,
我们可以发现超跌反弹,还有支撑位反弹 这种风格在牛市还有震荡市场中也有不俗的收益。
证明这个因子的约束条件是十分有效的,他选出来的股票池收益相对比较稳健。
于是,我们开始对传统策略进行升级迭代 变成AI-量化策略
特征因子列表:
(总共11个因子)
我们大部分选取的都是一些短周期的量价因子(时间在5-10天),
还有一部分属于资金流因子。
目的就是为了还原我们研报中的思想,构造一种能作为反转因子的系统
ts_min(amount_0,20)/mean(amount_0,20)
#20日内最低成交额/20日平均成交额
rank_swing_volatility_5_0
#5日的振幅波动率排名
rank(mean(mf_net_amount_xl_0,5))/rank(mean(mf_net_amount_xl_0,20))
#5日的平均超大单资金流入的排名/(20日的平均超大单资金流入的排名)
rank(sum(high_0/close_0,20))/rank(sum(close_0/low_0,10))
#最高价和最低价的关系
mean(mf_net_amount_m_0,10)/mean(mf_net_amount_m_0,20)
#10日内的资金流中单净值/20日内中单净值 排序
rank(mean(amount_0/deal_number_0,5))/rank(mean(amount_0/deal_number_0,20))
#成交额和成交笔数的关系
rank(mean(mf_net_amount_s_0,5))/rank(mean(mf_net_amount_s_0,20))
#5日内的资金流小单净值/20日内小单净值 排序
rank(mean(mf_net_amount_m_0,5))/rank(mean(mf_net_amount_m_0,10))
#5日内的资金流中单净值/10日内小单净值 排序
rank(mean(mf_net_amount_l_0,5))/rank(mean(mf_net_amount_l_0,10))
#5日内的资金流大单净值/10日内大单净值 排序
correlation(sqrt(volume_0),return_0,5)
#5日内收益率和成交量的平方的相关系数
correlation(log(volume_0),abs(return_0-1),5)
#5日内成交量的对数 和收益率的绝对值 的相关系数
算法选择
Stockranker排序算法
选择Stockranker的原因,
是因为我们使用了非常多跟排序相关的量价因子和资金流因子,通过排序算法,
更容易拟合到这些线性的规律。
可以看到我们的模型在训练集中表现良好。样本拟合的程度较高,比较稳定。
回测效果
模拟实盘效果
主要代码讲解
数据标注
我们这次用的是比较正常的标注方式
# 计算收益,2日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)
shift(close, -2) / shift(open, -1)-1
# 极值处理:用1%和99%分位的值做clip
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))
# 将分数映射到分类,这里使用30个分类
all_wbins(label, 30)
数据过滤 -训练集
2008-10-20 -2021-03-15
\
过滤ST+股票池筛选
我们把刚才的因子约束条件放入过滤的条件框中
cond1=rank(((close_0-open_0)/open_0)/((close_0-open_4)/open_4))
cond3=rank(((high_0-low_0)/close_1)/ts_max(((high_0-low_0)/close_1), 20))
过滤:cond1<0.01 & cond3>0.85
模型调整
我们把我们的模型参数调整为
叶节点数量 :30
叶节点最小样本:280个
数的数量:21
视频:
/wiki/static/upload/59/59d72183-8d83-4c55-80be-d6cce58ddcb2.mp4
\
后续优化思路
更换因子
我们可以替换掉一些已经失效的因子,或者更换因子值的约束条件。
因为因子的收益是会随着市场风格变化而变化的,如果担心策略失效,可以定期轮换因子。
更换标注
我们可以尝试换一些过滤条件,比如对我们的资金流和量价数据进行组合约束
找出资金流和收益率的相关性
更换选股条件
我们也可以把我们平常选股的一些逻辑集成到我们的策略中
对股票池进行进一步的分析和约束,在一定程度上可以起到降噪的作用
更换训练时间
可以将训练的时间调整至其他日期,或者进行滚动训练。