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
1

张霸气

赞同来自: TimothyJ

这个因子分组回测很有指导意义。
以pb为例,有的人为了降低风险会加上正股pb这个因子,而你的回测表明这个因子影响不大,烂股好债是有道理的。
2021-07-17 10:41
1

攒钱之后买点啥

赞同来自: 何处得秋霜

收藏了 最近正好想学习一下这方面
2021-07-17 10:48
0

唔系大虾

赞同来自:

2021-07-17 11:01
0

阿学

赞同来自:

2021-07-17 11:09
0

smairdue

赞同来自:

学习
2021-07-17 11:15
0

tongzhangji

赞同来自:

学习
2021-07-18 11:19
0

overandover

赞同来自:

学习,谢谢!
2021-07-18 12:33
0

猥琐发育

赞同来自:

python 什么版本编写的?
2021-07-18 12:48
0

z7c9

赞同来自:

分组回测
2021-07-18 13:35
0

v5r10 - 永远满仓,永远热泪盈眶

赞同来自:

这个代码要在什么回测平台运行啊
2021-07-18 14:14
0

体能狂魔

赞同来自:

关注,谢谢楼主
2021-07-18 18:44
0

haha00111

赞同来自:

学习mark
2021-07-18 21:00
1

xilianpa

赞同来自: 何处得秋霜

虽然看不懂,感觉很NB的样子。
2021-07-18 21:53
0

northpole

赞同来自:

@wanghc02 1-5的线是代表5个分组?那分组的定义是怎么得来的呢?比如Rank 100个,1-20组1,21-40,组2?这样类推?
2021-07-20 15:29
7

chineseumi - 中国海· 全栈基金经理

赞同来自: genamax 圆月风沙 海浪9999 v3kk2 gztom tangzheci 你猜再猜更多 »

给你点个赞。你的分析验证了我之前一个经验性的判断,转债的投资性价比最高的也是相对最朴素的三个方向。
1. 双低:防守反击,利用转债下有保底,上不封顶的特性(强逻辑)
2. 低溢价:利用转债T+0、涨跌幅限制少以及相对股票打折的特性(强逻辑)。同时股票的动量因子(弱逻辑)
3. 低价:利用纯债+最便宜的虚值看涨期权+最便宜的下调转股价期权。(强逻辑)
这三个夏普>1.5, 低价的债性策略虽然收益低,回撤也低,对回撤更敏感的机构可以考虑。

而对于广大散户,做双低和低溢价都是不错的策略。

不过确实要考虑存在滑点的问题,轮动时卖一般还好,买入操作一不小心滑点可能在0.5%甚至更高,可能实盘会有一定甚至较大的偏离!
2021-07-25 23:14修改
0

和气生财

赞同来自:

2021-07-25 23:37
2

Campanella

赞同来自: kite00 vmasonv

数据才关键,然而并没有
2021-07-26 08:16
0

姆希塔良

赞同来自:

如果用机器学习的方法,对可转债进行分类,打分的现实意义是否可行?
2021-07-26 12:39
0

id就是个id而已

赞同来自:

不错
2021-07-26 13:33
0

大卫1988

赞同来自:

您好,请问下,低溢价策略的最大回撤是多少?
2021-08-01 17:30
13

ylxwyj

赞同来自: dhhlys 鸣天 magelfly dingo49 AC_DC 大道之行也 Syphurith genamax 蓝色坚韧球 neverfailor wanghc02 newbison 好奇心135更多 »

@wanghc02 楼主好。

今天看了你的发帖和公众号的文章,顺便就用你给的数据跑了一下。我有个想法,在统计各策略的夏普比率的时候,是否用信息比率比夏普比率看得更清楚一些?

根据你给的数据,我跑了基准(等权重指数)、低溢价、双低和低价格;从Alpha的角度看,似乎双低比低溢价更稳健,但目测最大回撤方面,双低似乎还不如低溢价。详情如下:


2021-08-01 19:35修改
0

dhhlys

赞同来自:

关注!
2021-08-02 02:23
0

飞鹰大侠

赞同来自:

mark
2021-11-23 15:51
0

AC_DC

赞同来自:

mark
2021-11-23 16:34
5

静静绽放的幸福

赞同来自: eugeneshi 自动化交易机器 Quamarine 趋势交易者 niming湖更多 »

写程序,一味强调行数除了装逼,没有任何意义。
2021-11-23 18:50
0

cdiy104

赞同来自:

确实要用更好的武器武装自己!
2021-11-25 21:43
0

雨后小晴

赞同来自:

关注
2021-11-25 21:56
7

神圣的猫

赞同来自: lehehe 开心一笑888 秘密就不告诉你 tangla26 zhangbin1008 laoshihao GLZ0514更多 »

一脸懵逼的进来,一脸懵逼的出去...
2021-11-25 22:06
0

wmg73

赞同来自:

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

