📌 [파이썬] 주식 투자 자동화 프로젝트 정리
(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
'개발 > Python 프로젝트: 주식 자동 매매' 카테고리의 다른 글
| [주식 자동 매매] 4. 투자 전략 소개(이동평균선 활용) (0) | 2025.12.20 |
|---|---|
| [주식 자동 매매] 3. 한국투자증권 오픈 API로 주식 데이터 가져오기 (파이썬 예제 포함) (0) | 2025.12.20 |
| [주식 자동 매매] 2. requests 모듈 사용법 (0) | 2025.12.20 |
| [주식 자동 매매] 1. 리퀘스트(Request)와 리스폰스(Response) 쉽게 정리 (0) | 2025.12.20 |