引言:
邢不行的系列帖子“量化小讲堂”,通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助。
【必读文章】:《10年400倍策略分享-附视频逐行讲解代码》
【历史文章汇总】:https://bbs.pinggu.org/thread-3950124-1-1.html
微信个人号:xingbuxing0807,有问题欢迎交流
量化投资中,计算技术指标时常见的8个坑(下)
05
数字货币市场中数据之间的时差
数字货币是7*24小时交易,不同地区的交易所会显示不同的时区。那此时我们就要特别注意,我们自己数据的时区和交易所行情数据显示的时区是否一致。
比如币安交易所,它的主流用户在中国,所以网页上显示的数据默认是就是北京时间。但是如果你使用接口去抓取币安的K线数据,它使用的却是UTC时间,也就是英国的格林威治时间。
那么此时当你计算技术指标的时候,使用的是UTC时间,很明显就会和交易所页面上显示的UTC+8的指标数据对不上了。
此时的应对方法就是修改交易所页面展示数据的时区,一般交易所都提供这个功能。下图是在bitfinex交易所修改时区的方式,右下角点击UTC时间,就会弹出选择时区的框框。
06
数字货币数据缺失
数字货币市场中有无数的“垃圾币”,这些币的成交量很低,经常会在1个小时之内一笔交易都没有。那么面对这样的一个小时,如何来画这一根K线呢?
有的交易所会直接略去这一根K线,把这个时间段给删了。而有的交易所是根据前一根K线的收盘价作为这根缺失K线的开高低收价,同时成交量设置为0来补全这根K线数据。
例如下图中的K线,大家看到一些横线,就是代表这根K线的时间内,没有发生一笔交易。
那么对于没有交易的K线数据,我们要确保,我们数据中的处理方式和交易所是一样的,不然计算得到的技术指标就会不一致。
07
同一技术指标的计算方法不一样
大部分的技术指标都是源于国外,在翻译的过程中难免有些不准确,还有可能夹带着主观思想。因此经常会发现,同一名称的技术指标,在不同的地方,采用的是不同计算方法。
比如TA-lib库计算的ATR指标和国内主流行情软件中显示的指标就是不一样的。因为他们计算方法不一样。
国内行情软件一般是取TR(真实波幅)的简单平均,而TA-lib则是采取类似EMA平均一样的方法求TR的平均值。
通达信行情软件中计算ATR的公式如下图:
那TA-lib库计算ATR的公式是什么样的呢?通过深挖TA-lib库的底层代码发现这么一个注释:
talib.ATR的作者Wilder采用了移动平均的概念来使每一个新的ATR都包含前一个ATR的信息:ATR(t)=(ATR(t-1)*(Period-1)+TR(t))/Period,所以不是简单的算术平均。
这里提到的TA-lib库,在我们之前的量化小讲堂系列文章中有提到过。简单来说就是一个技术分析库,里面包含了大部分主流的技术指标,让使用者不用再重复造轮子。具体可参考之前的文章:
还有的技术指标长得很像,而且计算思路也类似,比如刚刚提到的MA和EMA。MA是简单移动平均线,是根据最近n天的收盘价求算数平均值得到;而EMA看起来和MA很像,英文名字一不小心就看错,它是指数移动平均值,相当于是一个加权平均值,但是它的加权方式很特别,感兴趣的可以自己搜索下,或者加我微信交流。
所以当我们使用其他工具或者自己编写代码计算技术指标时,计算结果和交易所对不上,在排除数据源的问题后,很有可能就是指标的计算公式不一致。
08
特别容易忽视的小差别
同一技术指标的计算除了那些“肉眼可见”的区别之外,还有很多不容忽视的坑。
比如我们熟悉的布林线指标,在计算其中的标准差的时候,有的地方分母是使用的样本数,而有的地方采用的是样本数-1。
再比如很多指标在选择数据的时候,有的取包含今日在内的过去n根K线数据,有的取不包含今日数据的前n根K线。这样计算出来的结果显然是有差别的。
这些细小的差距对结果的影响不大,但差距又确实在那。往往会让你花很多时间去寻找为什么不同,最终发现的时候只给你带来一句:卧槽...
09
总结
以上分析了计算指标和行情软件不同的几个原因,都来自于我实际的经验。其中有的可以解决,也一定要解决,不然你的策略结果就是错的。
而有的问题其实也解决不了,比如股票复权之类的问题。面对这种窘境,完美主义者可能会刨根问底且想方设法去找到原因并将其修正过来,但这种方式并不见得是最好的解决方案。
相信我,与其将时间花在这上面不如花更多的时间去研究策略。一般来说,只要确保数据源没问题,以及计算逻辑没错,就可以了。
关于技术指标的计算,还有其他想法的朋友,欢迎在评论区留言。留言还可以获得论坛币哦~