10行Python搞定可转债分组回测

因子回测的文章发出后,又有几个朋友跟我要代码,写篇小文回复一下。

先直接给出代码,这次比上次的回测更简单,只要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

wmg73

赞同来自:

点赞无私分享
2021-11-25 23:21 引用

要回复问题请先登录注册

发起人

问题状态

  • 最新活动: 2021-11-28 12:01
  • 浏览: 14018
  • 关注: 284