TICK回测研究四,合成K线的问题分析
一、概述
K线合成是指将原始的TICK数据按时间范围进行汇总,如下表所示的TICK数据,
时间 |
价格 |
成交量 |
2021年11月15日09点13分22秒000毫秒 |
192 |
1 |
2021年11月15日09点13分22秒250毫秒 |
190 |
2 |
2021年11月15日09点13分22秒500毫秒 |
191 |
1 |
2021年11月15日09点13分22秒750毫秒 |
193 |
3 |
可以简单汇总成一条信息,
时间 = 2021年11月15日09点13分22秒
OPEN = 192
CLOSE = 193
HIGH = 193
LOW = 190
VOL = 7
这样的操作1秒钟能够压缩的信息量有限,但是对于更大周期如1分钟、1小时、1天或更长的时间,能够将非常庞大的信息压缩到简单的6条数据。
实际上我们常用一些指标如MA、MACD、BOLL等也是基于这个逻辑,即是将庞杂的信息浓缩成关键的“指标”。
然而在K线合成上各家都有自己的逻辑,这就导致后续指标计算也产生了分歧,再进一步量化策略的执行也会产生区别。本篇就是着重于分析各家K线合成的逻辑和由此产生的问题。
二、问题根源
前面的概述中,我们将9点13分22秒包含的4个TICK汇总成了一个秒K线,这个秒K线时间范围是“22秒000毫秒之后至23秒000毫秒之前”的数据,那么时间戳为23秒000毫秒收到的数据,是属于22秒成交的还是23秒成交的?这是后面一系列问题的根源。
时间 |
价格 |
成交量 |
09点13分21秒000毫秒 |
190 |
2 |
09点13分21秒250毫秒 |
192 |
3 |
09点13分21秒500毫秒 |
193 |
1 |
09点13分21秒750毫秒 |
191 |
2 |
09点13分22秒000毫秒 |
192 |
1 |
09点13分22秒250毫秒 |
190 |
2 |
09点13分22秒500毫秒 |
191 |
1 |
09点13分22秒750毫秒 |
193 |
3 |
09点13分23秒000毫秒 |
194 |
2 |
09点13分23秒250毫秒 |
192 |
3 |
09点13分23秒500毫秒 |
191 |
1 |
09点13分23秒750毫秒 |
193 |
2 |
从直观上,我们倾向于22秒000毫秒到22秒750毫秒的成交归属于22秒,23秒000毫秒到23秒750毫秒的成交归属于23秒,但实践中却有个问题,假设交易所在15:00:00准时闭市,那么14:59:59依然还是有交易的,14:59:59.000、14:59:59.250、14:59:59.500、14:59:59.750会依次收到交易所的行情信号,这些我们都可以归于59秒,但是15:00:00.000会收到交易所发来的最后一笔行情,这个怎么处理?
所以实际上我们应该将22秒000毫秒归属到21秒去,如果我们画秒K的话,就应该从早上第一个秒开始到最后一个秒结束,即9:00:01 - 15:00:00。到这里一切都好说,但是接着关于时间标记各软件商就有了矛盾,以至于后面分歧越来越大画的K线就完全不一样了。
三、问题一:时间标记
上一节中,我们知道在秒K中,我们的时间范围是9:00:01 - 15:00:00,但需要注意的是,09:00:01包含的成交实际上是09:00:00-09:00:01这个秒发生的,而15:00:00包含的成交实际上是14:59:95-15:00:00这个秒发生的。所以在合成K线时,时间的标记大家就有了分歧。
方式一:取K线的结束时间,即每天第一个K的时间是09:00:01,最后一个K是15:00:00。
方式二:取K线的开始时间,即每天第一个K的时间是09:00:00,最后一个K是14:59:59。
下表是方式一的合成示意:
时间 |
价格 |
成交量 |
K线时间 |
K线数据 |
09点13分21秒000毫秒 |
190 |
2 |
|
|
09点13分21秒250毫秒 |
192 |
3 |
09点13分21秒 |
Open = 192 Close = 192 High = 193 Low = 191 Vol = 7 |
09点13分21秒500毫秒 |
193 |
1 |
||
09点13分21秒750毫秒 |
191 |
2 |
||
09点13分22秒000毫秒 |
192 |
1 |
||
09点13分22秒250毫秒 |
190 |
2 |
09点13分22秒 |
Open = 190 Close = 194 High = 194 Low = 190 Vol = 8 |
09点13分22秒500毫秒 |
191 |
1 |
||
09点13分22秒750毫秒 |
193 |
3 |
||
09点13分23秒000毫秒 |
194 |
2 |
||
09点13分23秒250毫秒 |
192 |
3 |
|
|
09点13分23秒500毫秒 |
191 |
1 |
|
|
09点13分23秒750毫秒 |
193 |
2 |
|
|
两种方式都有人用,我大概看了下:
方式一,标K线的结束时间:极星、通达信、富途
方式二,标K线的开始时间:文华、快期、TB
只需要看,如果第一个K的时间是9:00:00那就是方式二,其他的就是方式一,由时间标记的不同逻辑后面又衍生出了很多不同。
四、问题二:跨交易时段问题
我们知道内盘交易所交易时间并不连续,主要交易时段如下,
第一节:9:00-10:15
第二节:10:30-11:30
第三节:13:30-15:00
第四节:21:00-23:30
对于1秒周期的K线,各节包含的时间标签如下表所示:
|
方式一,标K线的结束时间 |
方式二,标K线的开始时间 |
第一节 |
09:00:01、09:00:02、...、10:14:59、10:15:00 |
09:00:00、09:00:01、...、10:14:58、10:14:59 |
第二节 |
10:30:01、10:30:02、...、11:29:59、11:30:00 |
10:30:00、10:30:01、...、11:29:58、11:29:59 |
第三节 |
13:30:01、13:30:02、...、14:59:59、15:00:00 |
13:30:00、13:30:01、...、14:59:58、14:59:59 |
第四节 |
21:00:01、21:00:02、...、23:29:59、23:30:00 |
21:00:00、21:00:01、...、23:29:5、23:29:59 |
对于2秒、3秒周期的K线情况还行,似乎没有什么问题,我们只选取其中一节看下:
|
方式一,标K线的结束时间 |
方式二,标K线的开始时间 |
2秒周期 |
||
第一节 |
09:00:02、09:00:04、...、10:14:58、10:15:00 |
09:00:00、09:00:02、...、10:14:56、10:14:58 |
3秒周期 |
||
第一节 |
09:00:03、09:00:06、...、10:14:58、10:15:00 |
09:00:00、09:00:02、...、10:14:56、10:14:58 |
但对于7秒这种无法被60整除的K线情况就不妙了,由于不好计算确切时间,我们做一个简单的示例,
对于盘中休息的处理,
方式一:标记K线结束时间。如早上10:15:00前最后一个K的是时间是10:14:58,则下一个K的时间应该是10:30:05。但有些系统却是10:15:05,为啥呢,因为10:15:00后虽然不交易了,但是行情并没有关闭,所以打这个时间戳也说的通。所以可以想见的是,有的系统应该是取10:15:05有的取10:30:05。
方式二:标记K线开始时间。如早上10:15:00前最后一个K的时间是10:14:58,则下一个K的时间应该是10:30:05。但有些系统却是10:30:00,为啥呢,还是15分以后交易只是暂停没有结束,他可以认为10:14:58 - 10:15:05是一个周期,再下一个周期可不就应该是10:30:00了吗。
前面只是说了由秒周期导致的跨时段问题,那么有一些软件为了避免分歧,就限制了秒、分周期必须可以被60整除,小时周期必须可被24整除。但即使这样,依然存在问题,特别是跨交易时段、跨交易日。
五、问题三:跨交易时段、跨交易日问题
前面只是说到秒周期、分钟周期就遇到很多问题,那么我们继续扩大周期,比如用4小时周期。早上9:00到11:30,总共也才交易了2个半小时,如果用4小时周期的K线,那第一根K就是9:00-14:00,而且中间还空档了15分钟,第二根K从14:00到第二天的早上10点了,这还咋整。一天一共也没交易8小时,你咋画两个4小时的K呢,所以很多软件就不支持1H以上的周期,另一些就随缘,把一天直接分成2个K,而且这个K还是跨交易日的,其实分析起来并不得劲。
六、问题四:日K、周K、月K
日K主要的问题是,有时候有夜盘,有时候又没有夜盘,所以有的K数据多,有的K数据少,这其实是有影响的。
周K呢就是有时候交易所放假,有些周有5天,有的只有一天。
月K跟周K差不多,也是数据量不成正比,过年的那个月少了好几个交易日。
七、解决方案
方案一:按秒进行汇总,不考虑自然时间的分割
即将交易时的每一秒都汇总起来,1分钟等于60个秒,60秒等于1小时,而不考虑自然时间的分割。比如下表这样,在09:00:03这个秒下没有数据,那么直接跳过,也就是09:00:01-09:00:04只有3秒。而后60秒汇聚成1分钟,60个1分钟再汇聚成1小时。
09:00:01 |
09:00:02 |
09:00:03 |
09:00:04 |
这样其实就不存在所谓1分钟、1小时的周期,只存在60秒、3600秒这样的周期。
方案二:按分钟进行汇总
参考前面秒的方式,只是精确度只到分钟。同样的,也不存在1小时的周期,只有60分钟的。
方案三:按小时进行汇总,可行吗?
不可行,因为存在10:15、11:30这样的时间。
方案四:按时段进行汇总
即将一天分为4个小节,5个时段
第一节 |
09:00:01 - 10:15:00 |
1小时15分钟 |
第二节 |
10:30:01 - 11:30:00 |
1小时15分钟 |
第三节 |
13:30:01 - 15:00:00 |
1小时30分钟 |
第四节 |
21:00:01 - 22:15:00 22:15:01 - 23:30:00 |
1小时15分钟 1小时15分钟 |
这样除了下午多了15分钟,其他时段正好都是1小时15分钟,而且时间的开始和结束都卡的很好,不失为一个好的方案。
八、回顾
前面我们分析了K线合成的各种问题,并提出了一些解决方案,但并不是说这些方案就是好的,需要在实际应用中根据业务的要求去选合适的方法。