前段时间一直忙于日常择券工作,也在建一个方便快速感知现券市场的债券网站,断更了两个多月,今天分享很早之前做的一个小部分,尽量用最简洁的代码和最易懂的方式讲述出来。
债券市场的智能化实在是太落后了,连最简单的成交数据和报价数据都无法很轻松的以Excel格式获得,更别说基于这些数据的分析工作。本篇第一部分先介绍一下对成交数据TXT转换成Excel格式的处理,第二部分介绍如何利用python里的wind函数获取所需要的数据,第三部分讲怎么结合自己投资需求选券。
一、处理成交TXT数据为Excel格式
一般我们得到的数据是这样的TXT格式,如何把他转变成非常好看且实用的Excel数据,其实非常简单,只需要几句核心代码就够了。代码如下,1-4句都是导入相关模块,第5句是读取成交数据TXT文件的代码,第6句是将成交数据分成一条一条的list格式,这样每条数据就都放在一个list里(如果报错可以修改decode里的内容,这个和每个人TXT的默认编码格式相关)。第7-8句是处理重复的空格行问题,无实质意义。第9-13句就是将每天成交数据按照空格去分开,这样得到的格式就是我们想要的dataframe格式,然后第14句输出到Excel就可以了 。
最后处理完的格式就是下图,再改下列名就可以了。
二、利用python中的wind函数模块处理上述数据
上面得到的数据其实还比较粗糙,有时候还需要加工成我们想要的数据,比如上述数据没有发行人名称,我想看同一个主体的成交情况或者报价情况,无法筛选。又比如上述数据虽然有期限,但是没办法进行降序或者升序排列,我想看某个期限内的成交有点困难,或者我想看偏离中债估值的幅度情况对比,也实现不了。当然我们也可以先把他们导出到Excel,再用Excel中的wind函数,但我仍然觉得很麻烦而且不够智能,python里的wind模块其实都可以解决这个问题,只要Excel里的wind能解决,python里的wind函数也基本都能想法设法去解决。
接上面代码,首先python里的wind函数也是以债券代码作为唯一参数(和Excel一样),15句取出债券代码,先去重再转变成list格式,之所以要去重,是因为每天的成交数据可能有一个券发生多笔成交,同时wind函数对重复的代码参数会报错,所以用个drop_duplicates去重,也不影响我们想要的结果,此段代码都是为了获取该债券的相关信息。16-19句都是处理时间格式,python里的时间格式特别讨厌,这段都是为了将前一个交易日的时间格式处理成wind能识别的格式,16句是产生今天的日期格式,同时处理成wind能识别的格式,为了17句能取出前一个交易日的日期格式,18和19句就是再次处理成wind能识别的格式(多用几次wind函数就明白了这里的用途,python里的wind函数是需要带日期参数,比如我想取估值,最晚只能取到昨日的,所以需要变换一下),20句是核心,就是利用债券代码作为参数,取出该债券的相关信息,我这里只是取了几个我自己需要的信息,这里可以取条款等基本信息也可以取财务信息。
实际上第20句的内涵非常丰富,功能很强大,需要多想妙招去挖掘,毕竟很多功能不能一部到位,需要灵活处理。这里举几个巧妙的例子,比如我们想按债券剩余期限排序,由于有含权债的存在,而wind函数取出的剩余期限是到期期限,而非行权期限,但是我们在买卖券的时候,期限较长的券实际上是按照行权进行谈价格的,比如2.8+2年的实际上是按照2.8年去谈价格,而我们刚才取出的数据里时间格式如果是短融,又会以D(如263D)和休1这种呈现,当然有好几种方式可以将他们处理成可以排序的格式,比如用正则把无关信息去掉,再除以365转换成年数,比较麻烦,我目前找到的比较简便的是,取出他的termnote(特殊条款说明),再取字符串前6位就正好能把剩余年限取分离出来。
再比如我要求出成交偏离幅度,碰见行权债,一个成交价格到底是行权价还是到期价,TXT数据并不会指明,这实际需要来自日常的经验,一般的规则是,看这个价格离哪个估值更近,就是按哪个成交的,比如18粤科02周五是按照3.85%成交的,行权估值和到期估值分别是3.87/4.21,那么这个3.85%就是按照行权成交的。我们知道这个判断方法后,如何计算机实现,就需要自己设计方法,这里不再细讲,代码如下(修改了部分列名,可根据习惯命名):
这里用到了正则和列表推导式,可以细学下这两个特别强大的知识,几乎可以解决很多复杂的问题,最后一句就是求偏离的幅度,考虑了行权债的问题。
三、如何结合自己的投资需求
成交数据可用来观测历史的情况,报价数据用来择券,虽然XX软件可以很方便的按照各种期限、品种、收益率和估值筛选出报价数据,但仍然需要查看自家公司的内部评级来匹配,一来二去,券一多就会非常耗时耗力,可以考虑将所有报价数据定时收集起来,匹配内部评级和投资策略,直接筛选可买卖的券,这块不再细讲了。
![17fe6129653349458e160010c63a511e.png](https://i-blog.csdnimg.cn/blog_migrate/3e4671f9e80489db3fc52e0b1c11dd17.png)
![1c82af86c6f21d0862a31a2eeea89c98.png](https://i-blog.csdnimg.cn/blog_migrate/0737826e75feefde38721c05d0c5897c.png)
![f56326249fcf0b186a352e9815cd7d62.png](https://i-blog.csdnimg.cn/blog_migrate/31ba592c4b9d62eafd147dee34c1ef9a.png)
![b8f56d27bb05b22cb61e89087d405643.png](https://i-blog.csdnimg.cn/blog_migrate/4f350e851f945d418fa1d31d143b7275.png)
![1e91e696cb994e4eafb651f690b7cf6e.png](https://i-blog.csdnimg.cn/blog_migrate/cf2222de49cbf94f4c2be89110cc12c9.png)