콘텐츠로 건너뛰기
Home » 업비트 Open API로 코인 자동 매매 구현 예제 코드

업비트 Open API로 코인 자동 매매 구현 예제 코드

가상화폐 자동매매가 왜 필요한가?

요즘 “투자” 방안으로 주식, 부동산 등을 모르는 사람이 없을 겁니다. 그런데 몇년 전부터 떠오르는 “핫한” 투자 대상이 있습니다. “가상화폐”입니다.

최근에 방송이나 기사를 보면 “가상화폐” 에 대한 뉴스가 끊임없이 나오고 있습니다. 심지어 “엘살바도르” 라는 나라는 “비트코인”을 법정 통화로 지정하기까지 한 상태입니다.

이렇듯 기존 통화나 자산의 개념과 약간 다르지만 비트코인이나 이더리움으로 대표되는 “가상화폐”는 그 값어치를 서서히 인정을 받고 있습니다. 또한 이들을 정식으로 거래하는 거래소가 국내에서 운영되고 있고 수많은 사람들이 거래소에 상장된 “가상화폐”를 거래하고 있는 중입니다.

가상화폐인 비트코인

여전히 “가상화폐”를 거부하거나 반대하는 전문가들이 존재합니다. 그럼에도 가상화폐는 이미 “자산”으로 인정이 되고 있으며 주식과 마찬가지로 국내외의 거래소에서 활발하게 거래되는 중입니다.

아직까지는 대부분의 국가들이 “가상화폐”를 법정 통화로 인정을 하고 있지는 않습니다. 하지만 시대의 흐름으로 볼 때 가상화폐는 “자산”으로 평가될 가능성이 높아 보입니다. 언론에서는 유명인이나 모 연예인의 가상화폐 투자 성공담이 오르내립니다. 또한 수많은 사람들이 이미 국내외의 거래소에서 가상화폐를 투자하고 수익을 내고 있는 중입니다.

이런 상황에서 “가상화폐”에 투자를 조금씩이라도 하는게 기회를 창출할 수 있습니다. 많은 금액으로 가상 화폐에 투자를 하는 것은 위험 부담이 클 수 있으므로 본인의 자산에게 적절한 비율로 포트폴리오를 짜는 것도 괜찮은 방법입니다.

그런데 주식과 달리 “가상 화폐”는 24간 365일 국내외의 거래소에서 거래가 이루어집니다. 따라서 수시로 변동하는 시세에 대응하여 단기간에 수익을 얻는것은 생각보다 쉽지 않습니다.

수시로 가격이 변하는 상황에서 매수/매도를 과연 언제 해야 할까요? 당신이 일반 직장인이라면 평일 오전/오후 시간에 거래소 앱을 들여다 보면서 매수/매도 타이밍을 계속 확인해야 할까요?

참 어렵다고 볼 수 있습니다. 특히 평일에 오전/오후 시간에 직장에서 일을 하면서 가상화폐의 시세를 확인하면서 거래를 하는게 결코 쉽지 않습니다.

저는 그래서 가상화폐 거래를 컴퓨터에 맡기기로 했습니다. 즉 “자동매매”를 구현하여 가상화폐를 매매하기로 하였고 현재 “업비트”의 Open API로 가상화폐를 자동으로 매매를 하고 있는 중입니다.

위 글은 업비트의 Open API 를 사용하기 위해 가입 절차를 설명한 글입니다. 만약 업비트의 Open API로 가상화폐 자동 매매 시스템을 구축하려 하신다면 위 글을 참고하셔서 업비트에 가입하시기 바랍니다.

가상화폐 자동매매를 위한 준비 사항

최근에 저는 이미 “주식 자동매매”를 통해 주식을 매매하고 있는 중입니다. 언어는 파이썬을 사용하였고 한국투자증권의 Open API를 통해 자동 매매를 하고 있습니다.

파이썬 + Open API 조합으로 자동매매를 구현하는 것은 쉽지는 않지만 어느정도 파이썬을 다룰줄 알면 누구나 가능합니다. 저도 직장을 다니면서 틈틈히 파이썬으로 자동 매매 시스템을 구축하였고 자동 매매 시스템을 통해 최근에 약간의 수익도 발생하였습니다.

가상화폐 자동매매도 원리는 비슷합니다. 파이썬과 업비트의 Open API에 가입하면 누구나 “가상 화폐 자동 매매 시스템”을 구축하는게 가능합니다.

