본문 바로가기
Python

업비트 비트코인 GPT 자동매매 5편 : 자동매매 실행하기

by 코드렌즈 2025. 10. 8.
반응형

이전 글에서는 GPT가 비트코인 차트 데이터를 보고
BUY, SELL, HOLD 중 하나를 판단하도록 구현했습니다.

이번에는 그 결과를 받아 자동으로 매수·매도 주문을 넣는 코드를 완성해보겠습니다.

🔹 1. 준비 확인

이전 단계에서 다음이 준비되어 있어야 합니다 👇

  • .env 파일에 업비트 API 키 등록 완료
  • pyupbit, openai, python-dotenv 설치 완료
  • GPT가 JSON 형태로 “{"decision": "buy"}” 형태의 응답을 반환

이 상태라면 바로 자동매매 코드를 작성할 수 있습니다.

🔹 2. 기본 코드 구조

자동매매는 크게 3단계로 나뉩니다.

1️⃣ GPT에게 판단 요청 → buy/sell/hold 응답 수신
2️⃣ 결과 해석 → 어떤 주문을 실행할지 결정
3️⃣ 업비트 API 호출 → 실제 매수/매도 주문 실행

전체 구조를 코드로 살펴보겠습니다 👇

🔹 3. 코드 구현

import pyupbit
from openai import OpenAI
from dotenv import load_dotenv
import os, json

# 환경변수 불러오기
load_dotenv()

# 업비트 클라이언트 설정
access = os.getenv("UPBIT_ACCESS_KEY")
secret = os.getenv("UPBIT_SECRET_KEY")
upbit = pyupbit.Upbit(access, secret)

# GPT 클라이언트 설정
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# 비트코인 30일 시세 불러오기
df = pyupbit.get_ohlcv("KRW-BTC", count=30, interval="day")
chart_data = df.to_json()

# GPT 프롬프트
system_prompt = """
You are a Bitcoin trading analyst.
Analyze the last 30 days of OHLC data and decide whether to BUY, SELL, or HOLD.
Respond only in JSON format:
{"decision": "buy"} or {"decision": "sell"} or {"decision": "hold"}
"""

# GPT 판단 요청
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": chart_data}
    ],
    response_format={"type": "json_object"}
)

# GPT 응답 결과 파싱
result = json.loads(response.choices[0].message.content)
decision = result["decision"]

print("GPT 판단 결과:", decision)

🔹 4. 매매 함수 만들기

이제 GPT의 판단(decision) 값에 따라
매수 또는 매도를 수행하는 함수를 추가합니다.

# 매수 함수
def buy_bitcoin():
    krw_balance = upbit.get_balance("KRW")
    if krw_balance * 0.9995 > 5000:  # 최소 거래금액 5000원 이상
        print("📈 매수 주문 실행")
        upbit.buy_market_order("KRW-BTC", krw_balance * 0.9995)
    else:
        print("❌ 매수 실패: 잔고 부족")

# 매도 함수
def sell_bitcoin():
    btc_balance = upbit.get_balance("KRW-BTC")
    btc_price = pyupbit.get_orderbook("KRW-BTC")["orderbook_units"][0]["ask_price"]
    if btc_balance * btc_price > 5000:  # 5000원 이상만 거래
        print("📉 매도 주문 실행")
        upbit.sell_market_order("KRW-BTC", btc_balance)
    else:
        print("❌ 매도 실패: 보유량 부족")

🔹 5. GPT 판단 결과에 따른 주문 실행

이제 GPT의 판단값을 기반으로 위 함수를 호출해봅니다 👇

if decision == "buy":
    buy_bitcoin()
elif decision == "sell":
    sell_bitcoin()
else:
    print("⏸ HOLD 신호 — 거래 대기 중")

설명

  • GPT가 "buy" → 원화 잔고 확인 후 비트코인 전량 매수
  • GPT가 "sell" → 비트코인 보유량 확인 후 전량 매도
  • GPT가 "hold" → 아무 행동도 하지 않고 대기

🔹 6. 전체 코드 정리

아래는 지금까지의 내용을 합친 완전 실행 가능한 자동매매 코드입니다 👇

