안녕하세요! 이번 포스팅에서는 드디어 바이낸스 선물 데이터를 실시간으로 불러와,
이동평균(Moving Average) 을 이용해 매수·매도 신호를 자동으로 계산하는 방법을 만들어보겠습니다.
GPT가 분석할 수 있는 데이터 구조를 만들고,
이후 자동매매 로직의 기반이 되는 시세 수집 → 신호 생성 → 시각화 단계까지 완성합니다.

🔹 1. 이번 편에서 완성할 흐름
- 바이낸스 API로 과거 시세(캔들 데이터) 수집
- Pandas로 데이터프레임 변환 및 정리
- ta 라이브러리로 이동평균선 계산
- 매수/매도 신호 자동 판별
이 네 단계가 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
'Python' 카테고리의 다른 글
| 바이낸스 선물 GPT 자동매매 5편 : 리스크 관리 & 포지션 사이징 (0) | 2025.10.05 |
|---|---|
| 바이낸스 선물 GPT 자동매매 4편 : 주문 실행 & 예외 처리 (0) | 2025.10.05 |
| 바이낸스 가입 & API 발급 방법 기초 가이드 (0) | 2025.10.05 |
| 바이낸스 선물 GPT 자동매매 2편 : 개발 환경 & API 키 발급 (0) | 2025.10.05 |
| 바이낸스 선물 GPT 자동매매 1편 : 기초 개념 & 안전장치 (0) | 2025.10.05 |