Tick 数据和 K 线数据到底差在哪里?

9 月 11 日
 matters

最近在做行情数据相关的东西,发现一个挺容易搞混的地方:Tick 数据和 K 线数据到底有什么区别?

一开始我的理解也比较简单,觉得 K 线无非就是把很多条 Tick 数据按照 1 分钟、5 分钟之类的时间周期聚合一下。

后来自己实际处理数据之后,发现两者虽然有关系,但用途其实完全不一样。

如果只是看盘,K 线已经够用了。但如果要做量化策略、盘口分析或者研究某一段时间内价格到底是怎么走出来的,Tick 数据的重要性就会明显很多。

我先用一个比较直观的方式理解

比如某只股票在 10:00 到 10:01 之间发生了很多次成交。

Tick 数据可能长这样:

10:00:01  100.12  200
10:00:03  100.15  100
10:00:07  100.18  300
10:00:12  100.16  500
10:00:25  100.20  200
10:00:41  100.22  100
10:00:56  100.19  400

每一条基本都对应一次行情变化。

而如果我把这一分钟的数据聚合成 1 分钟 K 线,最后可能只剩:

Open   100.12
High   100.22
Low    100.12
Close  100.19
Volume 1800

这时候就很明显了。

Tick 更像是过程,K 线更像是结果。

K 线告诉我这一分钟开在哪里、最高到哪里、最低到哪里、最后收在哪里。

Tick 则让我看到这一分钟里面到底发生了什么。

那为什么不直接全部用 K 线?

我觉得主要还是看策略。

如果只是做一些比较常规的技术指标,比如均线、MACD 、RSI ,K 线通常已经足够。

因为这些指标本身就是建立在 OHLC 等聚合数据上的。

比如我想判断:

最近 20 根 5 分钟 K 线是不是处于上涨趋势?

直接拿 K 线计算就可以了。

这时候如果还去处理大量 Tick 数据,反而会增加数据量和计算量。

但如果我的问题变成:

价格为什么突然从 100.15 打到 100.30 ?

或者:

这一分钟里面到底发生了多少次成交?

甚至:

某个价格附近是不是出现了大量成交?

那 K 线就不太够用了。

因为 K 线只告诉我这一分钟最终形成了一个结果,却不会告诉我中间具体经历了什么。

Tick 数据还有一个比较明显的特点:数据量很大

这个其实是我自己接触之后比较明显的感受。

一根 1 分钟 K 线可能只是一条记录。

但这一分钟里面可能发生几十、几百甚至更多次价格变化。

所以如果我要存 Tick 数据,就不能简单地按照 K 线那种思路去处理。

比如实时接行情的时候,我比较常见的一种做法就是 WebSocket 持续接收数据。

我最近测试的时候,用 AllTick 的 WebSocket 接了实时成交数据,基本思路就是订阅需要的产品,然后等待服务端持续推送。

例如:

import json
import websocket

TOKEN = "your_token"

url = (
    "wss://quote.alltick.co/"
    "quote-stock-b-ws-api?token=" + TOKEN
)

def on_message(ws, message):
    data = json.loads(message)
    print(data)

def on_open(ws):
    request = {
        "cmd_id": 22004,
        "seq_id": 123,
        "trace": "test_tick",
        "data": {
            "symbol_list": [
                {"code": "700.HK"},
                {"code": "UNH.US"}
            ]
        }
    }

    ws.send(json.dumps(request))

ws = websocket.WebSocketApp(
    url,
    on_open=on_open,
    on_message=on_message
)

ws.run_forever()

这里订阅的是实时成交价 Tick 数据。

实际收到的数据里,可以看到类似这样的字段:

{
    "cmd_id": 22998,
    "data": {
        "code": "700.HK",
        "seq": "1605509068000001",
        "tick_time": "1605509068",
        "price": "651.12",
        "volume": "300",
        "turnover": "12345.6",
        "trade_direction": 1
    }
}

对我来说比较有用的是 tick_time、price、volume 这些字段。

这样我可以自己把原始数据按照需要重新聚合。

比如我要 1 分钟 K 线,我自己算。

我要 5 分钟 K 线,也可以重新算。

甚至我想研究某个时间段里面的成交情况,也可以直接从 Tick 开始分析。

反过来,K 线其实也有自己的优势

虽然 Tick 数据更细,但并不是说 Tick 就一定比 K 线好。

我反而觉得做实际项目的时候,K 线更加省事。

例如我要回测一个比较普通的趋势策略。

假设策略是:

5 分钟均线向上
+
20 分钟均线向上
+
价格突破前高

这种情况下,直接使用 K 线就比较方便。

数据量小很多,计算也简单。

如果为了这个策略把所有 Tick 全部拉下来,再自己聚合成 5 分钟、20 分钟 K 线,感觉有点绕远了。

所以现在我的理解是:

不是 Tick 和 K 线谁更好,而是我要研究的问题决定了应该使用哪一种。

我现在会这样区分

如果是:

我一般会优先考虑 K 线。

如果是:

那我会更倾向于从 Tick 数据开始。

还有一个容易忽略的地方,就是数据一旦聚合成 K 线,原始信息其实就丢掉了一部分。

比如下面两种 Tick 过程:

A:
100 → 101 → 102 → 103

B:
100 → 103 → 101 → 103

最后如果只看某个周期的 OHLC ,可能得到非常接近甚至一样的结果。

但实际价格走法完全不一样。

这也是我觉得 Tick 数据比较有意思的地方。

所以我现在的理解是

可以简单粗暴地记成一句话:

K 线告诉我“这一段时间发生了什么结果”,Tick 告诉我“这个结果是怎么一步一步形成的”。

日常看盘或者做普通技术分析,K 线通常已经够用。

但如果开始往量化、微观结构、成交分析这些方向走,Tick 数据就会变得越来越有价值。

当然,Tick 数据也意味着更大的数据量、更高的存储和计算要求,以及实时数据接入时需要处理断线重连、心跳等问题。

所以如果只是做一个普通的交易策略,我觉得没必要为了“数据更细”就强行上 Tick 。

先看自己的策略到底需要什么粒度,反而比较重要。

我现在基本就是按照这个思路来选数据。

1590 次点击
所在节点    投资
7 条回复
Tathagatagarbha
9 月 11 日
OP 这个不是严格意义上的 tick 哦,是 3 秒 snapshot
Tathagatagarbha
9 月 11 日
@Tathagatagarbha 看错了,忽略……
coefu
9 月 12 日
🦀,bro ,你知道多大的盘子才需要 T+1 的 tick 吗?

tick 级别,光存,然后抽,算,没有四分之一个数据中心,起码 20 个柜子的 资源,都不用想。
cvbnt
9 月 12 日
Order Book 上最优的买单和卖单发生的变化的数据
Sawyerhou
9 月 12 日
tick 数据一般是用 c++或者 java 跑的,用 python 回测非常慢,实盘延迟严重,没有搞头。
laojuelv
9 月 14 日
学习了
EliteOtaku
9 月 15 日
K 线是有损的数据压缩

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1241382

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX