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 段階浄化
取得したデータはそのまま使わず、綺麗に整えることが重要です。
- 重複除去銘柄+価格+タイムスタンプで重複データを削除
- 異常値除去急激な価格変動(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 はただの「データのパイプ」に過ぎません。接続の安定性・再接続・データ浄化といった細かい仕組みが、すべての結果を決めます。
この記事が、同じようにデータトラブルで困っている方の助けになれば嬉しいです。