본문 바로가기

Quant

파이썬을 활용한 코스피·코스닥 전 종목 10년 종가 데이터 가져오기

반응형

퀀트 전략을 검증하려면 가장 먼저 필요한 것이 있습니다.
바로 종목별 장기 시세 데이터, 특히 **일별 종가(Historical Closing Price)**입니다.

많은 퀀트 초보자들이 전략은 짜지만,
막상 데이터를 수집하는 단계에서 멈추곤 합니다.
특히 코스피·코스닥 전 종목의 10년 데이터를 직접 모으려면
하루 이틀로는 끝나지 않는 작업입니다.

하지만 파이썬(Python)을 활용하면 반복 작업을 자동화할 수 있고,
한 번만 셋업하면 언제든 최신 데이터도 쉽게 불러올 수 있습니다.

이번 글에서는 **Investing.com(인베스팅닷컴)**에서
코스피, 코스닥 전 종목의 10년 일별 종가 데이터를 파이썬으로 수집하는 방법
단계별로 상세히 알려드리겠습니다.

파이썬 주식 종목 크롤링

1. 수집 전략 개요 – 왜 Investing.com인가?

Investing.com은 글로벌 종목은 물론
한국 주식 시장(KRX)의 주요 종목 시세 데이터를 무료로 제공하는 플랫폼입니다.

다른 데이터 소스(네이버 금융, 야후파이낸스 등)에 비해

  • 과거 시세 길이(최대 10~20년)
  • 종가·거래량·고가·저가 등 정보 포함
  • 수집 속도 빠름
    등의 장점이 있습니다.

단점은 데이터가 ‘정식 API’로 제공되지 않기 때문에
웹 페이지에서 HTML 구조를 분석해 직접 긁어오는 방식(웹 스크래핑)을 사용해야 합니다.

이 작업을 자동화하려면
파이썬의 BeautifulSoup, requests, pandas 같은 라이브러리가 필요합니다.


2. 파이썬 환경 준비 – 라이브러리 설치 및 기본 세팅

파이썬 설치 후, 아래 주요 라이브러리를 먼저 설치하세요.
터미널이나 주피터 노트북에서 아래 명령어를 입력합니다.

pip install pandas requests beautifulsoup4 tqdm
 
 
이제 기본 모듈을 불러옵니다:
import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
from tqdm import tqdm
 
📌 TIP: tqdm은 데이터 다운로드 진행 상황을 확인하는 데 유용한 툴입니다.

3. 실전 코드 – Investing.com에서 10년 종가 가져오기

▶️ 1단계: 종목 ID 확인

Investing.com은 종목명을 직접 입력하는 방식이 아니라
**종목별 고유 ID (예: 삼성전자 = 49604)**를 사용합니다.

예를 들어 삼성전자 페이지 URL은 다음과 같습니다:
https://www.investing.com/equities/samsung-elec

하지만 실제 히스토리컬 데이터 요청 시에는 다음과 같은 ID를 사용합니다:
https://www.investing.com/instruments/HistoricalDataAjax

ID를 얻는 방법은 아래와 같습니다:

  1. 브라우저에서 종목명 검색
  2. 해당 종목 클릭 → URL 복사
  3. 개발자 도구(F12)에서 Network → XHR → HistoricalDataAjax 확인
  4. Request Payload에서 smlID, pairID 확인

💡 초보자에겐 어렵기 때문에,
상위 20~30개 종목 ID는 미리 정리된 CSV 파일을 활용하는 것도 방법입니다.


▶️ 2단계: 10년치 종가 크롤링 코드 (삼성전자 예시)

def get_investing_data(pair_id, from_date, to_date):
    url = "https://www.investing.com/instruments/HistoricalDataAjax"
    headers = {
        "User-Agent": "Mozilla/5.0",
        "X-Requested-With": "XMLHttpRequest"
    }
    data = {
        "curr_id": pair_id,
        "st_date": from_date,
        "end_date": to_date,
        "interval_sec": "Daily",
        "sort_col": "date",
        "sort_ord": "DESC",
        "action": "historical_data"
    }
    
    session = requests.Session()
    res = session.post(url, data=data, headers=headers)
    soup = BeautifulSoup(res.text, "html.parser")
    
    table = soup.find("table", class_="historicalTbl")
    rows = table.find_all("tr")
    
    result = []
    for row in rows[1:]:
        cols = row.find_all("td")
        if len(cols) == 7:
            date = cols[0].text
            close = cols[1].text.replace(',', '')
            result.append([date, float(close)])
    
    df = pd.DataFrame(result, columns=["Date", "Close"])
    df["Date"] = pd.to_datetime(df["Date"])
    df = df.sort_values("Date")
    
    return df

 

▶️ 실행 예시

from_date = "01/01/2014"
to_date = datetime.today().strftime("%d/%m/%Y")

samsung = get_investing_data(49604, from_date, to_date)
print(samsung.head())

위 코드를 실행하면 삼성전자의 최근 10년 일별 종가 데이터가 정렬되어 출력됩니다.
이 데이터를 .csv로 저장해두면 백테스트에 바로 활용할 수 있습니다.


4. 전체 종목 확장 및 자동 저장 구조 만들기

이제 하나의 종목이 아닌
코스피 전체 혹은 코스닥 전체 종목에 적용하려면 어떻게 해야 할까요?

방법은 간단합니다.

  1. 종목명과 종목 ID 목록을 담은 CSV 파일을 준비합니다.
    예: 종목명,ID 형태의 파일 (krx_list.csv)
삼성전자,49604  
LG화학,49606  
...

 

    2. 이 파일을 불러와서 반복 실행합니다:

stock_list = pd.read_csv("krx_list.csv")

for i, row in tqdm(stock_list.iterrows(), total=stock_list.shape[0]):
    try:
        df = get_investing_data(row['ID'], from_date, to_date)
        df.to_csv(f"data/{row['종목명']}_close.csv", index=False)
    except:
        print(f"{row['종목명']} 오류 발생")

 

이 구조를 만들면
코스피·코스닥 수백 개 종목의 10년 일별 종가를 자동으로 한 번에 수집할 수 있습니다.
시간은 조금 걸리지만, 하루 작업으로 귀중한 백테스트 자산이 완성됩니다.


✅ 마무리: 퀀트의 시작은 ‘좋은 데이터’부터

퀀트 전략의 핵심은 복잡한 수식이 아니라
**‘검증 가능한 데이터’와 ‘반복 가능한 조건’**입니다.

이번 글에서 소개한 방법을 통해
코스피·코스닥 종목들의 장기 시세 데이터를 직접 확보할 수 있습니다.

데이터를 수집해두면

  • PER, PBR 등 재무지표와 함께 병합
  • 매월/분기 리밸런싱 백테스트
  • 나만의 전략 성과 리포트 작성
    이 가능해집니다.

👉 다음 글에서는 수집한 데이터로
**CAGR(연복리 수익률), MDD(최대 낙폭), 샤프지수(Sharpe Ratio)**를 계산하는
백테스트 기본 프레임워크를 함께 구성해보겠습니다.