深入理解通达信的板块统计函数
tonyonezero
tonyBlackWhite
2024-05-13 22:06
众所周知,通达信里面有两个板块相关指标INSORT和INSUM指标。 这两个指标计算非常缓慢,用起来体验很不好,但是也是极少数能够在板块内部进行统计的指标了。 那么,你知道这两个指标背后到底干了什么吗? 1、INSORT和INSUM用法简介 首先简要介绍一下这两个指标: 1)、INSORT:板块排序选股 INSORT.横向统计 用法:INSORT(板块名称,指标名称,指标线,升降序), 返回该股在板块中的排序序号 例如:INSORT('房地产','KDJ',3,0)表示该股的KDJ指标第三个输出即J之值在房地产板块中的排名, 最后一个参数:0表示降序排名,1表示升序排名 2)、INSUM:板块指标统计 INSUM.横向统计 用法:INSUM(板块名称,指标名称,指标线,计算类型), 返回板块各成分该指标相应输出按照计算类型得到的计算值。 计算类型可选择:0-累加,1-平均数,2-最大值,3-最小值. 例如:INSUM('房地产','KDJ',3,0)表示房地产板块中所有股票的KDJ指标第三个输出即J之值的累加值。 2、INSORT和INSUM原理测试 上面两个指标的用法很简单。 那么,他们背后的原理是什么呢?为什么会这么慢呢? 利用DLL,我探究了这两个公式背后的秘密。 另外,考虑到这两个公式形式上的一致性,我用一个DLL来统一对上述两个公式进行运算。 首先,我们下载任意指定板块的数据, 就像下面一样,建立下载指定数据的公式: 显然,从K2这行代码可以看出,我下载的是KDJ的J指标。 K1这行代码则表示,我下载500个数据,数据类型我定义为101号,这其实就是个用于区分不同板块数据的标号,只用于不同板块之间的区分,并没有什么其他实际意义。 那么现在用这个DLL,就能下载到上面定义的101号板块的所有股票的指标了: 现在有了下载下来的所有数据,就可以自己来编写INSORT(板块排序选股)和INSUM(板块指标统计)的排序和统计公式了,这部分我用C++来完成。 之后比如下面这样,我建立通达信的调用公式, 通达信的调用函数可知,这里可以分别调用0、1、2、3、4、5共计五种计算类型。 其中,0到3号就是对应前面的INSUM(板块指标统计);后面的4、5就对应 INSORT(板块排序选股)函数。 现在,一个公式就解决了INSUM和INSORT函数的调用问题。 下面的副图就是上面的公式的调用的结果: 3、结论 那么,我为什么要废大功夫编这些东西呢? 因为,只有这么测试,才能知道通达信背后到底干了什么?它到底计算得准不准?还有没有可能提高的地方?等等。 而我在公式编写和测试的过程中,就发现了通达信的固有病根。 通达信的计算体系是建立在float单精度浮点数上的,而在INSUM公式中,偏偏就用到了求和与取平均两个计算函数。 众所周知,float单精度浮点数的有效数字只有7位,那么通达信的这些与求和相关(也就是普普通通的加减法)的函数,会面临巨大的截断误差,特别是与成交量相关的那些大数相加时尤其明显。 在我的测试中,求和与取平均这两个函数通达信的误差就比较大了。 当然我们也不能苛求通达信,毕竟这是个免费软件,而且其计算内核也还都是源自上世纪90年代的上古大神们的心血。 那时候的计算机性能孱弱,内存也不够用,C++标准没准都还没有统一,能基于那个年代的C++方言构建这么一套系统已经相当厉害了。 最后劝大家一句,在使用INSUM公式时,可千万别对浮点数据较真了。 这个函数的累加误差还是挺大的,在计算时看个变化趋势就行了(变化趋势还是几乎一样的)。 要想得到真实完美的数据,还得像我这样子,用DLL,换成double双精度浮点数搞计算、分析。 当然,以上过程,只是为了还原通达信的INSUM和INSORT函数的底层。 现在我都有了所有指标的数据,其计算、分析当然完全可以离线盘后开展,甚至可以离线搞并行计算,把所有数据都离线计算出来,这就完全脱离了通达信的在线计算平台了。 ———————————————— 如果不明白DLL的编写方法, 有付费的《通达信》编写DLL的教程,见这里: 付费的《大智慧》编写DLL的教程见这里: 以上教程都是从零讲起,带你进入《通达信》、《大智慧》DLL编写指标的殿堂。 |
|