IT트렌드

파이썬과 업비트 API로 암호화폐 자동매매 시스템 개발하기

8million 2025. 4. 26. 22:31

 

최근 암호화폐 시장은 엄청난 변동성으로 인해 수익을 내기가 쉽지 않은 환경이 되었다. 시시각각 변하는 시장을 사람이 지속적으로 모니터링하고 정확한 매매 타이밍을 잡는 것은 사실상 불가능에 가깝다. 이에 많은 투자자들이 자동화된 시스템을 통해 시장 대응력을 높이려는 노력을 하고 있다. 이번 글에서는 파이썬을 활용해 업비트(Upbit) API 기반의 실시간 자동매매 시스템을 개발한 과정과 그 기술적 로직에 대해 상세히 서술하고자 한다.

 

이 글에서는 단순히 코드를 나열하는 것이 아니라, 각 기능을 어떻게 설계했으며, 어떤 문제를 마주했고, 그것을 파이썬 코드로 어떻게 해결했는지까지 상세히 설명한다. 특히, RSI, EMA, 일목균형표를 활용한 전략 로직, 손절 및 익절 기능, 정교한 타이밍 로직 등 실제 개발 과정에서 필수적으로 고민해야 하는 내용들에 중점을 두었다.


🔸 프로젝트 초기 환경 구축 (Docker + Flask + PyUpbit)

 

가장 먼저 수행한 단계는 자동매매 환경을 구축하는 것이었다. 파이썬을 사용한 자동매매 시스템 개발 시 필수적으로 갖추어야 하는 요소는 다음과 같다.

  • 업비트 API 키 발급 및 API 연결
  • 안정적인 HTTP 요청 처리를 위한 Flask 서버 구축
  • 거래내역을 효율적으로 관리할 SQLite DB 연동
  • 알림 메시지를 전송할 수 있는 텔레그램 API 연동

 

이를 효율적으로 구성하기 위해 Docker를 통해 컨테이너 환경을 세팅하여 빠르고 안정적인 배포 환경을 만들었다.

 

💡 Dockerfile 설정 예시

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
ENV PORT=7860
CMD ["python", "app.py"]
 

파이썬 라이브러리는 다음과 같은 주요 라이브러리를 활용했다.

  • Flask: 간단한 웹 API 서버 구축
  • PyUpbit: 업비트 API 연동
  • python-dotenv: API 키 보안 관리
  • requests: API 호출 및 서버 통신
  • pandas, numpy: 데이터 처리 및 전략 로직 계산

🔸 핵심 자동매매 로직 설계 (RSI + EMA)

 

자동매매의 핵심은 결국 시장의 기술적 신호를 어떻게 해석하고 이에 따라 자동으로 주문을 내는가에 있다. 이번 프로젝트에서는 RSI(Relative Strength Index)와 EMA(Exponential Moving Average) 지표를 결합하여 매수와 매도 신호를 생성하는 전략을 사용했다.

 

RSI는 일정 기간 가격 변화 폭의 평균을 구해 과매수(Overbought) 및 과매도(Oversold) 상태를 확인하는 지표이며, EMA는 최근 가격에 더 큰 비중을 두어 가격 추세를 민감하게 반영하는 이동평균이다.

 

💡 RSI 계산 로직 (파이썬 코드)

import numpy as np

def calculate_rsi(prices, period=14):
    deltas = np.diff(prices)
    seed = deltas[:period]
    up = seed[seed >= 0].sum() / period
    down = -seed[seed < 0].sum() / period
    rs = up / down
    rsi = np.zeros_like(prices)
    rsi[:period] = 100. - 100. / (1. + rs)

    for i in range(period, len(prices)):
        delta = deltas[i - 1]  # 현재 가격 변화
        if delta > 0:
            upval, downval = delta, 0.
        else:
            upval, downval = 0., -delta

        up = (up * (period - 1) + upval) / period
        down = (down * (period - 1) + downval) / period
        rs = up / down
        rsi[i] = 100. - 100. / (1. + rs)

    return rsi
 

RSI 값이 30 이하로 내려가면 과매도 상태로 매수 신호를 생성하고, 70 이상으로 올라가면 과매수 상태로 매도 신호를 생성하는 기본적인 전략을 사용했다.


