リアルタイムな価格データを取得する際、「画面の変化に比べてデータが遅い」「リフレッシュしても追いつかない」と悩んだことはありませんか?多くの開発者が経験するこの問題、実は API の性能ではなくデータの取得方法に原因があるのです。今回は、WebSocket を使って遅延を大幅に減らす安定接続のやり方を、実践コード付きで紹介します。


① よくある問題:ポーリングではリアルタイムに対応できない

一般的に使われる HTTP ポーリングは、定期的にサーバーへデータを取りに行く方式です。この方式には次の弱点があります。

  • 通信の往復時間が発生し、遅延が避けられない
  • アクセス制限があるため、秒単位の更新が難しい
  • データが後から追いかける形になるため、リアルタイム性が低い

高頻度での監視や瞬時の判断が必要な場面では、ポーリングだと効率が落ちてしまいます。

② 解決策:プッシュ型の WebSocket でスピードアップ

リアルタイムデータを秒速で取得するコツは、「取りに行く」から「送られてくる」 に変えることです。WebSocket は常時接続を行い、データが更新されるとすぐに受け取れるため、次のメリットがあります。

  1. 一度接続すれば継続して使えるので無駄がない
  2. 必要なデータだけが送られるため遅延が少ない
  3. 複数の銘柄をまとめて安定して購読可能

AllTickの API と組み合わせることで、より安定したリアルタイムデータを受け取れます。

③ 実践コード:Python で WebSocket 接続

import websocket
import json

WS_URL = "wss://quote.alltick.co/quote-stock-b-ws-api?token=你的Token"
SYMBOLS = ["AAPL", "TSLA", "GOOG"]

def on_open(ws):
    print("接続確立、認証と購読リクエストを送信")
    ws.send(json.dumps({"action": "auth", "token": "你的Token"}))
    ws.send(json.dumps({"action": "subscribe", "codes": SYMBOLS}))

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

def on_error(ws, error):
    print("接続エラー:", error)

def on_close(ws):
    print("接続終了")

if __name__ == "__main__":
    ws = websocket.WebSocketApp(
        WS_URL,
        on_open=on_open,
        on_message=on_message,
        on_error=on_error,
        on_close=on_close
    )
    ws.run_forever()

このコードをそのまま実行するだけで、接続・認証・購読・データ受信が完了し、安定して秒速データを取得できます。

④ 長期安定稼働のためのコツ

実際に使うときは、次の点に気をつけると 24 時間安定して動作します。

  • 接続が切れたとき:自動で再接続する仕組みを入れる
  • データが重複したとき:タイムスタンプで重複を除去
  • 接続が途切れないように:定期的にハートビートを送信
  • 多数の銘柄を登録するとき:分割して登録して負荷を減らす

⑤ 使い分け:HTTP と WebSocket の適用場面

HTTP ポーリングが向いている場面

  • 過去のデータをまとめて取得
  • ローソク足の定期更新
  • 頻繁に更新しない画面表示

リアルタイム性が必要な場面(高頻度取引・監視など)→ WebSocket プッシュが必須です。

⑥ まとめ

データ取得方式をポーリングから WebSocket に変更するだけで、遅延が大幅に改善され、動作がスムーズになります。大切なのはプッシュ型の長期接続を選ぶこと、そして再接続・ハートビートなどの安定化処理を入れることです。個人での開発や高頻度なデータ監視に、ぜひ活用してみてください。