GPT-4o 코인 자동 매매 프로그램 제작 가이드

Published on: 2025-01-10

GPT가 매일매일 내가 자는 동안에도 비트코인을 매수해서 돈을 벌어온다면? GPT의 투자 판단을 바탕으로 코인을 일정 시간마다 자동으로 매수매도하는 프로그램 제작 방법에 대해 알려드립니다.

기본 환경 설정

프로그램을 만들기 전 기본적인 세팅을 해주어야 합니다. 아래 링크를 통해 업비트와 OpenAPI 발급, 파이썬과 VS Code를 설치해주시기 바랍니다.

가상 환경 구성

가상환경을 먼저 구성하여 라이브러리와 파이썬 버전이 다른 프로젝트와 충돌하지 않도록 해주겠습니다.

가상환경 생성

아래 명령어로 가상환경 폴더 venv를 생성합니다.

python -m venv venv

가상환경을 활성화 합니다.

venv\Scripts\activate

터미널 프롬프트 왼쪽에 가상환경 명칭이 표시되면 활성화된 상태입니다.

가상환경을 종료하려면 아래 명령어를 입력해주세요.

deactivate

venv 표기가 사라지면 비활성화가 된 것입니다. 더 자세한 내용이 궁금하시면 아래 포스팅을 참고해주세요

라이브러리 설치

라이르러리 설치는 터미널에서 pip install 라이브러리 이름으로도 설치할 수 있지만,

pip install [라이브러리명]

여러 개의 라이브러리를 한번에 설치하고 배포하기 위해서는 파일로 관리하는 것이 편합니다.

requrirement.txt 라는 파일을 하나 만들어주어 앞으로 필요한 라이브러리를 관리해보겠습니다.

코인 자동 매매 프로그램 제작을 위한 3가지 필수 라이브러리 명을 입력합니다.

python-dotenv
opanai
pyupbit

라이브러리 설명

  • python-dotenv: 환경변수를 .env 파일로 분리해 보안성·유연성을 높여주는 라이브러리
  • openai: OpenAI API(예: GPT-3, ChatGPT)를 간편하게 호출해 텍스트·이미지 생성 등을 수행
  • pyupbit: 업비트 암호화폐 거래소의 시세 조회 및 매매 기능을 파이썬에서 쉽게 구현

라이브러리 설치 실행

requirement.txt 파일 내 라이브러리를 한번에 설치하기 위해 아래 코드를 입력하여 줍니다.

pip install -r requirement.txt

환경변수 파일 만들기

환경변수를 한 곳에서 관리하기 위해 환경변수 파일을 만들어보겠습니다. 폴더에 .env이름의 파일을 만들어줍니다.

앞에서 발급받은 업비트 API 키와 오픈AI API 키를 복사해서 아래와 같이 만들어 줍니다. (뒤에 변수에는 자신의 키가 들어갑니다.)

UPBIT_ACCESS_KEY="YOUR UPBIT_ACCESS_KEY"
UPBIT_SECRET_KEY="YOUR UPBIT_SECRET_KEY"
OPENAI_API_KEY="YOUR OPENAI_API_KEY"

환경변수 불러오기

환경변수를 불러오기 위해서는 아래와 같이 입력합니다.

from dotenv import load_dotenv
import os

# .env 파일 읽어오기
load_dotenv()

# 변수 불러오기
upbit_access_key = os.getenv("UPBIT_ACCESS_KEY")
upbit_secret_key = os.getenv("UPBIT_SECRET_KEY")
openai_api_key = os.getenv("OPENAI_API_KEY")

# 변수 출력하기 
print("UPBIT_ACCESS_KEY:", upbit_access_key)
print("UPBIT_SECRET_KEY:", upbit_secret_key)
print("OPENAI_API_KEY:", openai_api_key)

터미널에서 test.py 파일을 실행하여 정상적으로 작동하는지 확인합니다.

python test.py

코인 자동 매매 프로그램 만들기

이제 본격적으로 기본적인 코인 자동 매매 프로그램을 만들어 보겠습니다.

이번에 구현할 코인 자동 매매 프로그램은 다음과 같이 동작합니다.

  1. 코인의 30일 일봉 정보를 불러옴
  2. 30일 정보를 바탕으로 GPT에게 사야하는지(BUY), 팔아야하는지(SELL), 보류해야하는지(HOLD) 질문
  3. 응답 값을 바탕으로 실제로 거래 수행
  4. 1시간마다 GPT에 질문하여 응답을 받는 것을 반복

메인 코드 작성

먼저 새로운 파일로 trading.py를 생성합니다.

업비트 차트데이터 가져오기

업비트 차트데이터를 가져오기 위해 pyupbit라는 오픈 라이브러리를 사용합니다.

pyupbit에 대한 자세한 설명은 깃허브에서 pyupbit를 참고해보시면 되겠습니다.

