개발/Python 프로젝트: 주식 자동 매매

[주식 자동 매매] 5. 주식 투자 자동화 프로젝트 정리

honeypeach 2025. 12. 20. 21:10

📌 [파이썬] 주식 투자 자동화 프로젝트 정리

(feat. 한국투자증권 API, 이동평균선 전략)

주식 투자 자동화에 관심 있으신가요?
이 글은 한국투자증권 Open API + 이동평균선(MA) 전략을 활용해
👉 백테스트부터 자동매매까지 직접 구현해보는 프로젝트를 정리한 학습용 포스팅입니다.

 

실제 실습에서 사용한 코드는 그대로 유지했고, 전체 구조와 핵심 아이디어를 이해하기 쉽게 설명합니다.


1. 프로젝트 목표

이 프로젝트의 목표는 다음과 같습니다.

  • 한국투자증권 모의투자 계좌 생성 및 API 활용
  • 1분 봉 데이터 기준 이동평균선 전략 적용
    • 단기: 20분 이동평균선
    • 장기: 60분 이동평균선
  • 골든크로스 / 데드크로스 기반 자동매매 로직 구현
  • 백테스트 코드 실시간 자동매매 코드를 직접 작성

2. 폴더 / 파일 구조

python-automated-trading/
├─ .venv/
├─ backtest.py
├─ main.py
└─ sample.json
  • backtest.py : 과거 데이터로 전략 성능 검증
  • main.py : 실시간 가격 기준 자동매매
  • sample.json : 분봉 가격 데이터 샘플

3. 주요 요구사항 정리

  • 한국투자증권 Open API 문서 참고
  • requests 모듈 사용
  • 1분 봉 데이터 기반
  • 20분 / 60분 이동평균선 계산
  • 골든크로스 → 전량 매수
  • 데드크로스 → 전량 매도
  • 백테스트와 실매매 코드 분리
    • backtest.py
    • main.py

4. 백테스트 코드 예시 (backtest.py)

과거 분봉 데이터를 이용해
이동평균선 전략이 실제로 수익이 났는지 검증하는 코드입니다.

import json

# 이동평균 계산 함수
def get_moving_average(prices, window):
    if len(prices) < window:
        return None
    return sum(prices[-window:]) / window

# 매매 신호 판단 함수
def get_signal(short_ma, long_ma, prev_short_ma, prev_long_ma):
    if prev_short_ma <= prev_long_ma and short_ma > long_ma:
        return 'buy'   # 골든크로스
    elif prev_short_ma >= prev_long_ma and short_ma < long_ma:
        return 'sell'  # 데드크로스
    else:
        return None    # 신호 없음

# JSON 데이터 불러오기
with open('sample.json', 'r') as f:
    data = json.load(f)

prices = [int(item['stck_prpr']) for item in data]
cash = 1_000_000
stock = 0

history = []

for i in range(60, len(prices)):
    ma20 = get_moving_average(prices[:i], 20)
    ma60 = get_moving_average(prices[:i], 60)
    prev_ma20 = get_moving_average(prices[:i - 1], 20)
    prev_ma60 = get_moving_average(prices[:i - 1], 60)

    signal = get_signal(ma20, ma60, prev_ma20, prev_ma60)
    price = prices[i]

    # 매수: 전량
    if signal == 'buy' and cash > 0:
        stock = cash // price
        cash -= stock * price
        print(f"{i}분: 골든크로스 → 매수, 가격: {price}, 보유수:{stock}")
    # 매도: 전량
    elif signal == 'sell' and stock > 0:
        cash += stock * price
        print(f"{i}분: 데드크로스 → 매도, 가격: {price}, 수익률: {(cash / 1_000_000 - 1) * 100:.2f}%")
        stock = 0

    total_asset = cash + stock * price
    history.append(total_asset)

✔ 백테스트 핵심 포인트

  • 과거 가격으로 가상 매매 수행
  • 매수/매도는 항상 전량
  • 전략의 누적 성과를 history로 기록

5. 자동 매매 코드 예시 (main.py)

이번에는 실시간 가격을 기준으로
자동으로 매수/매도를 반복하는 구조입니다.

import requests
from time import sleep

# 실시간 가격 가져오기 함수 (pseudo code, API 문서 참고해서 채워넣기)
def get_current_price():
    # 실제로는 한국투자증권 API에 맞는 헤더, URL 등 필요
    # resp = requests.get(api_url, headers=headers)
    # data = resp.json()
    # return int(data['current_price'])
    return 50000  # 임시 예시

def get_moving_average(prices, window):
    if len(prices) < window:
        return None
    return sum(prices[-window:]) / window

def get_signal(short_ma, long_ma, prev_short_ma, prev_long_ma):
    if prev_short_ma <= prev_long_ma and short_ma > long_ma:
        return 'buy'
    elif prev_short_ma >= prev_long_ma and short_ma < long_ma:
        return 'sell'
    else:
        return None

prices = []
cash = 1_000_000
stock = 0

while True:
    price = get_current_price()
    prices.append(price)

    if len(prices) < 61:
        print(f"{len(prices)}분: 가격 - {price}")
        sleep(60)
        continue

    ma20 = get_moving_average(prices, 20)
    ma60 = get_moving_average(prices, 60)
    prev_ma20 = get_moving_average(prices[:-1], 20)
    prev_ma60 = get_moving_average(prices[:-1], 60)

    signal = get_signal(ma20, ma60, prev_ma20, prev_ma60)

    # 매수: 전량
    if signal == 'buy' and cash > 0:
        stock = cash // price
        cash -= stock * price
        print(f"골든크로스, 매수! 가격: {price}, 보유수:{stock}")
    # 매도: 전량
    elif signal == 'sell' and stock > 0:
        cash += stock * price
        print(f"데드크로스, 매도! 가격: {price}, 보유수익률: {(cash / 1_000_000 - 1)*100:.2f}%")
        stock = 0

    print(f"총 평가금액: {cash + stock * price}")
    sleep(60)

✔ 자동매매 구조 요약

  • 1분마다 가격 수집
  • 이동평균선 계산
  • 신호 발생 시 즉시 전량 매수/매도
  • 무한 루프 구조 (while True)

6. 참고 / Tip

  • API 연동 방식은 증권사·계좌 종류(모의/실전) 에 따라 다름
    → 반드시 공식 API 문서 참고
  • 자동매매는 항상 모의투자로 충분히 테스트 후 실전 적용
  • sample.json 데이터 포맷은 실제 API 응답 구조에 맞게 준비
  • 실전에서는 다음 요소들이 추가로 필요함
    • 예외 처리
    • API 인증 갱신
    • 로그 저장
    • 주문 실패 처리

💡 이 예제는 백테스트와 자동매매의 핵심 로직만 담은 구조입니다.
실전에서는 안정성과 리스크 관리가 훨씬 중요합니다.

 

728x90