본문 바로가기

AI 기반 자동매매 & 금융데이터 분석

1편. 국내/미국 주식 데이터 수집 자동화 실전 가이드

반응형

 

🧠📈 AI + 주식 자동매매 프로젝트 공유 — 1편. 국내/미국 주식 데이터 수집 자동화 실전 가이드

많은 분들이 “주식 자동매매”는 복잡해 보인다고 생각하는데, 사실 가장 먼저 안정적으로 구축해야 하는 영역은 데이터 수집 자동화 파이프라인입니다.
AI 모델·백테스트·시그널 생성은 모두 “좋은 데이터” 위에서만 돌아가기 때문입니다.

이번 글에서는 제가 실제로 구축했던 국내/미국 주식 데이터 수집 아키텍처,
그리고 운영하면서 겪었던 문제 해결 경험까지 실전 기반으로 정리합니다.


1. 전체 아키텍처 개요

[데이터 소스]
 ├─ 국내: KRX, Naver Finance, 증권사 API
 └─ 미국: Yahoo Finance, Polygon.io, Alpaca API

[수집 레이어]
 ├─ Python 데이터 수집 워커 (Airflow 스케줄링)
 ├─ 주식별 Task 병렬 실행 (DAG)

[저장 레이어]
 ├─ Raw Zone : Parquet/HDFS(or S3)
 ├─ Clean Zone: Spark + Delta Lake 정제

[서비스 레이어]
 ├─ 백테스트 엔진
 ├─ 모델 학습 파이프라인(ML/LLM)
 └─ 자동매매 에이전트 (FastAPI + vLLM)

핵심은 Raw → Clean → Feature 단계가 명확한 “데이터 레이크 구조”로 가는 것입니다.
중간 단계가 정리가 안 되어 있으면 모델 정확도, 시그널 품질이 떨어집니다.


2. 국내/미국 주식 수집 코드 예시 (실제 운영 기반)

■ 미국 일봉 데이터 수집 (Fast, Fail-Safe 방식)

import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta

def fetch_us_stock(symbol, period="1y", interval="1d"):
    try:
        data = yf.download(symbol, period=period, interval=interval, auto_adjust=True)
        data.reset_index(inplace=True)
        data["symbol"] = symbol
        return data
    except Exception as e:
        print(f"[ERROR] {symbol} 다운로드 실패: {e}")
        return pd.DataFrame()

실제 경험에서 얻은 교훈

  • yfinance는 빠르고 간편하지만, 요청량이 많으면 throttle 발생 → 재시도 로직 + 대체 API(Polygon/Alpaca) 준비 필수
  • 종목별 Task를 분산 실행하면 속도가 10배 이상 개선됨

■ 국내 주식 데이터 수집 (Naver + KRX 혼합 전략)

import requests
import pandas as pd

def fetch_krx_codes():
    url = "https://kind.krx.co.kr/corpgeneral/corpList.do?method=download"
    df = pd.read_html(url, header=0)[0]
    df["종목코드"] = df["종목코드"].map('{:06d}'.format)
    return df[["회사명", "종목코드"]]

def fetch_korea_price(code):
    url = f"https://finance.naver.com/item/sise_day.nhn?code={code}"
    dfs = [pd.read_html(f"{url}&page={i}")[0] for i in range(1, 11)]
    df = pd.concat(dfs).dropna()
    df["종목코드"] = code
    return df

실전 문제 해결 경험

  • 네이버는 페이지 기반이라 천천히 수집하면 차단 위험 ↓
  • KRX API는 안정적이지만 “일봉, 분봉 제한”이 존재
  • 결국 KRX 기본정보 + 네이버 가격 결합이 가장 실전적으로 맞음

3. Airflow 기반 스케줄러 운영 팁

실제 자동매매 프로젝트는 매일 새벽 3~4시에 전체 데이터를 업데이트해야 합니다.

DAG 샘플

from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime

def run_us_collector():
    # 종목 목록 반복 수집 코드
    pass

with DAG(
    dag_id="us_stock_ingest",
    start_date=datetime(2024, 1, 1),
    schedule_interval="0 4 * * *",
    catchup=False
):
    PythonOperator(
        task_id="collect_us_data",
        python_callable=run_us_collector
    )

운영 과정에서 실제로 겪은 문제

  • DAG 실패 시 재시도 필요 → Airflow retry + Slack 알림 필수
  • API 호출량 증가 → IP 교체 or Proxy 사용, 속도 2배 향상
  • 일부 종목 상폐/정지 → 무한 에러 방지 로직 필요

4. 실전 팁 3가지

✔ TIP 1. 데이터는 무조건 “Raw → Clean → Feature” 3단계로

정제된 파일만 저장하면 디버깅할 때 지옥을 봅니다.
Raw를 항상 남겨야 모델 재학습 때 큰 힘을 발휘합니다.


✔ TIP 2. 미국 주식은 yfinance 하나로 끝내지 말 것

대용량 수집 시 throttle이 자주 발생합니다.
Polygon.io 또는 Alpaca API를 백업으로 두면 운영이 훨씬 안정적입니다.


✔ TIP 3. 종목 수집은 병렬 처리 + 실패한 종목만 재실행

전체를 다시 돌리면 수십 분 날립니다.
Airflow/Kafka/Multiprocessing로 병렬화하면 효율이 크게 올라갑니다.


5. 다음 편 예고

2편. 감성 분석 기반 시그널 실험 – 뉴스/트위터/실시간 키워드를 LLM으로 처리하는 방법

다음 편에서는

  • 감성 분석 모델 구성
  • 금융 뉴스 크롤링
  • LLM으로 투자심리 점수 만들기
  • 실제로 수익률에 영향이 있었던 케이스
    를 실무 중심으로 정리합니다.

 


📌 추천 태그

#자동매매 #AI투자 #주식데이터 #백테스트 #LLM투자
#Airflow #데이터엔지니어링 #Quant #투자자동화 #Python

 

반응형