업비트 Python API: 시세 조회·정확한 서명·주문값 검증

English version

TECH INSIGHT / EXPLAINED

공개 시세·인증 조회·로컬 주문값 검증·문서화된 주문 테스트 순으로 확인합니다. HTTP 요청 성공과 실제 거래 완료는 서로 다른 단계입니다.

세 사람이 공개 시세·요청 서명·주문과 체결 기록의 차이를 설명합니다.
AI로 제작한 설명용 일러스트. 세 사람이 공개 시세·요청 서명·주문과 체결 기록의 차이를 설명합니다.

공개 시세부터 읽기

예제는 api.upbit.com을 사용하는 업비트 한국 서비스 기준입니다. KRW-BTC는 원화로 표시한 BTC 거래쌍입니다. 현재가 요청에는 개인 키가 필요하지 않습니다. JSON 첫 요소가 항상 있다고 가정하지 말고 반환된 시장과 가격을 검사합니다.

import requests
from decimal import Decimal
def read_quote(session, market='KRW-BTC'):
    with session.get('https://api.upbit.com/v1/ticker',
                     params={'markets': market}, timeout=(3, 10)) as response:
        response.raise_for_status()
        rows = response.json(parse_float=Decimal)
    if not isinstance(rows, list) or len(rows) != 1:
        raise ValueError('unexpected ticker response')
    row = rows[0]
    if not isinstance(row, dict) or row.get('market') != market:
        raise ValueError('market mismatch')
    price = Decimal(str(row['trade_price']))
    if not price.is_finite() or price <= 0:
        raise ValueError('invalid price')
    return price
# No request is made until read_quote(session) is called.

서명은 직렬화 규칙까지 맞아야 한다

인증 요청에는 현재 공식 JWT 가이드대로 새 nonce·짝이 맞는 access/secret key·권장 HS512를 사용하고, 파라미터나 본문이 있으면 SHA512 query_hash를 넣습니다. 비밀은 코드와 로그 밖에 둡니다.

해시 입력은 문서에 정의된 URL 인코딩되지 않은 쿼리 형태입니다. 순서와 배열 키 반복을 보존해야 합니다. JSON POST 본문도 전송할 동일한 값에서 이 형태를 만들며, JSON 원문 바이트를 해시하는 것과는 다릅니다. 아래는 배열 처리를 오프라인으로 확인하기 위한 가짜 파라미터 예제입니다.

import hashlib
from urllib.parse import urlencode, unquote
def signing_query(params):
    return unquote(urlencode(params, doseq=True))
params = [('market', 'KRW-BTC'), ('states[]', ['wait', 'watch'])]
query = signing_query(params)
assert query == 'market=KRW-BTC&states[]=wait&states[]=watch'
query_hash = hashlib.sha512(query.encode('utf-8')).hexdigest()
assert len(query_hash) == 128

기본 주문 세 가지 구분

지정가는 price와 volume, 시장가 매수는 ord_type=price와 지불할 호가 자산 총액, 시장가 매도는 ord_type=market과 매도할 기준 자산 수량을 씁니다. 이는 기본 형태이며 모든 지원 옵션을 나열한 것은 아닙니다. 현재 시장의 주문 가능 정보·호가 단위·최소 금액·수수료를 확인하세요.

소수 문자열과 해당 규칙에 맞는 절삭을 사용합니다. 모든 수량을 round(qty, 8)로 처리하는 것만으로 시장 조건을 검증할 수 없습니다. 0.1초 sleep도 여러 요청의 공유 한도를 조율하지 못합니다.

실제 주문 전에 경계 테스트

공식 /v1/orders/test는 실제 주문 생성 없이 주문값과 주문 가능 상태를 검증합니다. 응답 식별자를 실제 주문처럼 조회·취소할 수 없고 해당 권한도 필요합니다. 체결이나 수익성을 모의하는 기능은 아닙니다.

실제 주문에서는 응답 주문 ID를 저장하고 체결·잔여량을 대조합니다. 제출 타임아웃이면 문서의 식별자로 확인한 다음 재전송 여부를 판단합니다. 401은 오류 이름과 권한·IP·서명 입력을 보고 진단해야 합니다. 대부분 특정 원인이라고 단정하지 마세요. 이 입문 과정에 출금 권한은 필요하지 않습니다.

공식 자료와 함께 읽기

Upbit authentication · Current ticker API · Create order · Test order · Rate limits

내용·예제 검토: 2026-09-29

댓글