Python でゴールド価格を安定取得する方法を実践的に解説します。

トレードシステム開発をしている中で、贵金属(金・銀・プラチナ)のリアルタイム価格取得は一番失敗しやすいポイントでした。私は実際にデータの遅延や切断が原因で、3 回も強制ロスカットを経験…。その経験をもとに、安定して価格データを取得できる仕組みを作り上げたので、今回はその実践ノウハウをまとめます。


なぜ贵金属の価格データは不安定なの?

株式や先物と違い、贵金属はロンドン・ニューヨーク・香港・シドニーの 4 つの世界市場が 24 時間動きます。市場の切り替わり時や経済指標発表時は、価格の急変動・データの途切れが起こりやすくなります。

私が実際に困ったトラブルはこちら:

  • 指標発表時に価格が飛び、データを取りこぼす
  • WebSocket 接続が突然切れる、自動再接続されない
  • 重複データ・異常な価格データが混入する
  • 1 品種だけしか取得できず、相場連動が見れない

これらを解決しないと、トレード戦略はまともに動きません。


安定接続のコツ:WebSocket 一括購読+自動再接続

何度も失敗した結果、1 接続で複数品種を購読し、切断時は自動で再接続する仕組みが最強だと分かりました。

今回はAllTick APIを使って、金 (XAUUSD)・銀 (XAGUSD)・プラチナ (XPTUSD) のリアルタイム価格を取得します。

そのまま使える Python コード

import websocket
import json
import time

def on_message(ws, message):
    data = json.loads(message)
    # リアルタイムティックデータのみ処理
    if 'tick' in data:
        symbol = data['symbol']
        price = data['price']
        ts = data['time']
        print(f"[{symbol}] {price} @ {ts}")

def on_error(ws, error):
    print("接続エラー:", error)
    time.sleep(2)
    ws.run_forever()  # 自動再接続

def on_close(ws):
    print("接続が切れました。再接続を試みます…")

def on_open(ws):
    # 金・銀・プラチナをまとめて購読
    sub_msg = {
        "action": "subscribe",
        "symbols": ["XAUUSD", "XAGUSD", "XPTUSD"]
    }
    ws.send(json.dumps(sub_msg))

if __name__ == "__main__":
    ws = websocket.WebSocketApp(
        "wss://api.alltick.co/websocket",
        on_open=on_open,
        on_message=on_message,
        on_error=on_error,
        on_close=on_close
    )
    ws.run_forever()

これだけで、遅延の少ないリアルタイム価格を安定取得できます。


絶対やるべき!データの 3 段階浄化

取得したデータはそのまま使わず、綺麗に整えることが重要です。

  1. 重複除去銘柄+価格+タイムスタンプで重複データを削除
  2. 異常値除去急激な価格変動(3% 以上など)を除外し、誤作動を防ぐ
  3. ローカルキャッシュ直近 200 件のデータを保存し、一時的な切断でもデータが途切れない

この処理を入れるだけで、戦略の安定度が大幅に上がります。


応用:リアルタイムで RSI インジケーター計算

価格データを使って、その場でインジケーターを計算することも可能です。

def on_message(ws, message):
    data = json.loads(message)
    if 'tick' in data:
        price = data['price']
        rsi = quick_rsi(price)
        if rsi > 70:
            trigger_alert("金 買われすぎ!")
        elif rsi < 30:
            trigger_alert("金 売られすぎ!")

リアルタイムアラート・自動売買・チャート表示などに応用できます。


最後に私が学んだこと

API はただの「データのパイプ」に過ぎません。接続の安定性・再接続・データ浄化といった細かい仕組みが、すべての結果を決めます。

この記事が、同じようにデータトラブルで困っている方の助けになれば嬉しいです。