🔸 일목균형표 기반의 필터 로직 추가

 

하지만 RSI와 EMA만으로는 복잡한 시장 상황에서 신호 정확도가 부족할 수 있다. 이를 보완하기 위해 일목균형표(구름대) 필터를 추가하여 보다 정교한 시장 판단을 수행하도록 하였다.

 

💡 일목균형표 구름대 계산 로직 (파이썬 코드)

import pandas as pd

def calculate_ichimoku(df):
    high = df['high']
    low = df['low']
    tenkan_sen = (high.rolling(window=9).max() + low.rolling(window=9).min()) / 2
    kijun_sen = (high.rolling(window=26).max() + low.rolling(window=26).min()) / 2
    span_a = ((tenkan_sen + kijun_sen) / 2).shift(26)
    span_b = ((high.rolling(window=52).max() + low.rolling(window=52).min()) / 2).shift(26)
    return span_a, span_b
 

현재 가격이 구름대 위에 있는 경우에만 매매를 진행하도록 설정해 보다 안정적인 전략을 구축할 수 있었다.


🔸 손절 및 익절 로직 (Risk Management)

 

암호화폐 시장은 높은 변동성으로 인해 리스크 관리가 매우 중요하다. 이를 위해 손절(Stop-Loss)과 익절(Take-Profit) 기능을 반드시 포함했다.

파이썬 코드 상에서는 간단한 조건문을 통해 이를 처리했다.

 

💡 손절/익절 처리 로직

STOP_LOSS_PCT = 0.05
TAKE_PROFIT_PCT = 0.10

if current_price <= entry_price * (1 - STOP_LOSS_PCT):
    # 손절 매도
elif current_price >= entry_price * (1 + TAKE_PROFIT_PCT):
    # 익절 매도
 

이 간단한 조건으로 리스크를 자동으로 관리하고, 장기적으로 손실을 최소화할 수 있었다.


🔸 추가매수/추가매도 로직 구현

 

암호화폐의 변동성은 최초 매수 이후 추가적인 매수나 부분매도를 통해 수익률을 극대화할 기회를 제공하기도 한다. 그래서 특정 조건 만족 시 추가 매수나 추가 매도를 진행하는 로직을 추가했다.

 

이 로직은 최초 진입 이후에도 시장 흐름에 따라 대응할 수 있는 유연성을 부여한다.


🔸 정확한 요청 간격 제어 (API 제한 대응)

 

업비트 API는 일정 시간 내 너무 많은 요청을 보내면 제한이 걸릴 수 있다. 이를 방지하기 위해 time.sleep()을 이용해 요청 간격을 정밀하게 제어하는 로직을 추가했다.


🔸 실제 체결 성공 시 텔레그램 알림 발송

 

처음 개발 단계에서는 모든 신호마다 텔레그램 메시지를 전송했으나, 이는 실제 운영에서 혼란을 줄 수 있다. 따라서 실질적으로 주문이 체결된 경우에만 텔레그램으로 메시지를 발송하는 방향으로 수정했다.


🔸 실제 운용 및 앞으로의 방향

 

현재까지 구축된 프로그램은 실제 업비트 계정을 통해 실전 거래 환경에서 작동 중이며, 안정적이고 지속적인 거래 성과를 보이고 있다. 향후 계획으로는 다음과 같은 개선 방향을 고려하고 있다.

  • 볼린저밴드, MACD 등 추가 지표를 도입한 전략 고도화
  • 다양한 암호화폐에 대한 동시 거래 및 포트폴리오 관리 기능 추가
  • 전략 최적화를 위한 백테스팅 시스템 구축

🔖 개발 후 느낀 점과 마무리

 

이번 개발 프로젝트는 파이썬과 다양한 금융 지표를 활용한 실전 자동매매 시스템의 가능성을 직접 체험할 수 있었던 값진 경험이었다. 파이썬의 간결성과 명확한 문법은 복잡한 금융 로직을 구현하기에 매우 적합했고, 개발 속도를 높이는 데도 큰 도움이 되었다.

 

이 글이 파이썬을 활용한 자동매매 개발에 관심있는 분들께 구체적인 참고자료가 되기를 바라며, 앞으로도 추가적인 개발 과정과 경험들을 계속해서 공유할 예정이다.