可转债简讯

赞同来自: 我向往的自由

我最佩服的就是“趋势交易者”和“静静绽放的幸福”的评论,短短几个字,就让我看出来他们应该是这个论坛最厉害的人!真想给你们发个奖状!
2021-11-26 12:45
0

静静绽放的幸福

赞同来自:

我只是说了一个事实而已,Python最大的有点是包多库多,资源共享,可以大大提高编程效率,但是不代表语言更简洁,逻辑更有效,运行更通畅,如果非要比行数,我也写个包封装一个函数,然后另一个程序里调用一下,那我是不是可以吹嘘我一行代码搞定?你有意见可以说出来听听你的观点,只是这样空洞的反讽说明不了啥问题。
2021-11-27 18:07
39

可转债简讯

赞同来自: charlies 如_佛 金色闪光 syuu 超车不翻车 钮钴禄茜央娜迪 laplace 李季峰 连眉大侠 wolfcaaa 慕容吹雪 gh888 Alexrus 氵氵氵 hzy7413 骑蜗牛士 Tryit2021 数据矿工 兔子王 xdynaudio skemc sdq5201 Ake90 bossnk qkyh_yxb linfeng 等待_等待牛市 mqs0899 shiro1234 一片小树林 研究方向 北冥有鱼L shanxifenjiu haohaoxuexi shplhy 持有封基 rener 缘悭一面525 GLZ0514更多 »

谁在吹嘘?谁在一味强调?人家写了文章,愿意无私分享出来,到你这就变成了一味强调?人家十行代码能实现,还非得把标题改成一百行?你要是能写一个函数分享出来,让大家能一行代码直接调用,这时候别人说你一味强调你愿不愿意?看别人像个钉子,就不知道照照镜子看自己像不像个锤子?
2021-11-27 20:53
1

comepu

赞同来自: 趋势交易者

用了好多年还是有点接受不了python的强制缩进语法,我喜欢php的混乱
2021-11-27 21:33
57

wanghc02

赞同来自: 占位符 小番茄黄瓜 hydk 甘泉 quantech darklifes IMWWD 明园 北冥有鱼L hzy7413 bigfish1006 mawei8888 钮钴禄茜央娜迪 hannon 王总 浪花1990 gxyc bhysz ppppp74 adodo 集XFD 语晕晕 bossnk newbison 塔格奥 本德莱耀西 wygd1 昕哲 巴兰 izhangmh Tryit2021 骑蜗牛士 llqzxh 奇乐文化 haohaoxuexi magelfly shplhy 抖腿狂魔 vickydai tongzhangji 帕先奴 背着行囊去远方 二零20大吉大利 包包123 面包 dhhlys Ake90 linfeng 等待_等待牛市 atu321 wolfcaaa uime jackymin001 钟爱一玉 GLZ0514 传达室李老伯 Aspirin更多 »

没想到纯分享的东西也会有人怼,没想怼回去,只想对挺我的集友说:不值得浪费时间争论。集思录有宝藏,也有垃圾,遇到宝藏认真研究,遇到垃圾绕道走就是了。大家都时间宝贵,辩个是非曲直耽误赚钱。
2021-11-27 22:13
0

静静绽放的幸福

赞同来自:

我怎么觉得你才是那个锤子呢?我哪句话说了楼主无私分享有错了?楼主的分享我也很敬佩好吧。请您就事论事,不要随意脑补别人的话,然后把自己装得像个锤子对着想象出来的钉子一通乱敲。怕你再脑补,最后很明确地再声明一次,对于楼主的无私分享,我不持任何反对意见和不敬,仅仅对于代码行数这个问题表示不认同。
2021-11-28 01:32
1

静静绽放的幸福

赞同来自: 李季峰

再说一句,集思录是开放自由的平台,遇到好的东西表示赞赏,遇到不认同的东西难道还不能说了吗?如果只能说好听的,不能有实事求是的观点,那还需要交流什么,直接禁言就是了。您的观点我也很明白,无非就是楼主无私分享已经很不容易了,你们两个还在那里说风凉话吧啦吧啦,可是问题在于我并没有对楼主的分享表达反对意见啊(这只是您自己脑补出来的),所以,您的锤子敲错地方了,大哥。
2021-11-28 01:44
0

我向往的自由

赞同来自:

非常感谢,虽然我看不懂。
2021-11-28 05:41
2

jimmyhuo

赞同来自: 可转债简讯 攻守转债

邀请绽放也来写一段试试。
2021-11-28 09:03
0

静静绽放的幸福

赞同来自:

楼主说的对,争吵无益,本来就是闲来无事逛逛论坛,遇到些东西有点想法就随口一说,没想到惹起这么大风波,算了,不说了,我还是闭嘴吧。感谢楼主分享,我也不是故意找事,和气生财。
2021-11-28 12:01

要回复问题请先登录注册

发起人

问题状态

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