따라서 가상화폐를 업비트의 Open API로 자동매매를 하기 위해서 필요한 준비물 및 지식은 다음과 같습니다.

  • 파이썬 기본 문법 지식
  • 거래소 Open API 계정
  • Open API 사용법
  • 자동 매매 머신(Windows PC도 괜찮으나 전 리눅스 기반의 PC나 머신을 추천드립니다)
  • 가상화폐 자동 매매 관련 참고 서적
  • 리눅스 지식(머신의 OS가 리눅스 일때)

참고로 저는 가상 화폐 자동 매매 관련하여 “조대표” 님의 “파이썬을 이용한 비트코인 자동매매” 를 참고하여 개발을 진행했습니다.

파이썬을 이용한 비트코인 자동매매:실시간 자동매매 시스템 개발 입문, 파이스탁, 9791196608804, 유부장,조대표 공저

관련 서적은 위의 링크를 통해서도 구입을 하실 수 있습니다.

위의 준비사항 중에 “자동 매매 머신”은 리눅스를 추천하는 이유는 리눅스는 가상 클라우드 서비스든 머신이든 간에 별도의 비용이 들지 않으며(Windows는 비용이 비쌈) 사양이 낮은 머신에서도 가상 화폐 자동 매매 시스템을 구축하기가 수월합니다.

저는 집에 시놀로지 NAS로 “Docker” 를 사용해 우분투 리눅스에 자동 매매 시스템을 구축하였으며 현재까지 큰 문제 없이 “가상 화폐 자동매매” 시스템을 구동중입니다. 만약 집에 시놀로지 NAS를 구입하여 사용하기 부담스럽다면 월 1만원 미만의 금액으로 “AWS Lightsail” 같은 클라우드 서비스를 사용해도 무방합니다. 본인이 사용하기 편리한 머신으로 구축하면 됩니다.

개인적으로는 리눅스 기반의 머신으로 구축하시길 추천드립니다.

업비트 Open API 를 사용한 자동매매 예제코드

그럼 파이썬 + 업비트 Open API로 자동 매매 시스템을 구축하기 위한 예제코드를 공유를 해 보겠습니다. 이 코드에는 자동 매매 전략에 대한 코드는 없으며 자동 매매를 하기 위한 기본 코드라고 보시면 되겠습니다.

저는 “pyupbit” 라는 파이썬 모듈을 사용하여 자동매매 시스템을 개발하였습니다. 따라서 아래 코드를 사용하려면 pyupbit 라는 파이썬 모듈을 별도로 설치를 해야 합니다.

  • pip install pyupbit

위와 같이 pyupbit 모듈을 설치를 해 주세요.

# -*- coding: utf-8 -*-
import pprint
import pandas as pd
import sys
from time import sleep
import datetime
import os
import pyupbit
import traceback

access_key = "내 계정의 access_key 값"
secret_key = "내 계정의 secret_key 값"

upbit = pyupbit.Upbit(access_key, secret_key)


