进行股票量化回测,面临的第一个坑就是数据坑——首先你得有数据,才能进行下一步工作。
在股票数据坑中,有一个很大的坑叫做股票的复权价格。
如果一个股票公告说进行分红、配股或者送转,那么这只股票就被赋予了权利,这时股票是含权的,我们说的除权、复权里的权就是权利的意思。
当一个含权的股票在权利被具体实施后,就要进行除权。
例如含有10转10权利的股票,在实施送转前股价是100¥,总共1亿股本;实施10转10之后,总股本变成了2亿,如果股价保持不变,相当于市值凭空多了一倍,所以这时候要除权——股数翻倍,股价减半。
除了除权还有除息,息就是股息红利的意思。
一个简单的例子,一家公司有1亿股,股价是100¥,这个时候公司的总价值是100亿,准备每股给股东派现10¥,每股送出去10¥之后,公司的总价值会变成90亿,而股数不变,所以这个时候要除息,股价变成90¥。
除权除息之后,股价里不再包含送转、股息。如果不进行处理,股票价格在除权那天就会平空出现一个缺口——缺口之前是包含送转、股息的股票;缺口之后是不包含送转、股息的股票。
为了修复这个缺口,消除这种不连贯,就产生了一种操作,叫做复权。简单来说,复权就是让股价重新含权含息,以保持股票价值的连续性。
复权的方法主要有两种,一种是保持最初的股价不变,后面的股价在此基础上做加法,称为后复权;一种是保持当前的股价不变,前面的股价在当前股价的基础上做减法,称为前复权。
平时大家看的一般是前复权价格,这样能保证当前价格和实时价格是一致的,而且又能保证K线涨跌幅的连贯性。
不过前复权方法也分为很多种,在普通的看盘软件上,看到的都是前减复权——把当前的股价固定,前面股价是减去现金分红和流通股变动比例之后的数值。
如果一只股票分红次数比较多,做减法之后,减着减着股价就变成负数了,例如贵州茅台,经过前减复权后,2005年的股价是-30多元——
价格是负的,对着图形看看整体走势还可以,难以用来回测。
后来,有人搞出了涨跌幅复权法——
这种复权方法的详细说明有很长。
简单来说不再是做加减法,而是做乘除法,这样股价永远是正的。也能反映出分红送转的占比情况,保证复权后K线的连续性。在万得股票软件中,用的复权方法就是涨跌幅复权法。前复权之后贵州茅台的股价是这样的——
现实生活中,你有100W,资产增加了20W,你可以说你身价增加了20W;如果你有20W,资产同样增加了20W,你可以说你的身价增加了20W,但是你可以说你的身价增加了一倍——虽然都是20W,但更深层次而言,两个20W不是同一个概念。
很显然,回测中用万德数据的复权方法,在计算具体收益率时比较科学。
聚宽作为国内领先的量化平台,在数据方面自然也有独到之处。
我用聚宽平台提供的JQData采集了一下股票数据,发现聚宽的前复权股票价格用的应该也是类似涨跌幅复权的方法。
调用方式很简单:验证用户信息后,直接用get_price函数获取即可,还可以根据需要设置要获取的字段——
获取到的数据是DataFrame类型,如下——
获取到以后,直接可以进行存数据库、存文件等本地化处理,非常方便。
进行回测时,除了用复权数据之外,还可以考虑用原始股价。用原始股价,同时得需要股票的分红信息——在分红除权时,把分得的红利、送转等信息考虑进去。
股票价格只是聚宽数据中的一部分,股票基本面数据,各种因子数据聚宽都有提供,还包括指数数据、期货数据。总体来说,聚宽JQData提供的数据还是比较靠谱的,本地化后用来做些统计分析还是比较方便的。
很高兴能看到一个这样开放的平台。