🍎

WebSocketクライアントを使って米株の取引情報をリアルタイムに取得する

2023/04/13に公開

背景

websocketでの情報の取得を試したかったので、PythonのWebSocketのクライアントライブラリwebsocket-clientを使って米株の取引情報を取得してみました。
以前から米株の取引アプリでは取引量などが分からず、瞬時に価格が変わっていくため、もう少し細かい情報を取得できる方法を探していました。
いくつかのサービスを調べる上で

  • リアルタイムに情報を取得できる
  • 入札の状態が分かる
  • 低価格
    という点を満たすものを調べていき、
    その結果、今回は eodhistoricaldata.com を使うことにしました。

早速実装

url_stock_quote = "wss://ws.eodhistoricaldata.com/ws/us?api_token=xxxxxxx"
ws = websocket.WebSocketApp(url_stock_trade,
    on_open=on_open,
    on_message=on_message,
    on_error=on_error,
    on_close=on_close)
ws.run_forever(dispatcher=rel, reconnect=5)

rel.signal(2, rel.abort)
rel.dispatch()

接続自体は上のような処理だけで接続できます。
接続後にはon_open()のdefが呼ばれますので、予め下記のような処理を記述しておきます。

def on_open(ws):
    ws.send('{"action": "subscribe", "symbols": "AAPL"}')

websocketのメッセージ自体は on_message が反応するように定義したので、
第2引数のmessageに値が入っています。

def on_message(ws: websocket, message):
    print(message, flush=True)
//Quote
{"s":"AAPL","ap":150.96,"bp":150.75,"as":1,"bs":4,"t":1681346207763}'
//Trade
{"s":"AAPL","p":150.74,"c":[12,37],"v":50,"dp":false,"ms":"extended-hours","t":1681346207763}'

次々と上記のようなJSON形式で飛んできます。

結果

これだけだとログとして流れるだけなので、
JSONのSchemaチェック->MySQLに書き込む処理を書きました。
その結果

こんな感じでデータを確認することができるようになりました。

やってみて

意外と簡単に値を受け取ることができ、リアルタイムに値が飛んでくるのを見るのが楽しかったです。
売買情報が更新されるたびに値が飛んできますし、証券会社の画面よりも早く確認できる点がよかったですね🕺
MySQLに接続できるスマホアプリもありますので、気になるときはアプリから値を確認しています。

レスキューナウテックブログ

Discussion