因子IC分析与收益alpha分析背后的逻辑实证(代码+数据下载)

今日分享:

星球的初心与规划,如何更好服务量化学习群体,持续创造价值。

还是要从价值的角度出发,大家都需要什么,而后才是星球可以提供什么给大家。

AI量化投资,投资是主语,量化是手段,AI是量化的辅助,不可本末倒置。

投资是承当可承受的风险,去博取预期回报。我们分析信息,做出决策。量化就是这么一个手段,相对主观交易而言。

作为一个量化社群应该提供的核心价值

1、量化投资是依赖平台的,考虑投研效率以及策略的安全性,我们选择的是纯自研,从零搭建一个量化回测系统(实盘再说,关乎钱的事情,个人觉得还是自己做决策为宜

2、从零教会大家量化投资,在ETF,可转债,股票,期货,加密市场等不同的投资标的,如何做出从零做出一个或更多可以交付实盘,可盈利的策略

简言之,开发并长期维护一套开源系统,在开面做出可盈利的策略集

群里大家都很积极,后续考虑招募管理员,核心开发者,社群运营,线下活动组织,资源交换等,欢迎大家关注。

图片

解答一些疑问:

少数同学只关心可用的策略。我也关注到,很多量化平台,都会提供策略出租服务,价格一般是月租,不便宜。——我还是希望让大家学会自己迭代策略,自己会优化,甚至自己开发自己合适的。策略是针对不同风险偏好的,而且并不会一劳永逸。若仍然还有同学有这样的需求,我们后期也可能考虑策略市场之类的。

大家关注的文档,教程,有在准备,但着实精力有限,所以,考虑招募一些兄弟姐妹一起。

关于策略开发:

之前在某ETF软件上看到对策略的归类:大类资产配置、轮动、择时以及策略组合。组合不算一种策略的话,由易到难,是大类资产,轮动,最后是择时,可以择时最符合人性和直觉。

大类资产往往走长线投资,做做再平衡就好。大资金量做好这个配置就差不多了。

轮动呢,回测上符合逻辑,就是没有预测市场,而是找出当下最优的,截面比较。比如可转债双低,或者动量轮动。就是市场下一步怎么走不知道,但现在来看,A比B性价比更高,或者趋势更强,那取更强的总没错。

轮动需要基于一个“锚”。比如估值的锚,可转债比较好做在于,债是有底的。估值是左侧交易,判断位置而不是方向。

另外就是要有清晰的金融投资逻辑做支撑。比如景气度,动量趋势等等。好比基金经理过去行,不代表未来就行。因子也一样,价值前几年很牛,那价值因子相关的都很强,风格转到小市值,结果就不一样,而且回测的周期跨度可能超过10年,几种风格都轮一遍。如果挑其中一种因子,可能实盘结果会不好。

而择时,在时间序列上低买高卖。

吾日三省吾身

看到一句话:人总要咽下一些委屈,然后只字不提——生活、工作不易,且行且珍惜。

好的心态:凡事发生必有利于我,这件事想教会我什么?

1、担心温水煮青蛙,无他,在组织里没有什么岁月静好,你要有独一无二的价值,以换取回报。这个价值点也是风云变幻的市场立足的根本。—当下最热的是什么?大模型

2、尽量自动化你的业务,才有时间追逐更大的梦想。自动化技术栈,大模型等,自动化交付价值。

今天继续bt框架之应用、改造与解读,目前看,把bt框架融合进来,是一个正确的选择。

原因:

1、我们之前的“积木式”模块化,本身与bt理念就是一下的,学习成本与改造代价很低,很多拿过来可以直接用。

2、bt本身比较成熟,交易手续,滑点,它的报表,可视化,指标都比较完善,这一块之前打算自研,还是有不少细节要处理。

3、亮点功能:多策略,得益于它的树形结构,它可以同时跑多个策略,性能很多(cython加持)。

如下代码,一次定义并运行三个策略效果对比一目了然(之前我的做法是把三个策略运行后,结果保存起来综合对比,这是无奈之举,bt框架完美的解决了这个诉求):

图片

df_factor = df[['symbol', factor_name]]print(df_factor)stra_name = '大小盘动量轮动'strat = engine.Strategy(stra_name,                        [                            #RunMonthly(),                            SelectTopK(df_factor=df_factor, factor_name=factor_name,K=1, b_ascending=False),                            WeighEqually(),                            Rebalance()                        ]                        )s2 = engine.Strategy('等权买入-再平衡',    [        RunMonthly(),        SelectAll(),        WeighEqually(),        Rebalance()    ])s_bench = engine.Strategy('基准-沪深300000300',    [        SelectThese(tickers=['000300.SH']),        WeighEqually(),        Rebalance()    ])bkt = engine.Backtest(strat, df_close,integer_positions=False)bkt2 = engine.Backtest(s2, df_close,integer_positions=False)bkt_bench = engine.Backtest(s_bench, df_close,integer_positions=False)res = engine.run(bkt,bkt2,bkt_bench)

 

图片

algos_extend.py是我扩展的模块,主要是把topK算子,这个我们在轮动策略里用得很多的,迁移过来了。

代码在如下位置,大小盘轮动的notebook里,有上述多策略的演示:

图片

今天的一些主要工作成果:

1、按5天(周调参)对因子ic进行排序。

2、对多个因子进行回测比较。 

3、alphalens-reloaded比较 波动率与量价背离等因子的 ic分析细节。 

4、pycaret机器学习模型应用于量化(vs autogluon 高精度调参)。

昨天对于因子进行了异常值、因子归一化等,计算量增加不少,但结果并没有特别大的变化。之前我们是综合计算了多个周期,比如1,5,10,20天,今天我们就按照5天(按周调仓)的模式来对比下。

ic值排在前面的仍然提“量化背离”的CORD30,60。

图片

下面我们直接来回测比较一下:

CORR20是IC比CORD30和CORD60都小一些。但从实际回测的结果看,CORR20效果最好,CORD60效果最差。而IC值倒数的STD60呢,结果也还不错。

————这里需要仔细分析,也间接证明IC分析容易出错的地方。

同一个因子,比如CORR20,取前10%与后10%,这个分层测试基本是单调的,说明这个因子是可以把好坏股票区分出来。

而IC是相关性的均值,这个均值可能存在波动性。横向对比的单调性就不好说了。因此我们需要进一步仔细分析std60的因子情况。

图片

使用alphalens-reloaded这样库来分析:

STD60的收益率分析很高,但ic很小。这个说明什么问题呢,这就是IC分析与收益率分析结果不一样如何决策的问题了。

设𝑋,𝑌为两个向量,则  ,其中  为线性回归  或线性回归  的可决系数(其中𝑎,𝑏是待回归系数)。 

也就是说IC值是可决系数。IC越大,则收益预测越有效。

reg_fit = OLS(y, x).fit()
try:
    alpha, beta = reg_fit.params
except ValueError:
    alpha_beta.loc['Ann. alpha', period] = np.nan
    alpha_beta.loc['beta', period] = np.nan

因此,IC值代表因子收益的稳定性,如果IC值高,且预测收益也高,这就是好因子。STD60明显就是回测收益很好,实盘可能很有问题的逻辑。

这是CORR20:

图片

CORD30:

图片

CORD60:

图片

STD60:

图片

吾日三省吾身

关于焦虑或者其他烦心之事,我自己当前的一个观感,时间是最好的解药

事缓则圆,说的就是这个道理。我们担心的事情,99%并不会发生,剩下那1%,就算真的发生了,也并没有我们想象中的严重,我们都能从容应对。

反而,一些黑天鹅事件,比如蔡磊的渐冻症,这种是没有办法,没有理由,那么他只能从容面对。

另外,就是长远的目标,要令人兴奋,但要可努力,通过努力基本可达的目标。你能专注自己想做的事情,且能看到进步,那么很多焦虑就会自动消散。

代码均已同步至星球:

图片

 

 

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103950
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 29 日
下一篇 2024 年 7 月 29 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注