본문 바로가기
Python

바이낸스 선물 GPT 자동매매 3편 : 데이터 수집 & 이동평균 신호 계산

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

안녕하세요! 이번 포스팅에서는 드디어 바이낸스 선물 데이터를 실시간으로 불러와,
이동평균(Moving Average) 을 이용해 매수·매도 신호를 자동으로 계산하는 방법을 만들어보겠습니다.

GPT가 분석할 수 있는 데이터 구조를 만들고,
이후 자동매매 로직의 기반이 되는 시세 수집 → 신호 생성 → 시각화 단계까지 완성합니다.

🔹 1. 이번 편에서 완성할 흐름

  1. 바이낸스 API로 과거 시세(캔들 데이터) 수집
  2. Pandas로 데이터프레임 변환 및 정리
  3. ta 라이브러리로 이동평균선 계산
  4. 매수/매도 신호 자동 판별

이 네 단계가 GPT 자동매매의 핵심 “데이터 파이프라인”입니다.
이제 하나씩 구현해봅시다.

🔹 2. 사전 준비 (이전 편 이어서)

지난 2편에서 이미 아래가 준비되어 있어야 합니다:

  • python-binance, pandas, ta, python-dotenv 설치
  • .env 파일에 BINANCE_API_KEY, BINANCE_API_SECRET 저장 완료

이제 바로 코드를 작성할 수 있습니다.

 

바이낸스 선물 GPT 자동매매 2편 : 개발 환경 & API 키 발급

안녕하세요! 이번 포스팅은 시리즈 “바이낸스 선물 GPT 자동매매”의 두 번째 편으로, 본격적인 코딩 전에 필요한 개발 환경 세팅과 API 키 발급 과정을 자세히 설명드립니다.GPT가 자동매매 코드

codelenz.tistory.com

🔹 3. 기본 코드 구조 설정

trading.py 파일에 다음 코드를 작성합니다 👇

import os
import pandas as pd
import ta
from binance.client import Client
from dotenv import load_dotenv

# 환경변수 로드
load_dotenv()

API_KEY = os.getenv("BINANCE_API_KEY")
API_SECRET = os.getenv("BINANCE_API_SECRET")

client = Client(API_KEY, API_SECRET)

📌 코드 설명

  • .env 파일의 키를 안전하게 불러옵니다.
  • Client() 객체를 생성하면 이제 바이낸스 API와 연결됩니다.
  • 테스트넷을 사용할 경우
client = Client(API_KEY, API_SECRET, testnet=True)

🔹 4. 캔들(시세) 데이터 수집 함수 만들기

바이낸스에서는 futures_klines() 메서드를 통해 과거 시세를 불러올 수 있습니다.

def get_historical_klines(symbol='BTCUSDT', interval='1h', limit=100):
    """과거 캔들 데이터를 가져오는 함수"""
    klines = client.futures_klines(symbol=symbol, interval=interval, limit=limit)
    df = pd.DataFrame(klines, columns=[
        'timestamp', 'open', 'high', 'low', 'close', 'volume',
        'close_time', 'quote_asset_volume', 'number_of_trades',
        'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'
    ])
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    df[['open', 'high', 'low', 'close', 'volume']] = df[['open', 'high', 'low', 'close', 'volume']].astype(float)
    return df

✅ 설명

  • symbol: 거래쌍 (기본값은 BTCUSDT)
  • interval: 캔들 간격 (1m, 1h, 4h, 1d 등 가능)
  • limit: 불러올 캔들 수 (최대 1500개)
  • pd.DataFrame()으로 API 결과를 정리해 사람이 읽을 수 있는 형태로 변환합니다.

테스트 실행

df = get_historical_klines()
print(df.tail())

🔹 5. 이동평균선 계산 함수

이동평균(MA)은 시장의 추세를 파악하는 가장 기본적인 기술적 지표입니다.
단기선이 장기선을 돌파하면 “매수”, 반대로 하락 돌파 시 “매도” 신호로 해석합니다.

def apply_moving_averages(df, short_window=10, long_window=30):
    """이동평균선을 계산하여 데이터프레임에 추가"""
    df['SMA_Short'] = ta.trend.sma_indicator(df['close'], window=short_window)
    df['SMA_Long'] = ta.trend.sma_indicator(df['close'], window=long_window)
    return df

테스트 실행

df = apply_moving_averages(df)
print(df[['timestamp', 'close', 'SMA_Short', 'SMA_Long']].tail(5))

🔹 6. 매매 신호 생성 함수

