因子回测的文章发出后,又有几个朋友跟我要代码,写篇小文回复一下。
先直接给出代码,这次比上次的回测更简单,只要10行就可以了。
在运行本文中的代码前,我假定你已经搞定了上一篇中回测代码的运行,本文中用到的数据与上一篇中完全相同,你需要根据上一篇的内容,先自行构造出premdf(溢价率因子)与day_return( 向前移一天的日收益率)两组数据,具体细节这里不再重复了。
接下来对代码逐行做下解释:
1、定义一个叫group_analysis的函数,需要传入以下参数:因子表factor;收益率表forward_return; 分组数num, 默认为5; 绘图标题, 默认为空。
2、这里用到了pandas自带的两个函数,先用rank函数处理每行数据,得到从小到大排列的序号;再用qcut函数把得到的序号分成5组(实际是num组,为简化描述,后面按5组表述)。这样我们就得到了一张表,这张表的所有值都是1、2、3、4、5或NaN, 代表了它每天属于哪一个分组,NaN表示没有上市交易或已退市。
3、定义一个叫result的表,用来保存计算结果。
4、从1到5循环计算
5、算出每组的平均日收益率序列
6、将每组的平均日收益率序列保存到结果表中,列名为组号
7、计算所有转债的平均日收益率序列并保存到结果表中,列名为base
8、把收益率加1后逐日连乘,就是你们喜闻乐见的净值曲线了,画张图展示
9、把结果表返回一下,方便后面做其他计算
10、以上9行写完了函数,最后一行就是用法,把premdf和day_return传进去,再指定画图标题是“溢价率”,就得到了如下的结果。如果你想分析别的因子,只需要把因子表换一下就可以了。
不多不少,正好10行,需要的拿走。
《20行Python搞定可转债回测》
https://mp.weixin.qq.com/s/ZGth6LLZZQYkpvY11W20Pw
《转债因子全回测》
https://mp.weixin.qq.com/s/RRFpmluNbvR4LPSviCEYaA
《转债因子全回测-续》
https://mp.weixin.qq.com/s/7YsfrGLbfQgSxopwsIWx-A
先直接给出代码,这次比上次的回测更简单,只要10行就可以了。
def group_analysis(factor,forward_return,num=5,title=""):
cutfactor=factor.rank(axis=1).apply(lambda x:pd.qcut(x,num,range(1,num+1)),axis=1)
result=pd.DataFrame()
for group in range(1,1+num):
group_return=forward_return[cutfactor==group].sum(axis=1)/(cutfactor==group).sum(axis=1)
result[group]=group_return
result['base']=(forward_return[~factor.isna()]).sum(axis=1)/(~factor.isna()).sum(axis=1)
(result+1).cumprod().plot(figsize=(12,5),grid=True,title=title);
return result
group_analysis(premdf,day_return,title="溢价率");
在运行本文中的代码前,我假定你已经搞定了上一篇中回测代码的运行,本文中用到的数据与上一篇中完全相同,你需要根据上一篇的内容,先自行构造出premdf(溢价率因子)与day_return( 向前移一天的日收益率)两组数据,具体细节这里不再重复了。
接下来对代码逐行做下解释:
1、定义一个叫group_analysis的函数,需要传入以下参数:因子表factor;收益率表forward_return; 分组数num, 默认为5; 绘图标题, 默认为空。
2、这里用到了pandas自带的两个函数,先用rank函数处理每行数据,得到从小到大排列的序号;再用qcut函数把得到的序号分成5组(实际是num组,为简化描述,后面按5组表述)。这样我们就得到了一张表,这张表的所有值都是1、2、3、4、5或NaN, 代表了它每天属于哪一个分组,NaN表示没有上市交易或已退市。
3、定义一个叫result的表,用来保存计算结果。
4、从1到5循环计算
5、算出每组的平均日收益率序列
6、将每组的平均日收益率序列保存到结果表中,列名为组号
7、计算所有转债的平均日收益率序列并保存到结果表中,列名为base
8、把收益率加1后逐日连乘,就是你们喜闻乐见的净值曲线了,画张图展示
9、把结果表返回一下,方便后面做其他计算
10、以上9行写完了函数,最后一行就是用法,把premdf和day_return传进去,再指定画图标题是“溢价率”,就得到了如下的结果。如果你想分析别的因子,只需要把因子表换一下就可以了。
不多不少,正好10行,需要的拿走。
《20行Python搞定可转债回测》
https://mp.weixin.qq.com/s/ZGth6LLZZQYkpvY11W20Pw
《转债因子全回测》
https://mp.weixin.qq.com/s/RRFpmluNbvR4LPSviCEYaA
《转债因子全回测-续》
https://mp.weixin.qq.com/s/7YsfrGLbfQgSxopwsIWx-A
0
我怎么觉得你才是那个锤子呢?我哪句话说了楼主无私分享有错了?楼主的分享我也很敬佩好吧。请您就事论事,不要随意脑补别人的话,然后把自己装得像个锤子对着想象出来的钉子一通乱敲。怕你再脑补,最后很明确地再声明一次,对于楼主的无私分享,我不持任何反对意见和不敬,仅仅对于代码行数这个问题表示不认同。
0
我只是说了一个事实而已,Python最大的有点是包多库多,资源共享,可以大大提高编程效率,但是不代表语言更简洁,逻辑更有效,运行更通畅,如果非要比行数,我也写个包封装一个函数,然后另一个程序里调用一下,那我是不是可以吹嘘我一行代码搞定?你有意见可以说出来听听你的观点,只是这样空洞的反讽说明不了啥问题。
7
chineseumi - 中国海 · 全栈基金经理
赞同来自: genamax 、圆月风沙 、海浪9999 、v3kk2 、gztom 、 、更多 »
给你点个赞。你的分析验证了我之前一个经验性的判断,转债的投资性价比最高的也是相对最朴素的三个方向。
1. 双低:防守反击,利用转债下有保底,上不封顶的特性(强逻辑)
2. 低溢价:利用转债T+0、涨跌幅限制少以及相对股票打折的特性(强逻辑)。同时股票的动量因子(弱逻辑)
3. 低价:利用纯债+最便宜的虚值看涨期权+最便宜的下调转股价期权。(强逻辑)
这三个夏普>1.5, 低价的债性策略虽然收益低,回撤也低,对回撤更敏感的机构可以考虑。
而对于广大散户,做双低和低溢价都是不错的策略。
不过确实要考虑存在滑点的问题,轮动时卖一般还好,买入操作一不小心滑点可能在0.5%甚至更高,可能实盘会有一定甚至较大的偏离!
1. 双低:防守反击,利用转债下有保底,上不封顶的特性(强逻辑)
2. 低溢价:利用转债T+0、涨跌幅限制少以及相对股票打折的特性(强逻辑)。同时股票的动量因子(弱逻辑)
3. 低价:利用纯债+最便宜的虚值看涨期权+最便宜的下调转股价期权。(强逻辑)
这三个夏普>1.5, 低价的债性策略虽然收益低,回撤也低,对回撤更敏感的机构可以考虑。
而对于广大散户,做双低和低溢价都是不错的策略。
不过确实要考虑存在滑点的问题,轮动时卖一般还好,买入操作一不小心滑点可能在0.5%甚至更高,可能实盘会有一定甚至较大的偏离!