기존 환경변수 불러오는 것은 그대로 사용하기 테스트 파일에서 복사하여 가져옵니다. 그리고 아래에 업비트 차트데이터를 가져오는 함수를 작성해보겠습니다.

라이브러리 임포트

import pyupbit
  • pyupbit 라이브러리를 사용하기 위해 임포트합니다. 이 라이브러리는 국내 암호화폐 거래소 ‘업비트(Upbit)’의 API를 쉽게 활용할 수 있도록 도와줍니다.

OHLCV 데이터 불러오기

df = pyupbit.get_ohlcv("KRW-BTC")
  • pyupbit.get_ohlcv("KRW-BTC") 함수는 Upbit에서 비트코인(KRW-BTC) 시세의 OHLCV(시가, 고가, 저가, 종가, 거래량) 데이터를 가져와서 pandas.DataFrame 형태로 반환합니다.
  • ‘KRW-BTC’는 원화(KRW) 마켓에서 비트코인(BTC)을 뜻합니다.

마지막 5개 행 출력

print(df.tail())
  • df.tail()은 불러온 시세 데이터 중 마지막 5개 행을 추출하는 pandas 메서드입니다. 즉, 가장 최근의 5개 캔들(또는 최근 5일치) 데이터를 출력하는 코드입니다.

실행을 해보면 아래와 같이 출력되는것을 확인해 볼 수 있습니다.

30일 일봉 데이터를 가져오기

위에 코드를 변형해서 우리가 원하는 30일 일봉 데이터를 가져와보겠습니다.

import pyupbit

df = pyupbit.get_ohlcv("KRW-BTC", count = 30, interval="day")
print(df)
  • count = 30 : 최근 30개 데이터를 가져옵니다.
  • interval=”day” : 일봉 데이터를 가져옵니다.

정상 작동하는지 실행을 해보겠습니다.

python trading.py   

정상적으로 출력되는 모습을 볼 수 있습니다.

GPT에 데이터 제공하고 답변 받기

이번에는 30일 일봉 데이터를 GPT에 제공하고 매수(buy), 매도(sell), 보류(hold)를 답변 받는 코딩을 작성해보겠습니다.

먼저 OpenAI 웹사이트에서 PlayGround에 접속합니다. 아래와 같은 화면을 보실 수 있을텐데요.

OpenAI Playground란? OpenAI의 언어 모델을 실험적으로 활용할 수 있는 웹 기반 도구입니다. 사용자는 이 플랫폼을 통해 OpenAI의 다양한 모델(GPT-3.5, GPT-4 등)을 테스트하며, 모델의 성능을 실험할 수 있습니다.

GPT는 시스템 메시지와 유저 메시지로 구분할 수 있는데요. 시스템 메시지 설정을 통해 GPT에게 역할을 부여하고 더 나은 답변을 받을 수 있습니다.

GPT에서 아래와 같은 역할을 부여해보겠습니다. GPT는 영어로 프롬프트를 입력해 보통 더 나은 결과물을 보여줍니다.

당신은 비트코인 투자전문가입니다. 
당신은 차트 데이터를 활용해서 정확하게 매수, 매도 타이밍을 계산할 수 있습니다.

You are a Bitcoin investment expert.
You can accurately calculate buy and sell timings using chart data.

다음으로는 응답을 어떤 식으로 받을 지 설정을 해주겠습니다.

시스템에 연계하여 활용하기 위해 json 형태로 응답을 받아야합니다.

응답 예시를 알려주고 오른쪽에 포맷을 json_object로 변경해줍니다.

Response Example:
{"decision": "buy"}
{"decision": "sell"}
{"decision": "hold"}

json 형태로 GPT가 응답하기 위해 메시지 하단에 아래를 입력합니다.

response in json format

최종 시스템 메시지는 아래와 같습니다.

You are a Bitcoin investment expert.
You can accurately calculate buy and sell timings using chart data.
response in json format

Response Example:
{"decision": "buy"}
{"decision": "sell"}
{"decision": "hold"}

30일 일봉 데이터를 입력하기 전에 원할한 답변을 위해 기존 데이터프레임(df)으로 받았던 30일 일봉 데이터를 json 형태로 변경해주겠습니다.

print(df)
>>
print(df.to_json())

실행해 보면 아래처럼 json 형식으로 출력되는 것을 알 수 있습니다.

이 내용을 playground에 유저 메시지로 입력하고 실행을 해보겠습니다.

GPT는 이 데이터를 보고 Hold라는 답을 주는 것을 확인해 볼 수 있습니다.

이제 작성된 프롬프트를 코드로 가져와보겠습니다. 상단에 코드를 누르면 코드를 받을 수 있습니다.

상단에 복사 버튼으로 복사를 해옵니다.

그리고 trading.py 파일로 붙여넣습니다.

여기서 유저의 입력값은 실시간으로 가져오는 데이터로 바꾸기 위해 유저 메시지 텍스트 부분을 변경해줍니다.

