【邢不行|量化小讲堂系列49-实战篇】量化投资中,计算技术指标时常见的8个坑

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xingbuxing_py/article/details/90217116

引言:

邢不行的系列帖子“量化小讲堂”,通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助。

【历史文章汇总】请点击此处

【必读文章】EOS期现套利,一周时间,15%无风险收益

                     10年400倍策略分享(附视频逐行代码讲解)

个人微信:xingbx007,有问题欢迎交流。


量化投资中,计算技术指标时常见的8个坑

                                                                         这是邢不行第49 期量化小讲堂的分享

“我自己计算的指标,跟同花顺给出的指标值差别很大,这是什么情况?”

“talib计算的指标和很多主流平台也不一样……很好奇参数相同为何差别这么大?”

“有人算过macd指标吗?算出来和wind提供的数值相差有点多呀。”

以上问题都来自我量化课程答疑群里的小伙伴。

我们在做量化交易的时候,经常会自己编程计算一些技术指标。计算完之后为了验证准确性,会和行情软件上的数据进行对比,此时往往会发现有差别,就会产生以上的疑问。

那么这些差异,是什么原因造成的呢?我们应该采用什么样的应对措施呢?本文就列举了几个常见错误,来帮大家避免这些问题。

如果你是根据股票数据计算指标,第一点需要注意的是,你的股票数据是否经过复权处理。

在股票市场里,因为分红派息、拆股送股等原因,股价会发生异常变化。为了消除这些异常变化,大家往往会对股票数据进行复权处理。

以下是亨通光电这个股票的原始价格和复权之后的价格。可以看出,原始数据的K线图中有一个巨大的缺口。

亨通光电原始数据
亨通光电复权后的数据

针对这样的股票,我们在计算指标的时候就要特别留意:我们自己使用的数据是否进行了复权。如果你的数据没有复权,而行情软件使用的数据复权了,那么自然计算出来的技术指标的结果是不一样的。

另外,即使你保证了你的数据和行情软件一样,都经过了复权处理,但你还要注意:你们的复权方式是否一样

因为其实复权方式有不同的计算方法。举个简单的例子,股票分红之后会进行扣税,有的复权方法会计算扣税,有的却不会计算。

即使同样是行情软件,复权方法都会不一样。以下是2019年2月28日贵州茅台这个股票在通达信行情软件和大智慧行情软件的数据对比:

贵州茅台在通达信行情软件  
贵州茅台在大智慧行情软件

从图中我们可以看到,同样的股票、同样的日期、同样的后复权,但最后的数据却不一样。这其实就是两个软件计算复权的方式不一样导致的。感兴趣的可以扒扒它们的计算公式,或者加我微信xingbuxing0807交流。

所以我们要特别留意自己数据的复权方式。如果你的数据和行情软件数据的复权方法不一样,那最终计算出来的技术指标肯定是有差别的。

除了复权之外,我们还要留意股票数据的完整性

很多技术指标,即使用的数据一样,但如果你开始计算指标的时间不一样,最终结果也会差很多。

比如当你刚打开行情软件的时候,由于网络等原因可能导致股票数据加载不完全,它上面显示的技术指标可能是从6个月之前开始算的。

但是你自己的数据是从6年之前开始计算的,两者的开始时间不一样,这种情况就会造成某些技术指标的结果不一样。

当然也有可能是你自己数据比较短,只有最近一部分时间,这样也会造成和行情软件的不一致。

所以,当自己计算的技术指标与交易所显示的不同,那我们要去注意一下两者的数开始时间是否一致。

之前讲了股票,接下来讲讲数字货币。

首先是不要在不同的交易所之间比较技术指标。

数字货币的交易所有几千家。交易所之间的买卖交易是互相独立的,因此它们的交易数据也是各自独立存在而不相干的。

例如,以下两幅图是bitfinex交易所和okex交易所BTC/USDT交易对的K线数据对比。

bitfinex交易所
okex交易所

这两幅图对应的时间段完全相同,仔细观察会发现,两者价格走势接近,但不是完全一样的。所以基于此算出来的技术指标肯定也不会完全一样。

所以,我们在计算指标的时候,千万不要自己的数据是来自一家交易所的,但是却对照着另外一家交易所的行情数据去对比计算出的技术指标,这肯定是不一样的。

