튜토리얼코드

Python에서 실시간 금 시세 가져오기

Python에서 requests, Decimal 계산, 429 재시도, 60초 TTL 캐시로 goldprice.dev API를 호출하세요.

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년 시월에 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 키가 없거나 유효하지 않습니다. echo $GOLDPRICE_API_KEY로 GOLDPRICE_API_KEY 설정을 확인하세요. 비어 있다면 대시보드의 키로 다시 설정하세요. 클라이언트는 호출 시점이 아니라 모듈을 가져올 때 환경 변수 누락을 검사하므로 첫 import goldprice에서 오류가 발생합니다.
429RateLimited 재시도가 백오프 후 세 번 모두 실패하고 예외가 발생합니다분당 한도를 모두 사용했습니다. 일정한 반복 조회는 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회 요청할 수 있습니다. 신용카드는 필요하지 않습니다.

무료 키 받기