株式売買やシステムトレード、データ監視ツールを作っていると、「データの遅延がすごい」「取得が安定しない」 という悩みに必ずぶつかりますよね。
私も長年、開発者・トレーダーとしてこの問題を抱えていましたが、WebSocket を使ったデータ配信に切り替えたら、劇的に快適になりました。
今回は、リアルタイム株価データを安定的に取得し、解析するまでの流れを、コード付きで完全公開します。
HTTP ポーリングのデメリット(私が失敗した理由)
最初は一般的なHTTP ポーリングでデータを取得していました。しかし、実際に使ってみると問題だらけでした。
- 価格変動が激しいと遅延が大きくなる
- 何度もリクエストするので無駄な通信が多い
- データ抜けが起きやすくシステムが不安定
- 大量の銘柄を監視すると重すぎて動かない
これでは、システムトレードやリアルタイム表示ツールには使えません。
解決策:WebSocket でリアルタイム配信を受け取る
そこで私がたどり着いたのがWebSocketによるデータ購読です。
WebSocket は一度接続したら、価格が更新されるたびに自動でデータが届くため、遅延が少なく、負荷も大幅に減ります。
今回はAllTick APIを使って、安定した株価データを取得する方法を紹介します。
実装コード【コピペですぐ使える】
1. WebSocket 接続&銘柄登録
import websocket
import json
def on_message(ws, message):
data = json.loads(message)
print(f"{data['symbol']} 最終価格: {data['price']} 出来高: {data['volume']}")
def on_open(ws):
sub_data = {
"action": "subscribe",
"symbols": ["spx", "nq", "aapl", "tsla"]
}
ws.send(json.dumps(sub_data))
ws = websocket.WebSocketApp(
"wss://api.alltick.co/ws/stock",
on_open=on_open,
on_message=on_message
)
ws.run_forever()
2. データを解析・整形する
取得したデータは、そのままでは使いにすいので、整然とした形に変換します。騰落率や変動幅を計算し、戦略や画面表示に使えるようにします。
def process_tick(data):
symbol = data['symbol']
price = float(data['price'])
volume = int(data['volume'])
change = price - data['prev_close']
percent = (change / data['prev_close']) * 100
return {
"symbol": symbol,
"price": price,
"volume": volume,
"change": change,
"percent": percent
}
3. 銘柄を動的に追加・解除
必要な銘柄だけをリアルタイムで切り替えられるので、無駄なデータを減らせます。
# 最初に登録
ws.send(json.dumps({"action": "subscribe", "symbols": ["msft", "goog"]}))
# 追加登録
ws.send(json.dumps({"action": "subscribe", "symbols": ["amzn"]}))
# 登録解除
ws.send(json.dumps({"action": "unsubscribe", "symbols": ["msft"]}))
安定稼働させるコツ【3 つ】
実際に長時間稼働させるために、私が気をつけているポイントです。
-
自動再接続ネットワークが切れても、自動で再接続する仕組みを入れましょう。
-
スナップショットと併用初期データや再接続時に、スナップショット API を使うとデータが途切れません。
-
非同期処理データ処理を別スレッドで行い、WebSocket の受信をブロックしないようにします。
この方法のメリットまとめ
- 遅延が少なくリアルタイムに使える
- コードが短く初心者でも簡単
- 銘柄を自由に追加・解除できる
- データが綺麗に整形されすぐに活用可能
- システムトレード・監視ツールに最適
最後に
株価データの取得は、システムトレードの肝となる部分です。HTTP ポーリングでストレスを感じている方は、ぜひWebSocketを試してみてください。
私はこの方法に変えてから、稼働が安定し、作業効率が大幅にアップしました。
参考になれば嬉しいです😊