import pyupbit
from openai import OpenAI
from dotenv import load_dotenv
import os, json

# 환경 변수 로드
load_dotenv()

# API 클라이언트 설정
access = os.getenv("UPBIT_ACCESS_KEY")
secret = os.getenv("UPBIT_SECRET_KEY")
openai_key = os.getenv("OPENAI_API_KEY")

upbit = pyupbit.Upbit(access, secret)
client = OpenAI(api_key=openai_key)

# 비트코인 30일 시세 데이터
df = pyupbit.get_ohlcv("KRW-BTC", count=30, interval="day")
chart_data = df.to_json()

# GPT 프롬프트
system_prompt = """
You are a Bitcoin trading analyst.
Analyze the last 30 days of OHLC data and decide whether to BUY, SELL, or HOLD.
Respond only in JSON format:
{"decision": "buy"} or {"decision": "sell"} or {"decision": "hold"}
"""

# GPT 판단 요청
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": chart_data}
    ],
    response_format={"type": "json_object"}
)

# GPT 응답 파싱
result = json.loads(response.choices[0].message.content)
decision = result["decision"]
print("GPT 판단 결과:", decision)

# 매수 함수
def buy_bitcoin():
    krw_balance = upbit.get_balance("KRW")
    if krw_balance * 0.9995 > 5000:
        print("📈 매수 주문 실행")
        upbit.buy_market_order("KRW-BTC", krw_balance * 0.9995)
    else:
        print("❌ 매수 실패: 잔고 부족")

# 매도 함수
def sell_bitcoin():
    btc_balance = upbit.get_balance("KRW-BTC")
    btc_price = pyupbit.get_orderbook("KRW-BTC")["orderbook_units"][0]["ask_price"]
    if btc_balance * btc_price > 5000:
        print("📉 매도 주문 실행")
        upbit.sell_market_order("KRW-BTC", btc_balance)
    else:
        print("❌ 매도 실패: 보유량 부족")

# GPT 결과에 따라 주문 실행
if decision == "buy":
    buy_bitcoin()
elif decision == "sell":
    sell_bitcoin()
else:
    print("⏸ HOLD — 거래 대기 중")

🔹 7. 주의사항 및 안전장치

  1. 테스트 모드부터 시작하세요.
    실제 자금이 있는 계정에서는 반드시 소액으로 테스트하세요.
  2. 5000원 미만 거래 불가
    업비트는 5000원 이하 거래를 허용하지 않습니다.
  3. 수수료 고려
    매수·매도 모두 0.05% 수수료가 발생합니다.
  4. API 권한 확인
    업비트 API 생성 시 자산조회, 주문조회, 주문하기 세 항목을 반드시 체크해야 합니다.

🔹 8. 다음 단계 예고

이제 GPT의 판단 결과를 바탕으로
실제 자동매매가 실행되는 프로그램이 완성되었습니다.

다음 편에서는 프로그램이 1시간마다 자동으로 반복 실행되도록
루프를 구성하는 방법을 알아보겠습니다.

👉 다음 글 예고

  • 6편 — 1시간마다 자동 반복 매매 (Main Loop 구성)
  • 7편 — 리스크 관리 및 중복 주문 방지 로직 추가

관련 포스팅

 

업비트 비트코인 GPT 자동매매 3편 : 비트코인 시세 데이터 가져오기

이제 GPT가 판단할 수 있는 데이터를 만들어야 합니다.이번 글에서는 업비트 API를 활용해 비트코인 시세(OHLCV) 데이터를 가져오는 방법을 배워봅니다.이 데이터는 이후 GPT가 “BUY / SELL / HOLD” 결

codelenz.tistory.com

 

 

업비트 비트코인 GPT 자동매매 4편 : GPT로 의사결정하기

이제 GPT를 본격적으로 트레이딩 의사결정에 활용할 차례입니다.이번 글에서는 업비트에서 불러온 비트코인 시세 데이터를 GPT API로 전송하고,AI가 매수·매도·보류 중 어떤 판단을 내리는지를 JS

codelenz.tistory.com

 

반응형