チュートリアルコード

Pythonでリアルタイムの金価格を取得する方法

Pythonからrequestsでgoldprice.dev APIを呼び出し、Decimal計算、429時の再試行、TTLが60秒のキャッシュを組み込みます。

2026年4月27日 · 読了時間:4分

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_で始まるキーが表示されます。環境変数に設定してください。

Shell
export GOLDPRICE_API_KEY=ga_live_replace_with_your_key_here

無料プランには月5,000回の呼び出しと、31通貨の金スポット価格が含まれます。クレジットカードは不要です。

必要なパッケージをインストールする

HTTP呼び出し用のrequests、プロセス内のTTLキャッシュ用のcachetools、429時の再試行用のtenacityが必要です。pipまたはuvでインストールしてください。

shell
# pippip install requests cachetools tenacity# or uv (recommended)uv add requests cachetools tenacity

goldpriceクライアントを作成する

以下をgoldprice.pyとして保存します。spot()はシンボルごとに60秒間キャッシュし、429時は指数バックオフで最大3回再試行します。価格をDecimalで返すため、後続の計算で浮動小数点の誤差が蓄積するのを防げます。

goldprice.py
# 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に保存してください。

shell
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呼び出しになります。

goldprice.py · 複数通貨
# USD spot, defaultspot("XAU-USD-SPOT")spot("XAU-INR-SPOT")spot("XAU-EUR-SPOT")# Silver in USDspot("XAG-USD-SPOT")

出力例

JSON
{  "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形式のレスポンスを使います。

よくあるエラー

コード症状対処方法
401requests.exceptions.HTTPError: 401 Client ErrorAPIキーが未設定か無効です。GOLDPRICE_API_KEYの設定をecho $GOLDPRICE_API_KEYで確認してください。空なら、ダッシュボードのキーを再設定します。環境変数がない場合、クライアントは呼び出し時ではなく読み込み時に例外を出すため、最初のimport goldpriceでエラーになります。
429RateLimitedがバックオフ付きの再試行に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のメトリクスで公開します

よくある質問

価格はどのくらいの頻度で更新されますか

スポットエンドポイントは60秒ごとに更新されます。ライセンスに基づくリアルタイムのスポット価格で、Freeとキーなしの価格は15分遅れ、有料プランはリアルタイムです。上のTTLCacheも同じ間隔を使い、60s以内のspot()呼び出しはHTTP通信を行わず、キャッシュしたDecimalを返します。

自動更新しても無料枠に収まりますか

呼び出し方によります。取引ボットが毎分取得すると1,440回/日、約43,000回/月になり、無料枠の5,000回/月を大きく超えます。キャッシュを活用し、必要なときだけ呼び出してください。毎時1回なら720回/月で無料枠に収まります。継続的な大量利用には、/pricingで有料プランを確認してください。

商用利用できますか

すべてのプランで商用利用できます。有料プランにはクレジットリンクの義務はありません。Freeでは、価格の近くにgoldprice.devへのリンクを見える形で表示する必要があります。

floatではなくDecimalを使うのはなぜですか

Decimalは正確な計算を保てます。floatでは0.1 + 0.2 == 0.30000000000000004のような誤差が生じます。多数の取引をfloatで合計すると、時間とともにベーシスポイント単位の誤差が蓄積します。APIは"4012.75"のような小数点以下2桁の文字列で価格を返すため、クライアントでDecimalを選んで計算できます。

対応している金属は何ですか

金(XAU)、銀(XAG)、銅(HG)に対応しています。プラチナとパラジウムは、どのプランでも提供していません。spot("XAG-USD-SPOT")のように、シンボルの金属コードを置き換えてください。

無料プランは本当に無料ですか

はい。月5,000回まで利用でき、クレジットカードも有効期限もありません。/onboardingでキーを取得できます。

Claudeに作成を頼めますか

はい。goldprice.devのMCPサーバーを設定したClaude Desktopを開き、次のように依頼してください。goldprice.devの/v1/spotエンドポイント用のPythonクライアントを作成してください。requests、Decimal、60秒のcachetools TTLCache、指数バックオフ付きのtenacityによる429時の再試行を使い、APIキーはGOLDPRICE_API_KEYから読み込んでください。MCPサーバーが最新のスキーマを渡すため、生成コードは最初から正しいフィールド名を使います。

続きを読む

無料のAPIキーで始める

無料プランで月5,000リクエスト利用できます。クレジットカードは不要です。

無料キーを取得