프로그래밍/Python

[Python] 2. 업비트 자동매매 프로그램 만들기 - 업비트 API 연동 (자산 및 코인 조회, 티커 csv생성)

록스타★ 2024. 12. 28. 13:11
반응형

이전 포스팅으로 환경구성을 먼저 진행하였고, 오늘은 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

 

반응형