Python 3줄로 Crypto Exchange API에 연결했습니다
Source: Dev.to
파이썬 3줄로 암호화폐 거래소 API에 연결하기
요즘은 대부분의 암호화폐 거래소가 RESTful API를 제공하고, 파이썬용 래퍼 라이브러리도 잘 갖춰져 있습니다.
덕분에 복잡한 인증 과정을 직접 구현하지 않아도 몇 줄만으로 바로 데이터를 받아올 수 있죠.
아래 예시는 ccxt 라는 유명한 파이썬 라이브러리를 사용해 Binance 에 연결하고, 현재 BTC/USDT 시세를 가져오는 가장 간단한 코드입니다.
import ccxt
exchange = ccxt.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
})
print(exchange.fetch_ticker('BTC/USDT'))
코드 설명
| 라인 | 내용 |
|---|---|
| 1 | ccxt 라이브러리를 임포트합니다. (pip install ccxt 로 미리 설치해 주세요.) |
| 3‑5 | ccxt.binance 객체를 생성하면서 API 키와 시크릿을 전달합니다. 읽기 전용 작업이라면 키 없이도 동작하지만, 주문·출금 등 민감한 작업을 할 경우 반드시 키가 필요합니다. |
| 7 | fetch_ticker 메서드에 거래쌍('BTC/USDT')을 넘겨 현재 시세 정보를 딕셔너리 형태로 반환합니다. 반환값에는 last, bid, ask, high, low 등 다양한 필드가 포함됩니다. |
왜 이렇게 간단할까?
- 통합 인터페이스:
ccxt는 100개가 넘는 거래소에 대해 동일한 메서드 이름과 파라미터 체계를 제공하므로, 거래소를 바꾸어도 코드를 거의 그대로 유지할 수 있습니다. - 자동 서명: API 요청에 필요한 HMAC 서명, 타임스탬프 삽입 등을 라이브러리가 자동으로 처리해 줍니다.
- 에러 핸들링: 네트워크 오류나 레이트 리밋 초과 시
ccxt가 정의한 예외 클래스를 던져주므로,try/except로 간단히 잡아낼 수 있습니다.
실전 활용 팁
-
환경 변수 사용
API 키와 시크릿을 코드에 직접 적는 대신 환경 변수(os.getenv)를 활용하면 보안이 강화됩니다.import os, ccxt exchange = ccxt.binance({ 'apiKey': os.getenv('BINANCE_API_KEY'), 'secret': os.getenv('BINANCE_SECRET'), }) -
비동기 버전
고빈도 데이터 수집이 필요하다면ccxt.async_support를 사용해 비동기 호출로 전환할 수 있습니다.import asyncio, ccxt.async_support as ccxt async def main(): exchange = ccxt.binance() ticker = await exchange.fetch_ticker('BTC/USDT') print(ticker) await exchange.close() asyncio.run(main()) -
레이트 리밋 관리
대부분의 거래소는 초당 호출 횟수에 제한을 두고 있습니다.ccxt는rateLimit속성을 제공하므로,time.sleep(exchange.rateLimit / 1000)로 간단히 대기 시간을 삽입할 수 있습니다.
마무리
파이썬 3줄만으로도 실시간 시세를 받아올 수 있다는 점은, 프로토타이핑이나 데이터 분석 단계에서 큰 장점이 됩니다.
복잡한 인증 로직을 직접 구현할 필요 없이 ccxt 같은 라이브러리를 활용하면, 코드 가독성도 높아지고 유지보수 비용도 크게 줄어듭니다.
Tip: 실제 거래를 자동화하려면 반드시 테스트넷에서 충분히 검증하고, 예외 처리와 자금 관리 로직을 추가하세요.
이 글은 원본을 한국어로 번역한 것이며, 원본 내용과 차이가 있을 경우 원본을 참고해 주세요.
암호화폐 거래소에 연결해 트레이딩 봇을 만들 필요가 있었습니다
APIs는 위협적으로 들렸습니다. 그런데 파이썬 라이브러리 하나만 설치하면 세 줄만에 내 잔액을 확인할 수 있었습니다. 거기서 실제 주문을 넣는 것까지는 그리 어렵지 않았습니다.
여기 전체 과정—계정 생성부터 파이썬으로 첫 주문을 넣는 것까지, 그 과정에서 제가 저지른 모든 실수를 포함합니다.
API 키란 무엇인가요?
코드가 웹사이트에 로그인하지 않고도 거래소와 직접 통신할 수 있게 해 주는 비밀번호와 같습니다. 이 키를 파이썬 스크립트에 넘겨주면, 코드가 즉시 다음을 할 수 있습니다:
- 잔액 확인
- 가격 데이터 가져오기
- 주문하기
왜 이렇게 해야 할까요? 수동 거래는 차트를 24시간 내내 바라보는 것을 의미합니다. 새벽 3시의 급락을 놓치는 이유는 잠들어 있기 때문이고, “아마 더 오를지도 몰라”라며 너무 오래 보유하게 됩니다. API를 사용하면 그 작업을 봇에게 맡길 수 있습니다.
거래소 선택
자동 매매에서는 수수료가 무엇보다 중요합니다. 봇이 한 달에 열 번 거래한다면, 수수료 차이 0.1 %가 1년 동안 누적됩니다.
| 거래소 | Maker Fee | 전 세계 접근성 | ccxt 지원 |
|---|---|---|---|
| MEXC | 0 % (현물) | Yes | Yes |
| Bitget | 0.1 % | Yes | Yes |
| OKX | 0.08 % | Yes | Yes |
저는 Bitget에서 봇을 운영하고 있지만, 오늘부터 시작한다면 MEXC 를 선택할 것입니다 – 현물 거래에서 메이커 수수료가 0이기 때문입니다. 자동으로 거래되는 봇에게는 이것이 테이블에 남겨두지 않을 무료 수익과 같습니다. 계정 생성은 무료이며 약 5분 정도 걸립니다.
API 키 만들기
계정이 있으면:
- 로그인 → 프로필 아이콘 → API 관리
- “Create API Key” 클릭
- 권한: Read와 Trade 활성화. Withdraw는 OFF 상태로 두세요 – 절대 켜지 마세요.
- API 키와 시크릿을 복사
프로젝트에 .env 파일에 저장:
API_KEY=your_api_key_here
API_SECRET=your_secret_here
첫 커밋 전에 .env를 .gitignore에 추가하세요. API 키를 GitHub에 푸시하면, 축하합니다 — 전체 인터넷에 거래소 자격 증명을 공개한 겁니다.
Source: …
ccxt와 연결하기
ccxt는 100개 이상의 거래소와 동일한 인터페이스로 통신할 수 있는 Python 라이브러리입니다. MEXC용으로 작성한 코드는 Bitget, Binance, OKX에서도 동일한 문법으로 동작합니다.
pip install ccxt python-dotenv
잔액 조회 (세 줄 코드)
import ccxt
import os
from dotenv import load_dotenv
load_dotenv()
exchange = ccxt.mexc({
'apiKey': os.getenv('API_KEY'),
'secret': os.getenv('API_SECRET'),
'enableRateLimit': True, # 요청을 자동으로 제한
})
# 실제 작업 — 세 줄
balance = exchange.fetch_balance()
usdt = balance['USDT']['total']
print(f'USDT balance: {usdt}')
그게 전부입니다. 바로 동작합니다.
enableRateLimit: True는 ccxt가 요청을 자동으로 제한하도록 합니다. 이를 설정하지 않으면 API를 너무 빨리 호출해 429 오류가 발생합니다.
캔들스틱 데이터 가져오기
ohlcv = exchange.fetch_ohlcv('BTC/USDT', '1d', limit=30)
# → [[timestamp, open, high, low, close, volume], ...]
한 줄로 일일 캔들 30일치를 받아올 수 있습니다. 이를 pandas DataFrame에 넣고 지표를 계산하면 트레이딩 봇의 기본 골격이 완성됩니다.
첫 주문하기
실제 돈으로 시작하지 마세요. 먼저 DRY_RUN 모드를 구축하세요. 코드는 전체 파이프라인을 통과합니다 — 가격을 가져오고, 신호를 계산하고, 매수 여부를 결정하지만 실제 주문을 보내는 마지막 단계는 건너뜁니다.
DRY_RUN으로 일주일 동안 실행하세요. 이상 현상이 없으면 소액(예: $1 USDT)으로 라이브 전환하세요.
# Market buy
if not DRY_RUN:
order = exchange.create_market_buy_order('BTC/USDT', amount)
print(f'Order placed: {order["id"]}')
else:
print(f'[DRY_RUN] Skipping order: BTC/USDT {amount}')
간단합니다. 시장 주문은 create_market_buy_order, 지정가 주문은 create_limit_buy_order를 사용하세요. ccxt는 거래소 간 차이를 추상화하므로 MEXC용으로 작성한 코드는 이론적으로 Bitget에서도 동작합니다(실제로는 가끔씩 quirks가 있지만 대부분 잘 동작합니다).
나를 헷갈리게 만든 것들
| 이슈 | 발생 상황 | 해결/완화 방안 |
|---|---|---|
| 요청 제한 | 개발 중에 API를 빠른 루프에서 호출하면서 enableRateLimit을 사용했음에도 429 오류가 발생했습니다. | 초당 약 1회 요청 수준으로 유지하거나, 루프에 time.sleep(1)을 명시적으로 추가하세요. |
| 출금 권한 활성화 | 첫 키를 만들 때 실수로 출금을 활성화했습니다. | 출금은 OFF 상태로 유지하세요. 만약 활성화했다면 즉시 키를 재생성하십시오. |
.env 파일을 git에 커밋 | API 키를 공개 저장소에 푸시했습니다. | 첫 커밋 전에 .env를 .gitignore에 추가하세요. 이미 푸시했다면 키를 폐기하고 새 키를 생성하세요. |
| 타임스탬프 오차 | 컴퓨터 시계가 몇 분 정도 차이 나서 InvalidNonce / Timestamp outside recv_window 오류가 발생했습니다. | NTP 시간 동기화를 활성화하세요(예: Linux에서는 ntpdate pool.ntp.org). |
| 최소 주문 금액 | Bitget에서 $1 주문을 시도했지만 조용히 실패했습니다. | 각 거래소의 최소 주문 크기를 확인하세요(Bitget은 BTC/USDT 현물 기준 약 $5, MEXC는 약 $1). |
아직 거래소 계정이 없으시다면, 여기에서 계정을 만들 수 있습니다. 수수료가 없으면 봇을 운영할 때 정말 큰 차이가 납니다.
마무리
API 접근은 예상보다 훨씬 쉬웠습니다. ccxt가 복잡한 부분—인증, 속도 제한, 거래소별 특이점—을 처리해 주므로 전략 자체에 집중할 수 있습니다. 코딩을 즐기시고, 책임감 있게 거래하세요!
Quick Setup Checklist
- 출금 권한 → OFF
.env→ 절대로 Git에 커밋하지 않기DRY_RUN로 시작하기- 첫 실전 테스트 → $1 USDT
Once you have this working, the next step is to write the trading logic: compute a technical indicator, generate a signal, and execute the trade. I began with an EMA Crossover strategy—that’s a story for another post.
이 게시물은 개인적인 경험을 바탕으로 합니다. 재정 조언이 아니며—손실을 감당할 수 있는 자금으로 위험을 감수하고 거래하십시오. 이 게시물에는 제휴 링크가 포함되어 있습니다.