数字货币是7*24小时交易,不同地区的交易所会显示不同的时区。那此时我们就要特别注意,我们自己数据的时区和交易所行情数据显示的时区是否一致

比如币安交易所,它的主流用户在中国,所以网页上显示的数据默认是就是北京时间。但是如果你使用接口去抓取币安的K线数据,它使用的却是UTC时间,也就是英国的格林威治时间。

那么此时当你计算技术指标的时候,使用的是UTC时间,很明显就会和交易所页面上显示的UTC+8的指标数据对不上了。

此时的应对方法就是修改交易所页面展示数据的时区,一般交易所都提供这个功能。下图是在bitfinex交易所修改时区的方式,右下角点击UTC时间,就会弹出选择时区的框框。

数字货币市场中有无数的“垃圾币”,这些币的成交量很低,经常会在1个小时之内一笔交易都没有。那么面对这样的一个小时,如何来画这一根K线呢?

有的交易所会直接略去这一根K线,把这个时间段给删了。而有的交易所是根据前一根K线的收盘价作为这根缺失K线的开高低收价,同时成交量设置为0来补全这根K线数据。

例如下图中的K线,大家看到一些横线,就是代表这根K线的时间内,没有发生一笔交易。

那么对于没有交易的K线数据,我们要确保,我们数据中的处理方式和交易所是一样的,不然计算得到的技术指标就会不一致。

大部分的技术指标都是源于国外,在翻译的过程中难免有些不准确,还有可能夹带着主观思想。因此经常会发现,同一名称的技术指标,在不同的地方,采用的是不同计算方法。

比如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库,在我们之前的量化小讲堂系列文章中有提到过。简单来说就是一个技术分析库,里面包含了大部分主流的技术指标,让使用者不用再重复造轮子。具体可参考之前的文章:

1)不用再自己写技术指标了 | TA-lib视频教程

2)建议收藏 | Windows下安装TA-Lib终极教程

还有的技术指标长得很像,而且计算思路也类似,比如刚刚提到的MA和EMA。MA是简单移动平均线,是根据最近n天的收盘价求算数平均值得到;而EMA看起来和MA很像,英文名字一不小心就看错,它是指数移动平均值,相当于是一个加权平均值,但是它的加权方式很特别,感兴趣的可以自己搜索下,或者加我微信交流。

所以当我们使用其他工具或者自己编写代码计算技术指标时,计算结果和交易所对不上,在排除数据源的问题后,很有可能就是指标的计算公式不一致。

同一技术指标的计算除了那些“肉眼可见”的区别之外,还有很多不容忽视的坑。

比如我们熟悉的布林线指标,在计算其中的标准差的时候,有的地方分母是使用的样本数,而有的地方采用的是样本数-1。

再比如很多指标在选择数据的时候,有的取包含今日在内的过去n根K线数据,有的取不包含今日数据的前n根K线。这样计算出来的结果显然是有差别的。

这些细小的差距对结果的影响不大,但差距又确实在那。往往会让你花很多时间去寻找为什么不同,最终发现的时候只给你带来一句:卧槽...

以上分析了计算指标和行情软件不同的几个原因,都来自于我实际的经验。其中有的可以解决,也一定要解决,不然你的策略结果就是错的。

而有的问题其实也解决不了,比如股票复权之类的问题。面对这种窘境,完美主义者可能会刨根问底且想方设法去找到原因并将其修正过来,但这种方式并不见得是最好的解决方案。

相信我,与其将时间花在这上面不如花更多的时间去研究策略。一般来说,只要确保数据源没问题,以及计算逻辑没错,就可以了。


系列文章推荐阅读:

  2018量化炒币7大玩法复盘 | 视频、PPT分享

关于股票市值:99%投资者不知道的坑,你知道吗?

历年排名前10的基金,在第2年表现如何?Python告诉你答案

在量化投资中,原来K线还能这么画(附画K线代码)

关于量化的任何问题,或者想要了解其他内容,可以扫描下方二维码加我微信(xingbx007)和我交流。

如果你想入门量化,但是始终找不到方向,可以加入我的知识星球。我会在里面解答你的问题,分享我的感悟,不论是投资、技术,还是职业选择、思维方式。

                                                                      -- 学习和成长从来都不是一个人的事 --

猜你喜欢

转载自blog.csdn.net/xingbuxing_py/article/details/90217116