今天的一些主要工作成果:
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%,就算真的发生了,也并没有我们想象中的严重,我们都能从容应对。
反而,一些黑天鹅事件,比如蔡磊的渐冻症,这种是没有办法,没有理由,那么他只能从容面对。
另外,就是长远的目标,要令人兴奋,但要可努力,通过努力基本可达的目标。你能专注自己想做的事情,且能看到进步,那么很多焦虑就会自动消散。
代码均已同步至星球:
今天继续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('基准-沪深300(000300)', [ 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里,有上述多策略的演示:
已经发布到星球:
吾日三省吾身
昨天睡得不错,因为一个工作中一个纠结好久的项目,终于有人来帮忙。尽管看起来仅算是帮忙,但终归有不小的进展。
有因此小事而困扰,格局还是需要提升。
人生之意义是自己赋予了。
有人觉得城市喧嚣好,有人认为田园风光好。
自己舒服就好。
一个好的状态是“做时间的朋友”。就是你做的事情,你布的局,时间对你是有利的,你就是时间的朋友。
好看的皮囊就不是时间的朋友,因为容颜终会老去。
读过的书,走过的路,经历过后的反思。
时间会解决很多问题,或者说是一切问题。
如果你是时间的朋友,一切就会越来越好。
成功是多因素的综合态,成长是自己可以努力的变量。
投资理财能力、阅读与深度思考,健康的生活习惯,写作沉淀有价值的内容,这些都是时间的朋友。
格局大了,就不必也不会在意蝇营狗苟,之于烂人烂事,最好的方法,莫过于无视。
时间的朋友会解决一切。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103958
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!