此为历史版本和 IPFS 入口查阅区,回到作品页
emily19980210
IPFS 指纹 这是什么

作品指纹

數據斷層比你想像中更常見:我用港股API抓行情,如何確保每一筆tick都可靠?

emily19980210
·
·
最近我整理了自己過去三個月發佈的港股分析文章,發現有7%的圖表存在細微的數據偏差。追查之後,原因讓我有些意外:不是繪圖工具出錯,也不是我解讀有誤,而是即時行情推送的過程中,有幾個短暫的區間靜悄悄地遺失了數據。

作為一個以數據支撐觀點的財經內容創作者,我沒有辦法接受自己的圖表只是「大概正確」。讀者信任我,是因為我提供的數字經得起比對。但當WebSocket連線顯示正常、程式也持續接收訊息時,要如何發現那些無聲無息的數據缺口?這篇文章就來分享我自己的做法,以及這些方法如何幫助我提升內容品質。

內容創作遇到的真實痛點:連線正常,數據卻不完整

即時行情數據通常透過長連線持續傳輸,每一筆tick都帶有時間戳記,理論上可以完美重建分時走勢、成交統計。但網路傳輸從來不是理想狀態。短暫延遲、連線抖動、甚至本機處理速度不足,都可能造成一小段數據在「連線看似健康」的狀態下消失。

我追蹤某隻港股時,就看過這樣的情況:


系統看到的只是「暫停了12秒」,但市場在那12秒內可能已經累積了大量成交。如果我不做任何檢查,直接拿這些數據畫K線或計算指標,誤差就會悄悄滲入我的文章裡。

我需要的數據,不只是「有在更新」

作為一個需要頻繁引用即時行情的創作者,我對數據源有幾個明確要求:

  • 連續性:不能有靜默的缺口,否則日內圖形會失真。

  • 原始性:最好能拿到原始tick,而不是已經被聚合過的資料,這樣我才能自行驗證。

  • 可檢查性:數據本身要提供足夠的資訊(例如時間戳、序號),讓我能用簡單的方法偵測異常。

市面上有些港股API只回報「連線中」,但不等於數據完整。我需要的是能讓我自己把關的接口。

用時間戳找出可疑的缺失區間

最直接的方法,就是檢查每筆tick之間的時間差。我會保留每筆數據的原始時間戳,然後比較相鄰兩筆的間隔。如果間隔明顯超過正常範圍,就記錄為疑似缺失區間。

下面是我用在數據接收端的Python邏輯:

last_time = None


def check_data(timestamp):
    global last_time

    if last_time:
        gap = timestamp - last_time

        if gap > 5:
            print("偵測到數據間隔:", gap)

    last_time = timestamp

實際使用時,這個閾值不能一刀切。交易活躍的藍籌股可能每秒都有報價,但成交清淡的小型股可能十幾秒才有一筆tick。我會先觀察個股的歷史報價頻率,再動態調整判斷標準,避免誤報。

加上序號與心跳,讓偵測更可靠

除了時間戳,訊息序號也是很好的輔助。如果行情推送中包含遞增的編號,直接看編號是否連續就能快速定位缺失。例如收到:

  • 20001

  • 20002

  • 20003

  • 20007

中間缺少的20004到20006就一目了然。如果接口沒有提供序號,我也會加上心跳檢查:定時查看最新行情時間,如果長時間沒有更新,就記錄狀態並觸發重新訂閱。這個方法簡單有效,很適合我這種非專業開發者。

整合到我的日常工作流程

我的習慣是把接收和驗證拆開處理。接收模組只負責收數據,驗證模組則持續檢查有沒有異常。最近我使用AllTick的WebSocket行情訂閱來取得港股tick,它提供的原始數據讓我可以很方便地加上自己的檢查邏輯。下面是我在訊息回調中實際使用的程式碼片段:

import websocket
import json


last_timestamp = None


def on_message(ws, message):
    global last_timestamp

    data = json.loads(message)

    timestamp = int(data["timestamp"])

    if last_timestamp:
        gap = timestamp - last_timestamp

        if gap > 5000:
            print("可能存在缺失:", gap)

    last_timestamp = timestamp

    print(
        data["symbol"],
        data["price"]
    )


ws = websocket.WebSocketApp(
    "wss://api.alltick.co/stock/websocket",
    on_message=on_message
)


ws.run_forever()

一旦發現異常區間,我會把時間範圍記錄下來,之後透過歷史接口補齊缺失的數據。這樣我的圖表就能建立在完整的資料上,而不是一份有洞的拼圖。

數據復原:別讓補資料變成另一種污染

發現缺失只是第一步,補回數據同樣關鍵。如果復原做得不好,反而可能造成二次傷害。我自己的流程是:

  1. 精確記錄缺失區間的開始與結束時間。

  2. 重新請求該時間範圍的歷史tick數據。

  3. 檢查補回的數據是否與既有紀錄連續。

  4. 寫入前先查重,避免重複資料影響成交量與K線計算。

重複寫入和缺失一樣可怕。補資料時稍微不注意,就可能讓成交量憑空多出一截,或是讓K線高低點偏移。所以我把復原流程看得跟偵測一樣重要。

數據完整性,是內容品質的底線

說到底,使用港股API搭建即時行情系統,不能只看接口有沒有回傳數據。真正可靠的數據源,必須讓我能驗證每一次推送是否連續、時間是否準確。對一個靠數據說話的內容創作者來說,這些細節決定了文章的專業度。

我開始做這些檢查之後,文章中的圖表與交易所數據的吻合度明顯提升,讀者也回饋說分析「感覺更踏實了」。數據完整性不該是開發者才關心的技術細節,而是我們這些產出內容的人,對自己作品的基本要求。如果你也依賴即時行情寫作,不妨從時間戳檢查開始,為自己的內容加一道保險。

CC BY-NC-ND 4.0 授权