퀀트 전략을 검증하려면 가장 먼저 필요한 것이 있습니다.
바로 종목별 장기 시세 데이터, 특히 **일별 종가(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
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를 얻는 방법은 아래와 같습니다:
- 브라우저에서 종목명 검색
- 해당 종목 클릭 → URL 복사
- 개발자 도구(F12)에서 Network → XHR → HistoricalDataAjax 확인
- 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. 전체 종목 확장 및 자동 저장 구조 만들기
이제 하나의 종목이 아닌
코스피 전체 혹은 코스닥 전체 종목에 적용하려면 어떻게 해야 할까요?
방법은 간단합니다.
- 종목명과 종목 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)**를 계산하는
백테스트 기본 프레임워크를 함께 구성해보겠습니다.
'Quant' 카테고리의 다른 글
파이썬 퀀트 – 수집한 종가 데이터로 CAGR, MDD 계산하기 (0) | 2025.06.29 |
---|---|
PER+PBR 점수 전략 구현 – 파이썬 실전 코드 예시 (1) | 2025.06.29 |
파이썬으로 만드는 나만의 퀀트 백테스트 시스템 – 기초부터 시작 (0) | 2025.06.28 |
엑셀로 퀀트전략 백테스트 하는 법 – 코스피·코스닥 종목 다운로드부터 수익률 계산까지 (0) | 2025.06.27 |
[퀀트 플랫폼] ③ 퀀터스 - 단계별 설정 방식과 다양한 전략 분석 (0) | 2025.06.27 |
[퀀트 플랫폼] ② 젠포트 - 다양한 지표 설정을 지원하는 Tool (1) | 2025.06.26 |
[퀀트 플랫폼] ① 퀀트킹 - 단순하지만 강력한 퀀트 투자 시스템 (4) | 2025.06.25 |
퀀트 투자 지속적으로 실천하는 법 – 시스템화 전략 (1) | 2025.06.25 |