최종 코드는 아래와 같습니다. 코드를 몇 가지 정리해주고 하단에 응답이 재대로 들어오는지 프린트문을 달아보겠습니다.

# 2.GPT에 데이터 제공하고 답변 받기

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4o",
  messages=[
    {
      "role": "system",
      "content": [
        {
          "type": "text",
          "text": "You are a Bitcoin investment expert.\nYou can accurately calculate buy and sell timings using chart data.\nresponse in json format\n\nResponse Example:\n{\"decision\": \"buy\"}\n{\"decision\": \"sell\"}\n{\"decision\": \"hold\"}"
        }
      ]
    },
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": df.to_json()
        }
      ]
    }
  ],
  response_format={
    "type": "json_object"
  },
)

print(response.choices[0].message.content)

프로그램을 실행해보면 아래와 같은 응답을 받을 수 있습니다.

자동 매매 코딩하기

이제 응답을 바탕으로 업비트에서 자동 매매를 실행하는 코드를 만들어 보겠습니다.

업비트 로그인

먼저 업비트에 로그인을 해야하기 위해 액세스 키와 시크릿 키를 담아 온 후

pyupbit.Upbit 함수를 사용해 로그인을 해줍니다.

upbit_access_key = os.getenv("UPBIT_ACCESS_KEY")
upbit_secret_key = os.getenv("UPBIT_SECRET_KEY")
upbit = pyupbit.Upbit(upbit_access_key, upbit_secret_key)

매수 함수 만들기

GPT가 buy라고 결정한 경우 자신의 업비트 계좌에 모든 원화를 가지고 비트코인을 매매하는 함수를 만들어보겠습니다.

if result["decision"] == "buy" :
     my_krw = upbit.get_balance("KRW")
     if my_krw*0.9995 > 5000 :
         print(upbit.buy_market_order("KRW-BTC", my_krw*0.9995))
         print("buy")
     else :
         print("Fail : less than KRW 5000")
  • upbit.get_balance 함수를 사용해 계좌에 원화 잔고를 불러옵니다.
  • 업비트는 매수 시 수수료가 0.05%이며, 5000원 이상인 경우에만 매수를 실행할 수 있어 if 문을 만들어줍니다.
  • 그리고 5000원 미만인 경우 매수가 실행되지 않도록 해주겠습니다.

매도 함수 만들기

매도 함수도 마찬가지로 GPT가 Sell를 결정한 경우 BTC 잔고를 불러와서 전량 매도를 합니다.

elif result["decision"] == "sell" :
     my_btc = upbit.get_balance("KRW-BTC")
     current_price = pyupbit.get_orderbook(ticker="KRW-BTC")['orderbook_units'][0]["ask_price"]
     if my_btc*current_price > 5000 :
         print(upbit.sell_market_order("KRW-BTC", upbit.get_balance("KRW-BTC")))
         print("Sell")
     else :
         print("Fail : less than KRW-BTC 5000")
  • 매도의 경우에도 5000원 미만은 경우 실행이 되지 않게 BTC의 현재가격과 가지고 있는 BTC 수량을 곱해서 5000원 미만이라면 매도가 실행되지 않게 함수를 구성해줍니다.

보류 함수

GPT가 Hold라도 판단한 경우 그냥 넘어가 주겠습니다.

elif result["decision"] == "hold" :
     print("Hold")

트레이딩 반복 실행하기

트레이딩 반복 실행을 위해 전체 코드를 하나의 함수로 만들어줍니다.

전체를 들여 쓴 후 GPT_trading(): 함수로 묶어줍니다.

그리고 하단에 while 문을 만들어줍니다.

여기서 time 라이브러리를 사용해 3600초 = 1시간 마다 GPT에게 답변을 받아 매매를 진행하도록 구성해보았습니다.

트레이딩이 실행된 후 3600초 대기 후 다음 반복해서 함수가 실행됩니다.

맺음말 및 유의사항

위 프로그램은 30일 일봉 자료만으로 구성한 트레이닝 프로그램입니다. 실제로 수익을 내기엔 GPT가 알고있는 데이터가 부족할 수 있습니다. 자신 만의 데이터를 추가해 준다면 성과를 개선할 수 있겠습니다.

또한 현재 프로그램은 3,600초 마다 GPT API를 호출하게 되어 있습니다. 호출 시 마다 토큰 비용이 소모되기 때문에 시간을 조절하여 자신의 토큰 예산에 맞게 사용해야 합니다.

완성된 코드는 아래 GITHUB 링크를 방문하여 다운로드 받을 수 있으니 자신만의 매매 전략을 적용하여 코드를 개선해 보시길 바랍니다.

[Vscode 필수 단축키]

  • Ctrl + S : 모든 파일 저장
  • Ctrl + C : 실행 중인 프로세스 강제 종료