강의 목표: 24시간 잠들지 않는 수익 파이프라인 구축하기
2026년 현재, 금융 시장의 변동성은 과거와 비교할 수 없을 정도로 빨라졌습니다. 사람이 직접 차트를 보고 판단하여 매수와 매도 버튼을 누르는 시대는 끝났습니다. 이번 강의의 목표는 파이썬(Python)을 활용하여 실시간 시세 데이터를 수집하고, 특정 조건이 충족되었을 때 즉시 주문을 실행하는 ‘조건부 자동매매 봇’의 기초를 완성하는 것입니다.
본 강의를 통해 여러분은 단순한 코딩 실력을 넘어, 데이터에 기반한 이성적인 투자 시스템을 구축하는 실무 프로세스를 완전히 습득하게 될 것입니다. 감정에 휘둘리지 않는 기계적인 매매, 지금 바로 시작합니다.
사전 준비 사항: 안정적인 환경 구축이 수익의 시작
자동매매 봇은 24시간 안정적으로 구동되어야 합니다. 개발 환경의 작은 차이가 실제 운영 단계에서 치명적인 오류를 발생시킬 수 있으므로, 아래 명시된 권장 사양을 반드시 준수해 주시기 바랍니다.
- 운영체제(OS): Windows 11 이상 또는 macOS Sonoma 이상 (리눅스 서버 환경도 가능)
- 개발 도구(IDE): Visual Studio Code (VS Code) 최신 버전
- 언어 버전: Python 3.12.x 이상 (비동기 처리 및 최신 라이브러리 호환성 최적화)
- 필수 라이브러리 설치: 터미널(Terminal)에서 아래 명령어를 입력하여 설치합니다.
pip install pyupbit pandas numpy schedule requests
위 라이브러리 중 pyupbit는 업비트 API를 다루기 위한 핵심 도구이며, pandas는 시세 데이터를 분석하고 이동평균선 등의 지표를 계산하는 데 필수적입니다. schedule은 정해진 시간마다 반복적으로 로직을 실행하기 위해 사용됩니다.
1단계: API 연결 및 실시간 시세 데이터 수집
자동매매의 첫 번째 단계는 거래소와 내 파이썬 코드를 연결하는 것입니다. 거래소(예: 업비트)에서 발급받은 Access Key와 Secret Key를 사용하여 인증 절차를 거쳐야 합니다.
API 키 보안 관리 및 연결
보안을 위해 API 키는 코드에 직접 하드코딩하지 않는 것이 원칙이지만, 이번 기초 실습에서는 변수에 저장하는 방식을 사용하겠습니다. (실제 운영 시에는 환경 변수 .env 파일 사용을 권장합니다.)
import pyupbit
# API 키 입력 (본인의 키로 교체)
access = "YOUR_ACCESS_KEY"
secret = "YOUR_SECRET_KEY"
# 업비트 객체 생성
upbit = pyupbit.Upbit(access, secret)
# 내 잔고 확인
print(f"현재 보유 현금: {upbit.get_balance('KRW')}원")
실시간 캔들 데이터 조회
매수 조건을 판단하기 위해서는 과거의 시세 데이터가 필요합니다. get_ohlcv 함수를 사용하여 최근 200일간의 데이터를 가져와 보겠습니다.
import pandas as pd
# 비트코인(KRW-BTC)의 일봉 데이터 조회
df = pyupbit.get_ohlcv("KRW-BTC", interval="day", count=200)
print(df.tail())
2단계: 매수/매도 조건식(알고리즘) 설계
봇의 심장부라고 할 수 있는 전략 수립 단계입니다. 우리는 가장 대중적이면서도 강력한 ‘이동평균선 골든크로스’ 전략을 구현할 것입니다. 5일 이동평균선이 20일 이동평균선을 상향 돌파할 때 매수하고, 하향 돌파할 때 매도하는 로직입니다.
이동평균선 계산 및 전략 구현
Pandas의 rolling 함수를 사용하면 매우 간단하게 지표를 생성할 수 있습니다.
def get_ma5(ticker):
df = pyupbit.get_ohlcv(ticker, interval="day", count=20)
ma5 = df['close'].rolling(window=5).mean()
return ma5.iloc[-1]
def get_ma20(ticker):
df = pyupbit.get_ohlcv(ticker, interval="day", count=40)
ma20 = df['close'].rolling(window=20).mean()
return ma20.iloc[-1]
# 현재가 조회
current_price = pyupbit.get_current_price("KRW-BTC")
ma5 = get_ma5("KRW-BTC")
ma20 = get_ma20("KRW-BTC")
print(f"현재가: {current_price}, 5일선: {ma5}, 20일선: {ma20}")
위 코드에서 ma5 > ma20 조건이 참이 된다면 상승 추세로 판단하여 매수 신호로 인식하게 됩니다. 반대로 ma5 < ma20이면 하락 추세의 시작으로 보고 매도 신호를 보냅니다.
3단계: 실전! 자동 주문 실행 코드 작성
이제 수집된 데이터와 전략을 합쳐 실제로 주문을 내는 무한 루프 코드를 작성합니다. 예외 처리를 위해 try-except 구문을 반드시 포함해야 합니다. 네트워크 오류로 인해 봇이 멈추는 것을 방지하기 위함입니다.
import time
while True:
try:
ticker = "KRW-BTC"
current_price = pyupbit.get_current_price(ticker)
ma5 = get_ma5(ticker)
ma20 = get_ma20(ticker)
# 매수 조건: 5일선이 20일선 위에 있고, 현재 잔고가 5000원 이상일 때
if ma5 > ma20:
krw = upbit.get_balance("KRW")
if krw > 5000: # 최소 주문 금액 확인
upbit.buy_market_order(ticker, krw * 0.9995) # 수수료 고려
print(f"매수 완료! 현재가: {current_price}")
# 매도 조건: 5일선이 20일선 아래로 내려갔을 때 전량 매도
elif ma5 < ma20:
btc = upbit.get_balance(ticker)
if btc > 0.0001: # 보유 수량 확인
upbit.sell_market_order(ticker, btc)
print(f"매도 완료! 현재가: {current_price}")
except Exception as e:
print(f"에러 발생: {e}")
time.sleep(1) # 1초마다 반복
결과 확인 및 리스크 관리 전략
코드를 실행하면 터미널 창에 실시간으로 조건 충족 여부와 매수/매도 로그가 출력됩니다. 하지만 자동매매는 완벽한 마법의 지팡이가 아닙니다. 다음의 리스크 관리 원칙을 반드시 기억하십시오.
로그 확인과 예외 처리
프로그램이 정상 작동하는지 확인하기 위해 로그를 파일로 저장하거나 텔레그램 메신저로 알림을 보내는 기능을 추가하는 것이 좋습니다. 또한, 시장의 급락 상황을 대비하여 ‘손절선(Stop-loss)’ 기능을 코드에 포함시키는 것이 필수적입니다.
수익률 극대화를 위한 제언
- 백테스팅(Backtesting): 과거 데이터를 기반으로 내 전략이 수익이 났을지 미리 검증해 보세요.
- 분산 투자: 비트코인뿐만 아니라 이더리움, 솔라나 등 다양한 종목으로 봇의 대상을 넓히세요.
- 슬리피지 고려: 시장가 주문 시 발생하는 가격 괴리를 계산에 넣어야 실제 수익률과 오차를 줄일 수 있습니다.
이제 여러분은 파이썬을 활용한 자동매매의 기초를 모두 마스터했습니다. 이 코드를 바탕으로 본인만의 독창적인 보조지표를 결합하여 더욱 고도화된 트레이딩 시스템을 완성해 보시기 바랍니다. 기술은 도구일 뿐, 수익을 결정짓는 것은 여러분의 전략과 절제력입니다.