학습 목표
여러분, 2026년 현재, 금융 시장은 그 어느 때보다 빠르게 움직이고 있습니다. 이러한 시장에서 개인 투자자들이 기회를 포착하고 위험을 관리하기 위해서는 자동화된 시스템이 필수적입니다. 이 강의를 통해 여러분은 단 10분 만에 파이썬을 활용하여 코인 및 주식 시장의 목표가에 도달했을 때 자동으로 매수/매도 주문을 실행하는 간단하지만 강력한 자동매매 봇의 핵심 로직을 구축하게 될 것입니다. 이 실습을 통해 다음을 배우게 됩니다:
- 파이썬 기반 자동매매 시스템의 기본 구조 이해
- 가상 데이터를 활용하여 시장 가격을 모니터링하는 방법
- 특정 조건(목표가 도달)에 따라 매수/매도 로직을 구현하는 방법
- 작업 스케줄링 라이브러리를 사용하여 반복적인 자동화 스크립트 실행 방법
- 실제 거래소 API 연동을 위한 다음 단계와 보안 고려사항
이 지식을 바탕으로 여러분은 자신만의 투자 전략을 자동화하고, 더 나아가 복잡한 트레이딩 봇을 개발할 수 있는 견고한 기반을 마련하게 될 것입니다.
사전 준비 사항
본격적인 실습에 앞서 여러분의 개발 환경을 최적화해야 합니다. 아래 준비 사항을 빠짐없이 확인하고 설정해 주세요.
권장 개발 환경
- 운영체제 (OS): Windows 10/11, macOS (Sonoma 이상), Linux (Ubuntu 22.04 LTS 이상)
- 통합 개발 환경 (IDE): Visual Studio Code (VS Code) 최신 버전 (예: 1.85.x 이상)
- 파이썬 (Python) 버전: Python 3.9 이상 (예: 3.10, 3.11, 3.12).
pyenv또는conda와 같은 도구를 사용하여 버전을 관리하는 것을 권장합니다.
필수 라이브러리 설치
자동매매 봇을 개발하기 위해 필요한 파이썬 라이브러리들을 설치합니다. 터미널 또는 명령 프롬프트를 열고 다음 명령어를 실행하여 가상 환경을 만들고 라이브러리를 설치해 주세요.
1. 프로젝트 폴더 생성 및 가상 환경 설정
먼저, 프로젝트를 위한 새 폴더를 만들고 해당 폴더로 이동합니다. 그리고 파이썬 가상 환경을 생성하고 활성화합니다. 가상 환경은 프로젝트별로 독립적인 파이썬 환경을 제공하여 라이브러리 충돌을 방지합니다.
mkdir auto_trading_bot
cd auto_trading_bot
python -m venv venv
# Windows
.\venv\Scripts\activate
# macOS / Linux
source venv/bin/activate
2. 필수 라이브러리 설치
가상 환경이 활성화된 상태에서 필요한 라이브러리들을 설치합니다. 이 실습에서는 requests (실제 API 연동 시 필요, 여기서는 개념 설명), schedule (작업 스케줄링), python-dotenv (환경 변수 관리), pandas (데이터 처리, 선택 사항)를 사용합니다.
pip install requests schedule python-dotenv pandas
여기서 requests는 실제 거래소 API와 통신할 때 사용되며, schedule은 지정된 시간 간격으로 매매 로직을 반복 실행하는 데 핵심적인 역할을 합니다. python-dotenv는 API 키와 같은 민감한 정보를 코드 외부에 안전하게 저장하고 불러오는 데 사용됩니다.
3. API 키 및 설정 파일 (선택 사항)
실제 거래소와 연동할 경우, API 키와 시크릿 키가 필요합니다. 이 정보는 절대 코드 내에 직접 노출해서는 안 되며, .env 파일을 통해 관리하는 것이 가장 안전합니다. 지금은 가상 데이터를 사용할 것이므로 필수는 아니지만, 실제 봇 개발 시에는 반드시 적용해야 합니다.
프로젝트 루트 폴더에 .env 파일을 생성하고 다음과 같이 내용을 작성할 수 있습니다.
# .env 파일 예시 (실제 API 키 아님)
UPBIT_ACCESS_KEY="YOUR_UPBIT_ACCESS_KEY"
UPBIT_SECRET_KEY="YOUR_UPBIT_SECRET_KEY"
단계별 실습 과정
이제 모든 준비가 완료되었습니다. 파이썬 스크립트를 단계별로 작성하며 자동매매 봇의 핵심 기능을 구현해 봅시다.
1. 가상 거래 데이터 시뮬레이션 및 설정
실제 거래소 API 연동은 추가적인 설정과 인증 과정이 필요하므로, 이 10분 튜토리얼에서는 현재 가격을 시뮬레이션하는 함수를 사용하여 핵심 로직에 집중하겠습니다. 실제 봇에서는 이 부분을 업비트(Upbit)의 pyupbit나 바이낸스(Binance)의 python-binance 또는 범용 ccxt 라이브러리로 대체할 수 있습니다.
auto_trade_bot.py 파일을 생성하고 다음 코드를 작성합니다.
import time
import schedule
import random
# from dotenv import load_dotenv
# import os
# load_dotenv() # .env 파일 로드 (실제 API 사용 시 주석 해제)
# --- 설정 변수 --- #
# 실제 거래소 연동 시에는 API 키를 .env 파일에서 불러옵니다.
# ACCESS_KEY = os.getenv("UPBIT_ACCESS_KEY")
# SECRET_KEY = os.getenv("UPBIT_SECRET_KEY")
COIN_TICKER = "KRW-BTC" # 거래할 코인/주식 티커 (예: "KRW-BTC" for Upbit, "ETH/USDT" for Binance)
TARGET_BUY_PRICE = 70000000 # 목표 매수 가격 (예: 7천만원)
TARGET_SELL_PRICE = 72000000 # 목표 매도 가격 (예: 7천2백만원)
BUY_AMOUNT = 100000 # 매수할 금액 (원화 기준, 예: 10만원)
SELL_QUANTITY = 0.0001 # 매도할 수량 (코인 수량, 예: 0.0001 BTC)
# --- 가상 잔고 및 보유 수량 (시뮬레이션용) --- #
# 실제 봇에서는 거래소 API를 통해 잔고를 조회해야 합니다.
krw_balance = 1000000 # 보유 원화 (예: 100만원)
coin_quantity = 0.0 # 보유 코인 수량
print(f"[초기 설정] 원화 잔고: {krw_balance:,} KRW, {COIN_TICKER} 보유 수량: {coin_quantity}")
# --- 가상 현재 가격 조회 함수 --- #
def get_current_price(ticker):
"""
주어진 티커의 현재 가격을 가상으로 반환합니다.
실제 봇에서는 거래소 API를 통해 현재 가격을 조회해야 합니다.
예: pyupbit.get_current_price("KRW-BTC")
"""
# 실제 가격이 TARGET_BUY_PRICE와 TARGET_SELL_PRICE 사이를 오가도록 조정
# 초반에는 매수 기회를 주기 위해 TARGET_BUY_PRICE 근처에서 시작
if hasattr(get_current_price, "_last_price"):
last_price = get_current_price._last_price
else:
last_price = TARGET_BUY_PRICE - 500000 # 초기 가격은 매수 목표가보다 약간 낮게 설정
# 가격 변동폭을 랜덤하게 적용
price_change = random.uniform(-500000, 500000) # 50만원 범위 내에서 가격 변동
current_price = last_price + price_change
# 가격이 너무 비현실적으로 벗어나지 않도록 제한
current_price = max(TARGET_BUY_PRICE - 2000000, min(TARGET_SELL_PRICE + 2000000, current_price))
get_current_price._last_price = current_price # 다음 호출을 위해 현재 가격 저장
return round(current_price, -3) # 천원 단위로 반올림
# --- 가상 매수 함수 --- #
def buy_crypto(ticker, amount):
global krw_balance, coin_quantity
current_price = get_current_price(ticker)
if current_price <= TARGET_BUY_PRICE and krw_balance >= amount:
bought_quantity = amount / current_price
krw_balance -= amount
coin_quantity += bought_quantity
print(f"[{time.strftime('%H:%M:%S')}] 매수 성공! {ticker} {bought_quantity:.4f}개 매수 (가격: {current_price:,} KRW). 잔고: {krw_balance:,} KRW, 보유: {coin_quantity:.4f} {ticker}")
# 실제 봇에서는 여기에 실제 거래소 매수 주문 API 호출 코드가 들어갑니다.
# 예: upbit.buy_market_order(ticker, amount)
else:
print(f"[{time.strftime('%H:%M:%S')}] 매수 조건 미충족. 현재가: {current_price:,} KRW, 목표가: {TARGET_BUY_PRICE:,} KRW, 원화 잔고: {krw_balance:,} KRW")
# --- 가상 매도 함수 --- #
def sell_crypto(ticker, quantity):
global krw_balance, coin_quantity
current_price = get_current_price(ticker)
if current_price >= TARGET_SELL_PRICE and coin_quantity >= quantity:
sold_amount = quantity * current_price
krw_balance += sold_amount
coin_quantity -= quantity
print(f"[{time.strftime('%H:%M:%S')}] 매도 성공! {ticker} {quantity:.4f}개 매도 (가격: {current_price:,} KRW). 잔고: {krw_balance:,} KRW, 보유: {coin_quantity:.4f} {ticker}")
# 실제 봇에서는 여기에 실제 거래소 매도 주문 API 호출 코드가 들어갑니다.
# 예: upbit.sell_market_order(ticker, quantity)
else:
print(f"[{time.strftime('%H:%M:%S')}] 매도 조건 미충족. 현재가: {current_price:,} KRW, 목표가: {TARGET_SELL_PRICE:,} KRW, 보유 수량: {coin_quantity:.4f} {ticker}")
# --- 자동매매 작업 정의 --- #
def trade_job():
current_price = get_current_price(COIN_TICKER)
print(f"[{time.strftime('%H:%M:%S')}] {COIN_TICKER} 현재 가격: {current_price:,} KRW")
# 매수 시도
buy_crypto(COIN_TICKER, BUY_AMOUNT)
# 매도 시도
sell_crypto(COIN_TICKER, SELL_QUANTITY)
# --- 스케줄링 설정 및 봇 실행 --- #
print(f"\n[봇 시작] {COIN_TICKER} 자동매매 봇이 {TARGET_BUY_PRICE:,} KRW (매수), {TARGET_SELL_PRICE:,} KRW (매도) 목표가로 시작됩니다.")
print("매 10초마다 가격을 확인하고 매매를 시도합니다. (Ctrl+C로 종료)\n")
schedule.every(10).seconds.do(trade_job) # 10초마다 trade_job 함수 실행
while True:
schedule.run_pending()
time.sleep(1)
이 스크립트는 COIN_TICKER, TARGET_BUY_PRICE, TARGET_SELL_PRICE, BUY_AMOUNT, SELL_QUANTITY와 같은 핵심 설정을 포함하고 있습니다. 여러분은 이 값들을 자유롭게 변경하여 다양한 시나리오를 테스트할 수 있습니다. get_current_price 함수는 실제 거래소 API 호출을 대체하는 가상 함수이며, buy_crypto와 sell_crypto 함수는 목표가 도달 시 매수/매도 로직을 수행합니다.
2. 자동매매 로직 상세 설명
위 코드에서 가장 중요한 부분은 trade_job() 함수입니다. 이 함수는 매 스케줄링 주기마다 실행되며, 다음 단계를 수행합니다.
get_current_price(COIN_TICKER)를 호출하여 현재 가상 시장 가격을 가져옵니다.- 가져온 현재 가격을 기준으로
buy_crypto()함수를 호출하여 매수 조건을 확인합니다. 현재 가격이TARGET_BUY_PRICE보다 낮거나 같고, 원화 잔고가 충분하면 매수 주문을 시뮬레이션합니다. - 마찬가지로
sell_crypto()함수를 호출하여 매도 조건을 확인합니다. 현재 가격이TARGET_SELL_PRICE보다 높거나 같고, 보유 코인 수량이 충분하면 매도 주문을 시뮬레이션합니다.
schedule.every(10).seconds.do(trade_job) 라인은 trade_job 함수를 매 10초마다 실행하도록 예약합니다. while True: schedule.run_pending(); time.sleep(1) 루프는 스케줄러가 예약된 작업을 지속적으로 확인하고 실행하도록 합니다. 이 구조를 통해 여러분의 봇은 지정된 간격으로 시장을 모니터링하고 자동으로 거래 결정을 내릴 수 있게 됩니다.
결과 확인
이제 작성한 자동매매 봇 스크립트를 실행하고 그 동작을 확인해 봅시다.
1. 스크립트 실행
터미널에서 가상 환경이 활성화된 상태로 다음 명령어를 입력하여 스크립트를 실행합니다.
python auto_trade_bot.py
2. 동작 확인
스크립트를 실행하면 터미널에 매 10초마다 현재 가격 정보와 함께 매수 또는 매도 시도에 대한 로그가 출력될 것입니다. 가상 잔고와 보유 코인 수량도 함께 업데이트되는 것을 확인할 수 있습니다.
[초기 설정] 원화 잔고: 1,000,000 KRW, KRW-BTC 보유 수량: 0.0
[봇 시작] KRW-BTC 자동매매 봇이 70,000,000 KRW (매수), 72,000,000 KRW (매도) 목표가로 시작됩니다.
매 10초마다 가격을 확인하고 매매를 시도합니다. (Ctrl+C로 종료)
[10:30:05] KRW-BTC 현재 가격: 69,750,000 KRW
[10:30:05] 매수 성공! KRW-BTC 0.0014개 매수 (가격: 69,750,000 KRW). 잔고: 900,000 KRW, 보유: 0.0014 KRW-BTC
[10:30:05] 매도 조건 미충족. 현재가: 69,750,000 KRW, 목표가: 72,000,000 KRW, 보유 수량: 0.0014 KRW-BTC
[10:30:15] KRW-BTC 현재 가격: 70,500,000 KRW
[10:30:15] 매수 조건 미충족. 현재가: 70,500,000 KRW, 목표가: 70,000,000 KRW, 원화 잔고: 900,000 KRW
[10:30:15] 매도 조건 미충족. 현재가: 70,500,000 KRW, 목표가: 72,000,000 KRW, 보유 수량: 0.0014 KRW-BTC
[10:30:25] KRW-BTC 현재 가격: 72,100,000 KRW
[10:30:25] 매수 조건 미충족. 현재가: 72,100,000 KRW, 목표가: 70,000,000 KRW, 원화 잔고: 900,000 KRW
[10:30:25] 매도 성공! KRW-BTC 0.0001개 매도 (가격: 72,100,000 KRW). 잔고: 907,210 KRW, 보유: 0.0013 KRW-BTC
...
위와 유사한 로그가 터미널에 지속적으로 출력된다면, 여러분의 자동매매 봇이 성공적으로 작동하고 있는 것입니다. 현재 가격이 목표 매수/매도 가격에 도달할 때마다 자동으로 매매가 시뮬레이션되는 것을 볼 수 있습니다.
3. 주의사항 및 다음 단계
축하합니다! 여러분은 파이썬으로 10분 만에 코인/주식 자동매매 봇의 핵심 로직을 성공적으로 구축했습니다. 하지만 이것은 시작에 불과합니다.
실제 거래소 연동
이 튜토리얼에서 사용된 get_current_price, buy_crypto, sell_crypto 함수는 가상 데이터를 기반으로 합니다. 실제 거래를 위해서는 Upbit의 pyupbit, Binance의 python-binance, 또는 다양한 거래소를 지원하는 ccxt와 같은 라이브러리를 사용하여 실제 거래소 API와 연동해야 합니다. 이때, API 키와 시크릿 키는 반드시 .env 파일 등을 통해 안전하게 관리해야 합니다.
확장 및 개선 사항
- 오류 처리 (Error Handling): 네트워크 문제, API 호출 실패 등 발생할 수 있는 다양한 예외 상황에 대한 견고한 오류 처리 로직을 추가하세요.
- 로그 기록 (Logging): 모든 거래 활동, 시스템 상태 등을 파일로 기록하여 봇의 동작을 추적하고 문제 발생 시 디버깅할 수 있도록 합니다.
- 고급 전략 구현: 이동 평균선, RSI, 볼린저 밴드 등 다양한 기술적 지표를 활용하여 매수/매도 시점을 더욱 정교하게 판단하는 로직을 추가할 수 있습니다.
- 백테스팅 (Backtesting): 과거 데이터를 사용하여 개발한 전략이 실제로 수익성이 있는지 검증하는 과정을 거쳐야 합니다.
- 웹 UI 또는 알림: 봇의 상태를 시각적으로 확인하거나, 특정 이벤트 발생 시 알림을 받을 수 있는 기능을 추가할 수 있습니다.
자동매매는 매력적인 분야이지만, 항상 시장의 변동성과 기술적 위험을 인지하고 신중하게 접근해야 합니다. 이 튜토리얼을 통해 얻은 지식을 바탕으로 여러분의 금융 자동화 여정을 성공적으로 이어나가시기를 바랍니다.

