이전 포스팅으로 환경구성을 먼저 진행하였고, 오늘은 API 연동을 진행하여 자산 및 코인 정보를 조회할 수 있도록 하겠습니다. 환경구성을 진행하지 못하신 분들은 환경구성 포스팅을 먼저 봐주세요~
https://94-rokstar.tistory.com/entry/Python-1-%EC%97%85%EB%B9%84%ED%8A%B8-%EC%9E%90%EB%8F%99%EB%A7%A4%EB%A7%A4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0
[Python] 1. 업비트 자동매매 프로그램 만들기 - 환경구성
안녕하세요. 요즘 코인이 다시 불티나게 유행하는 거 같아서 한국에서 가장 큰? 업비트 자동매매 프로그램을 만드는 것을 진행해보겠습니다. 저도 처음이라 다른 블로그 포스팅을 참고하며, 만
94-rokstar.tistory.com
사전준비
1. 우선 업비트와 연동하기 위해 터미널에서 라이브러리를 설치합니다.
pip install pyupbit
2. 라이브러리 설치 후 환경구성 시 발급받은 Access Key, Secret Key를 txt파일에 저장 후 파이썬 스크립트 디렉터리에 함께 넣어주세요.
기본 코드
1. API 키 불러오기 - txt 파일을 열어서 첫 줄(access_key), 둘째 줄(secret_key) 값을 읽어오는 부분입니다.
# 1. Upbit API 키 정보 읽기
# -----------------------------------------
# key.txt 파일에 첫 줄: Access Key
# 둘째 줄: Secret Key
with open ( "skyKey.txt" , "r" ) as f :
access_key = f . readline (). strip ()
secret_key = f . readline (). strip ()
2. upbit 인스턴스 생성 - Pyupbit 라이브러리에서 제공하는 Upbit 클래스를 사용하여 실제 거래를 요청할 수 있게 객체를 생성하고, 생성된 upbit 인스턴스를 통해 정보 조회 및 코인 주문, 체결 실행할 수 있습니다.
# 2. Upbit 인스턴스 생성
upbit = pyupbit . Upbit ( access_key , secret_key )
3. 코인 티커 지정 - 거래하고자 하는 코인 티커를 지정하며, 기본적으로 티커의 정보는 알고 계셔야합니다. - 예) KRW-BTC, KRW-ETH, KRW-XRP 등 아래 그림처럼 2개 조회 가능
# =========================================
# 3. 사용할 코인 티커 지정
# 예) "KRW-BTC", "KRW-XRP", "KRW-ETH" 등
# =========================================
coin = "KRW-BTC", "KRW-XRP"
4. 원화 잔고 조회 - 계정에 남아 있는 보유 원화(KRW) 잔액을 가져오는 함수입니다. - get_balance_cash()
def get_balance_cash ():
"""보유 원화(KRW) 조회"""
return upbit . get_balance ( "KRW" )
5. 현재 시세 조회 - 특정 코인 실시간 가격을 조회합니다. - get_cur_price(ticker)
def get_cur_price ( ticker ):
"""특정 코인 현재 시세 조회"""
return pyupbit . get_current_price ( ticker )
6. 보유 코인 수량 조회 - 계정에서 보유중인 코인의 수량을 조회합니다. - get_balance_coin(ticker)
def get_balance_coin ( ticker ):
"""특정 코인 보유수량 조회"""
return upbit . get_balance ( ticker )
7. 평균 매수 단가 조회 - 평균 매입 단가를 조회합니다. - get_buy_avg(ticker)
def get_buy_avg ( ticker ):
"""특정 코인의 평균 매수 단가 조회"""
return upbit . get_avg_buy_price ( ticker )
8. 주문 정보 조회 - upbit.get_order() 함수로 전달된 티커(예: KRW-BTC) 또는 주문 번호 (UUID)에 대해 미체결 주문 정보를 조회합니다. - get_order_info(ticker_or_uuid)
def get_order_info ( ticker_or_uuid ):
"""
특정 티커(KRW- XXX ) 또는 주문 UUID에 대한
미체결 주문 정보를 조회한다.
"""
try :
orders = upbit . get_order ( ticker_or_uuid )
# orders는 최근 주문부터 [0], 가장 마지막 주문이 [-1]
# 'error' 키가 있으면 오류로 간주
if orders and "error" in orders [ 0 ]:
return None
return orders [ - 1 ] if orders else None
except Exception as e :
print ( "Error:" , e )
return None
9. 전체 KRW 마켓 티커 조회 - GET /market/all API를 직접 호출해 전체 마켓 데이터를 가져온 뒤 KRW-로 시작하는 마켓만 필터링해 {한글 이름: 티커} 형식의 딕셔너리로 추려냅니다. - get_ticker_list()
def get_ticker_list ():
"""
업비트 전체 마켓 정보 조회 후,
KRW-마켓만 추려서 {한글이름: 티커} 형태로 리턴
예: {'비트코인': 'KRW-BTC', '리플': 'KRW-XRP', ...}
"""
res = requests . get ( url ). json ()
ticker_dict = {}
for item in res :
market = item [ "market" ]
if market .startswith( "KRW-" ):
kr_name = item [ "korean_name" ]
ticker_dict [ kr_name ] = market
return ticker_dict
10. 실제 실행 테스트 및 조회 확인 - if__name__=="__main__": 블록 내부에 간단히 함수를 호출해서 결과를 출력하고, 보유 원화, 시세, 수량 등 터미널창에서 바로 확인할 수 있습니다. - 마지막으로 전체 코인 목록 (한글 이름 ↔ 티커) 조회 예시를 출력하여, 업비트에 현재 상장된 원화 마켓 전체를 확인합니다.
if __name__ == "__main__" :
print ( "# 보유 원화:" , get_balance_cash ())
print ( f "# { coin } 현재 시세:" , get_cur_price ( coin ))
print ( f "# { coin } 보유 수량:" , get_balance_coin ( coin ))
print ( f "# { coin } 평균 매수가:" , get_buy_avg ( coin ))
print ( f "# { coin } 미체결 주문 정보:" , get_order_info ( coin ))
# 전체 KRW-마켓 티커 가져오기 (옵션)
all_tickers = get_ticker_list ()
print ( f " \n # 전체 KRW-마켓 코인 개수: { len ( all_tickers ) } " )
if '리플' in all_tickers :
print ( "리플의 티커:" , all_tickers [ '리플' ])
결과
전체 코드
import pyupbit
import requests
# 1. Upbit API 키 정보 읽기
# -----------------------------------------
# key.txt 파일에 첫 줄: Access Key
# 둘째 줄: Secret Key
with open ( "skyKey.txt" , "r" ) as f :
access_key = f . readline (). strip ()
secret_key = f . readline (). strip ()
# 2. Upbit 인스턴스 생성
upbit = pyupbit . Upbit ( access_key , secret_key )
# 3. 사용할 코인 티커 지정
# 예) "KRW-BTC", "KRW-XRP", "KRW-ETH" 등
coin = "KRW-BTC"
# 4. 조회용 함수들 정의
def get_balance_cash ():
"""보유 원화(KRW) 조회"""
return upbit . get_balance ( "KRW" )
def get_cur_price ( ticker ):
"""특정 코인 현재 시세 조회"""
return pyupbit . get_current_price ( ticker )
def get_balance_coin ( ticker ):
"""특정 코인 보유수량 조회"""
return upbit . get_balance ( ticker )
def get_buy_avg ( ticker ):
"""특정 코인의 평균 매수 단가 조회"""
return upbit . get_avg_buy_price ( ticker )
def get_order_info ( ticker_or_uuid ):
"""
특정 티커(KRW- XXX ) 또는 주문 UUID에 대한
미체결 주문 정보를 조회한다.
"""
try :
orders = upbit . get_order ( ticker_or_uuid )
# orders는 최근 주문부터 [0], 가장 마지막 주문이 [-1]
# 'error' 키가 있으면 오류로 간주
if orders and "error" in orders [ 0 ]:
return None
return orders [ - 1 ] if orders else None
except Exception as e :
print ( "Error:" , e )
return None
def get_ticker_list ():
"""
업비트 전체 마켓 정보 조회 후,
KRW-마켓만 추려서 {한글이름: 티커} 형태로 리턴
예: {'비트코인': 'KRW-BTC', '리플': 'KRW-XRP', ...}
"""
res = requests . get ( url ). json ()
ticker_dict = {}
for item in res :
market = item [ "market" ]
if market .startswith( "KRW-" ):
kr_name = item [ "korean_name" ]
ticker_dict [ kr_name ] = market
return ticker_dict
# 5. 실행 테스트 (메인 실행부)
if __name__ == "__main__" :
print ( "# 보유 원화:" , get_balance_cash ())
print ( f "# { coin } 현재 시세:" , get_cur_price ( coin ))
print ( f "# { coin } 보유 수량:" , get_balance_coin ( coin ))
print ( f "# { coin } 평균 매수가:" , get_buy_avg ( coin ))
print ( f "# { coin } 미체결 주문 정보:" , get_order_info ( coin ))
# 전체 KRW-마켓 티커 가져오기 (옵션)
all_tickers = get_ticker_list ()
print ( f " \n # 전체 KRW-마켓 코인 개수: { len ( all_tickers ) } " )
if '리플' in all_tickers :
print ( "리플의 티커:" , all_tickers [ '리플' ])
아래 코드를 사용하시면 코인의 한글이름, 영문이름, 마켓 관련하여 csv파일로 출력되니 티커 정보가 필요 하신분들은 참고하시면 될 것 같습니다.
한글이름
영문이름
마켓
비트코인
Bitcoin
KRW-BTC
이더리움
Ethereum
KRW-ETH
이더리움
Ethereum
BTC-ETH
리플
Ripple
BTC-XRP
import requests
import csv
def get_upbit_markets ():
"""
업비트 전체 마켓 정보를 가져온 뒤,
(market, korean_name, english_name) 필드를 추출하여 리턴
"""
params = { "isDetails" : "true" } # 상세 정보 포함하려면 true
response = requests . get ( url , params = params )
data = response . json ()
market_info_list = []
for item in data :
# 예: {"market":"KRW-BTC", "korean_name":"비트코인", "english_name":"Bitcoin", ...}
market_info_list . append ({
"market" : item [ "market" ],
"korean_name" : item [ "korean_name" ],
"english_name" : item [ "english_name" ]
})
return market_info_list
def save_to_csv ( market_info_list , filename = "upbit_markets.csv" ):
with open ( filename , "w" , newline = "" , encoding = "utf-8-sig" ) as f :
writer = csv . writer ( f )
# 헤더 작성
writer . writerow ([ "한글이름" , "영문이름" , "마켓" ])
for info in market_info_list :
# 설명 부분은 실제로는 임의로 추가해야 함
# 여기서는 기본적으로는 빈 문자열("")로 두거나,
# 필요시 info에 추가 항목을 넣어 활용 가능
writer . writerow ([
info [ "korean_name" ],
info [ "english_name" ],
info [ "market" ],
""
])
if __name__ == "__main__" :
markets = get_upbit_markets ()
save_to_csv ( markets )
print ( "업비트 전체 마켓 정보를 CSV 파일로 저장 완료!" )
참조
https://mcc96.tistory.com/25
(Python) 업비트 자동 매매 프로그램 만들기(2) - 정보 조회
Summary 지난 게시물에서 업비트 자동 매매 프로그램을 만들기 위해서 필요한 환경을 구성해 보았습니다. 이어서 이번 게시물에서는 업비트 자동 매매 프로그램 만들기 2탄 업비트 사이트에서 정
mcc96.tistory.com