Pythonでリアルタイムの金価格を取得するには、requestsでapi.goldprice.dev/v1/spot/XAU-USD-SPOTにGETリクエストを送り、X-API-KeyヘッダーにAPIキーを指定します。cachetools.TTLCacheで60秒間キャッシュし、価格計算にはDecimalを使います。無料プランは月5,000回で、クレジットカードは不要です。2026年10月にPython 3.15 + requests 2.34で検証済みです。
goldprice.devのAPIキーを取得する
goldprice.dev/onboardingで無料アカウントを作成します。メール確認後、ダッシュボードにga_live_で始まるキーが表示されます。環境変数に設定してください。
export GOLDPRICE_API_KEY=ga_live_replace_with_your_key_here無料プランには月5,000回の呼び出しと、31通貨の金スポット価格が含まれます。クレジットカードは不要です。
必要なパッケージをインストールする
HTTP呼び出し用のrequests、プロセス内のTTLキャッシュ用のcachetools、429時の再試行用のtenacityが必要です。pipまたはuvでインストールしてください。
# pippip install requests cachetools tenacity# or uv (recommended)uv add requests cachetools tenacitygoldpriceクライアントを作成する
以下をgoldprice.pyとして保存します。spot()はシンボルごとに60秒間キャッシュし、429時は指数バックオフで最大3回再試行します。価格をDecimalで返すため、後続の計算で浮動小数点の誤差が蓄積するのを防げます。
# python: goldprice.py# curl-equivalent: https://api.goldprice.dev/v1/spot/XAU-USD-SPOTimport osfrom decimal import Decimalfrom typing import TypedDictimport requestsfrom cachetools import TTLCache, cachedfrom tenacity import ( retry, retry_if_exception_type, stop_after_attempt, wait_exponential,)API_BASE = "https://api.goldprice.dev"API_KEY = os.environ["GOLDPRICE_API_KEY"]TIMEOUT = 5 # secondsclass SpotResponse(TypedDict): symbol: str quote_currency: str price: Decimal bid: Decimal | None # only on plans that include bid and ask ask: Decimal | None is_stale: bool computed_at: strclass RateLimited(Exception): """Raised on HTTP 429 so tenacity retries with backoff."""@cached(cache=TTLCache(maxsize=128, ttl=60))@retry( retry=retry_if_exception_type(RateLimited), wait=wait_exponential(multiplier=1, min=2, max=30), stop=stop_after_attempt(3), reraise=True,)def spot(symbol: str = "XAU-USD-SPOT") -> SpotResponse: """Fetch live spot price. Cached 60s per symbol, retries 3x on 429.""" resp = requests.get( f"{API_BASE}/v1/spot/{symbol}", headers={"X-API-Key": API_KEY}, timeout=TIMEOUT, ) if resp.status_code == 429: raise RateLimited(resp.text) resp.raise_for_status() data = resp.json() return { "symbol": data["symbol"], "quote_currency": data["quote_currency"], "price": Decimal(data["price"]), "bid": Decimal(data["bid"]) if data.get("bid") else None, "ask": Decimal(data["ask"]) if data.get("ask") else None, "is_stale": data["is_stale"], "computed_at": data["computed_at"], }if __name__ == "__main__": r = spot("XAU-USD-SPOT") print(f"{r['symbol']}-{r['quote_currency']}: {r['price']} (computed {r['computed_at']})")実行する
GOLDPRICE_API_KEYを設定したシェルでファイルを実行します。最初の呼び出しはAPIに接続し、60秒以内の呼び出しはキャッシュ値をすぐに返します。キャッシュはプロセス内だけに保持されるため、新しいプロセスで実行すると再取得します。プロセス間で共有する場合はRedisに保存してください。
python goldprice.py# XAU-USD: 4012.75 (computed 2026-10-23T07:00:18.221118+00:00)通貨や金属を切り替える
シンボルの形式はMETAL-CURRENCY-SPOTです。スポット価格に対応する31通貨のシンボルをspot()に渡せます。各シンボルはTTLCacheで個別にキャッシュされます。5シンボルを60s間隔で取得するダッシュボードなら、キャッシュがなければ毎分5回、キャッシュがあれば0回のAPI呼び出しになります。
# USD spot, defaultspot("XAU-USD-SPOT")spot("XAU-INR-SPOT")spot("XAU-EUR-SPOT")# Silver in USDspot("XAG-USD-SPOT")出力例
{ "symbol": "XAU", "quote_currency": "USD", "unit": "troy_ounce", "contract_type": "spot", "price": "4012.75", "is_stale": false, "computed_at": "2026-10-23T07:00:18.221118+00:00"}標準出力には、symbol、quote_currency、Decimal形式のprice、ISO 8601形式のcomputed_atタイムスタンプが同じ行に表示されます。後続のコードはTypedDict形式のレスポンスを使います。
よくあるエラー
| コード | 症状 | 対処方法 |
|---|---|---|
| 401 | requests.exceptions.HTTPError: 401 Client Error | APIキーが未設定か無効です。GOLDPRICE_API_KEYの設定をecho $GOLDPRICE_API_KEYで確認してください。空なら、ダッシュボードのキーを再設定します。環境変数がない場合、クライアントは呼び出し時ではなく読み込み時に例外を出すため、最初のimport goldpriceでエラーになります。 |
| 429 | RateLimitedがバックオフ付きの再試行に3回失敗し、例外が呼び出し元へ伝わります | 毎分の上限に達しています。一定間隔の取得なら60秒のキャッシュで防げます。異なるシンボルへの呼び出しが集中する場合は、TTLCache.maxsizeを大きくするか、呼び出しを分散してください。継続的な大量利用には、/pricingで有料プランを確認してください。 |
| N/A | 多数の価格を合計すると浮動小数点の誤差が蓄積します | 計算では常にDecimalを使い、floatに変換しないでください。クライアントは価格をDecimalで返します。JSONへの変換でもfloatにせず、str(price)を使うと、送受信時の精度を保てます。 |
活用方法
TTLCacheをRedisベースのキャッシュに置き換え、複数のワーカーで同じ価格をメモリ上で共有します/v1/bars?symbol=XAU-USD-SPOT&interval=1d&from=...&to=...用のbars()ラッパーを追加し、pandasのDataFrameに変換してバックテストに使います- 非同期サービスでは
requestsをhttpx.AsyncClientに置き換えます。レスポンスの形式は同じです - クライアントをFastAPIエンドポイントに組み込み、Python以外の社内サービスから使えるようにします
- キャッシュヒット率、p50/p95の応答時間、429時の再試行回数をPrometheusのメトリクスで公開します