class trCoinBot:
    def __init__(self):
        #print(pyupbit.Upbit)
        tickers = pyupbit.get_tickers()
        #print(tickers)

    def calTime(self):
        # 날짜 계산
        self.current = datetime.datetime.now()
        self.now_year = self.current.strftime("%Y")
        self.now_date = datetime.date.today().isoformat()

    def marketTimeCheck(self):
        # 현재 시간을 숫자로 계산한다. 
        self.current = datetime.datetime.now()
        self.now_time = (self.current.hour * 100) + self.current.minute


    def getAccBalance(self):
        # 계좌 잔고 조회
        r = upbit.get_balances()
        #print(r)

        r_balance = {}  
        # krw_balance : 보유중인 원화 잔고
        # avilable_krw : 매수 가능한 원화 잔고
        # coin_balance : 보유중인 코인 잔고
        # avg_buy_price : 보유중인 코인 매수 평단가
        # profit : 보유중인 코인 수익률

        fee = 0.05  # 거래 수수료
        # 자료형은 딕셔너리이다.
        try:
            # 현재 원화 잔고 얻어오기
            money =  float(r[0]['balance'])

            if r[0]['currency'] == 'KRW':
                print("현재 잔고는 원화로 %f 원 입나다." % money)

            r_balance['krw_balance'] = money

            # 매수 가능 금액 계산
            if money > 0: # 잔고가 있을때
                v = money * fee 
                r_balance['avilable_krw'] = money - v
                print("매수 가능 금액 : %f" % r_balance['avilable_krw'])
            else:
                r_balance['avilable_krw'] = 0
                print("매수 가능한 잔고가 없습니다.")

        except:
            print("계좌 잔고 값 얻어오기에서 에러가 발생했습니다.")
            r_balance['krw_balance'] = 0
            r_balance['coin_balance'] = 0
            r_balance['avg_buy_price'] = 0
            r_balance['avilable_krw'] = 0
            r_balance['profit'] = 0

            # 코인 보유량 얻어오기
        try:
            get_coin = float(r[1]['balance'])
            if get_coin > 0: 
                print("현재 보유중인 코인은 %0.15f 입니다." % get_coin)
                r_balance['coin_balance'] = get_coin
            else:
                print("코인이 없습니다.")
                r_balance['coin_balance'] = 0

            # 코인 평단가 얻어오기
            avg_buy_price = float(r[1]['avg_buy_price'])
            if avg_buy_price > 0:
                print("현재 보유중인 코인의 평균 단가는 %f 입니다" % avg_buy_price)
                r_balance['avg_buy_price'] = avg_buy_price
            else:
                r_balance['avg_buy_price'] = 0
            
            # 코인 수익률 계산
            if avg_buy_price > 0: # 잔고가 있을 경우
                now_price = self.getNowPrice("KRW-ETH")
                profit = ((now_price / avg_buy_price) - 1) * 100
                print("현재 보유중인 코인의 수익률은 %f 입니다. 현재가:%d, 보유가:%f" % (profit, now_price, avg_buy_price))
                r_balance['profit'] = profit
            else:
                r_balance['profit'] = 0

        except:
            print("코인 잔고가 없거나 얻어오기에서 에러가 발생했습니다.")
            r_balance['coin_balance'] = 0
            r_balance['avg_buy_price'] = 0
            r_balance['profit'] = 0

        return r_balance
        

    def buyOrderMarket(self, t, volume):
        print("시장가주문")
        # volume 는 매수 금액. 원화로 환산하여 주문한다.
        try:
            r = upbit.buy_market_order(t, volume)
            print(r)

        except:
            print("매수 주문이 실패하였습니다.")
  
    def sellOrderMarket(self, t, volume):
        print("시장가매도")
        # t는 코인의 종류(티커) 예를 들면 이더리움은 KRW-ETH, volume 은 보유 수량
        # volume에는 매도할 수량을 적는다. 최소 매도 수량은 원화로 5,000원 이상이어야 한다. 
        try:
            r = upbit.sell_market_order(t, volume)
            print(r)

        except:
            print("매도 주문이 실패하였습니다.")

    def getNowPrice(self, ticker):
        # 현재가 조회
        try:
            price = pyupbit.get_current_price([ticker])
            #print(price)

            return price
        except:
            print("현재가 조회시 오류가 발생하였습니다.")

            return 0
             

    def getOhlcv(self, t):
        # 일별 데이터 조회
        r = pyupbit.get_ohlcv(ticker=t)
        #print(type(r))

        return r.tail(2)

    def getOrderBook(self, t):
        # 호가 조회
        r = pyupbit.get_orderbook(ticker=t)
        print(r)


def main():
    c = trCoinBot()


if __name__ == "__main__":
    main()

위 코드는 업비트 Open API 와 파이썬으로 짠 기본 코드입니다. 여기서는 기본 기능인 계좌 잔고 조회, 현재가 조회, 일별 데이터 조회, 호가 조회, 시장가 매수/매도 등의 함수들이 클래스로 구현되어 있습니다. 이 코드를 토대로 본인의 전략을 첨가하여 루프를 돌려서 자동 매매 시스템을 구축하면 됩니다.

실제로 위 코드로 매수/매도가 잘 되는 것을 확인하였습니다. 대신에 위에서 언급한 매수/매도는 “시장가” 이므로 “지정가”를 통해 매수/매도 주문을 하려면 아래 조대표 님의 pyupbit 관련 내용을 참고하셔서 코드를 만드면 됩니다.

현재 저는 위 코드를 기반으로 “가상 화폐 자동 매매 시스템”을 구동중입니다. 아직은 큰 성과가 있진 않지만 조금 시간이 지나야 할걸로 보입니다. 추후에 매매 결과에 대해서는 조금 시간이 지난 후에 공유를 해보도록 하지요.

“이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.”

답글 남기기

이메일 주소는 공개되지 않습니다.