이제 단기 이동평균과 장기 이동평균의 골든크로스/데드크로스를 감지합니다.

def generate_signal(df):
    """단기/장기 이동평균선을 비교하여 매매 신호 생성"""
    if df['SMA_Short'].iloc[-2] < df['SMA_Long'].iloc[-2] and df['SMA_Short'].iloc[-1] > df['SMA_Long'].iloc[-1]:
        return "BUY"
    elif df['SMA_Short'].iloc[-2] > df['SMA_Long'].iloc[-2] and df['SMA_Short'].iloc[-1] < df['SMA_Long'].iloc[-1]:
        return "SELL"
    else:
        return "HOLD"

테스트 실행

signal = generate_signal(df)
print(f"현재 매매 신호: {signal}")

🔹 7. 전체 실행 코드

모든 함수를 합치면 아래와 같습니다

import os
import pandas as pd
import ta
from binance.client import Client
from dotenv import load_dotenv

# 환경 변수 로드
load_dotenv()

API_KEY = os.getenv("BINANCE_API_KEY")
API_SECRET = os.getenv("BINANCE_API_SECRET")
client = Client(API_KEY, API_SECRET)

def get_historical_klines(symbol='BTCUSDT', interval='1h', limit=100):
    klines = client.futures_klines(symbol=symbol, interval=interval, limit=limit)
    df = pd.DataFrame(klines, columns=[
        'timestamp', 'open', 'high', 'low', 'close', 'volume',
        'close_time', 'quote_asset_volume', 'number_of_trades',
        'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'
    ])
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    df[['open', 'high', 'low', 'close', 'volume']] = df[['open', 'high', 'low', 'close', 'volume']].astype(float)
    return df

def apply_moving_averages(df, short_window=10, long_window=30):
    df['SMA_Short'] = ta.trend.sma_indicator(df['close'], window=short_window)
    df['SMA_Long'] = ta.trend.sma_indicator(df['close'], window=long_window)
    return df

def generate_signal(df):
    if df['SMA_Short'].iloc[-2] < df['SMA_Long'].iloc[-2] and df['SMA_Short'].iloc[-1] > df['SMA_Long'].iloc[-1]:
        return "BUY"
    elif df['SMA_Short'].iloc[-2] > df['SMA_Long'].iloc[-2] and df['SMA_Short'].iloc[-1] < df['SMA_Long'].iloc[-1]:
        return "SELL"
    else:
        return "HOLD"

if __name__ == "__main__":
    df = get_historical_klines()
    df = apply_moving_averages(df)
    signal = generate_signal(df)
    print(f"현재 매매 신호: {signal}")

 

🔹 8. 실행 결과 예시

현재 매매 신호: BUY
현재 매매 신호: HOLD

 

 

위 결과는 최근 30개 캔들 기준으로 단기선과 장기선의 교차 상태를 분석한 결과입니다.
이 신호가 다음 편에서 자동 주문 로직으로 연결될 예정입니다.

🔹 9. GPT가 이 데이터를 활용하는 방식

GPT는 이렇게 정제된 df를 분석하여

  • 최근 추세(상승/하락) 판단
  • SMA 구간별 전략 조합
  • 백테스트용 전략 개선 제안

등을 자동으로 수행할 수 있습니다.
즉, GPT는 단순 신호 계산기가 아닌, 전략 최적화 조력자로 발전할 수 있습니다.

🔹 10. 다음 편 예고 (4편)

다음 글에서는
“주문 실행 & 예외 처리” 를 다룹니다.
BUY 또는 SELL 신호가 발생하면 실제로 바이낸스 선물 API를 통해
시장가 주문을 실행하는 코드를 작성하고,
API 오류나 네트워크 문제를 처리하는 방법까지 설명드리겠습니다.

✨ 맺음말

지금까지 바이낸스 시세를 불러오고,
GPT 자동매매의 핵심이 되는 이동평균 신호 계산 시스템을 완성했습니다.
이제 데이터는 준비되었으니,
다음 편에서 “진짜 거래가 일어나는 순간” 을 함께 만들어봅시다 🚀

 

바이낸스 가입 방법 총정리 (10% 수수료 할인 코드 포함)

바이낸스(Binance)는 세계 최대의 가상화폐 거래소 중 하나로, 현물 거래(Spot)와 선물 거래(Futures)를 모두 지원합니다. 또한 API를 이용한 자동매매 시스템 트레이딩도 가능하여, 전 세계 트레이더들

codelenz.tistory.com

 

반응형