Ch 01. 주식 데이터 수집하기 (quantmod)
주식 데이터를 분석하고 싶은데 데이터를 어디서 구해야 할지 막막했던 적 있으신가요. 사실 R에서는 패키지 하나면 전 세계 주식 시세를 바로 불러올 수 있습니다. quantmod가 그 패키지입니다.
이 챕터에서는 quantmod를 설치하고, 삼성전자와 애플 주가를 직접 내려받아 데이터 구조를 살펴봅니다.
quantmod란 무엇인가
quantmod는 "Quantitative Financial Modelling Framework"의 줄임말로, R에서 금융 데이터를 쉽게 수집하고 차트를 그릴 수 있게 해주는 패키지입니다. 야후 파이낸스(Yahoo Finance) API를 통해 전 세계 상장 종목의 OHLCV 데이터를 가져옵니다.
OHLCV는 아래 다섯 가지 가격 정보를 말합니다.
- Open: 시가 (그날 처음 거래된 가격)
- High: 고가 (그날 가장 높은 가격)
- Low: 저가 (그날 가장 낮은 가격)
- Close: 종가 (그날 마지막 거래 가격)
- Volume: 거래량 (그날 거래된 주식 수)
여기에 Adjusted가 추가되어 보통 OHLCAV 구조로 내려받습니다. Adjusted는 배당과 주식 분할을 반영한 수정 종가로, 장기 수익률 분석에 사용합니다.
패키지 설치와 로드
# 새 파일: analysis/stock_collect.R
install.packages("quantmod")
install.packages("tidyquant") # quantmod를 tidyverse 스타일로 감싼 패키지
library(quantmod)
library(tidyquant)
library(tidyverse)
library(lubridate)
tidyquant는 quantmod를 내부적으로 사용하면서 tidyverse 문법과 자연스럽게 어울리는 래퍼 패키지입니다. 두 패키지를 함께 사용하면 데이터 수집부터 시각화까지 일관된 문법으로 작업할 수 있습니다.
미국 주식 수집하기
getSymbols()는 quantmod의 핵심 함수입니다. 종목 티커(ticker) 심볼을 넘기면 야후 파이낸스에서 데이터를 내려받아 전역 환경에 xts 객체로 저장합니다.
# 애플(AAPL), 마이크로소프트(MSFT), 구글(GOOGL) 수집
# 기간: 2022년 1월 1일 ~ 2024년 12월 31일
getSymbols(
c("AAPL", "MSFT", "GOOGL"),
src = "yahoo",
from = "2022-01-01",
to = "2024-12-31",
auto.assign = TRUE # 자동으로 전역 변수에 저장
)
# 수집된 객체 확인
class(AAPL) # xts, zoo
dim(AAPL) # 행(거래일 수), 열(6개 컬럼)
head(AAPL) # 처음 6행 확인
xts는 시계열 전용 데이터 구조입니다. 인덱스가 날짜이고 각 컬럼이 가격 정보입니다. 데이터프레임과 비슷하지만 날짜 기반 인덱싱이 매우 편리합니다.
# xts 날짜 인덱싱 예시
AAPL["2024-01"] # 2024년 1월 데이터만
AAPL["2024-01/2024-03"] # 2024년 1분기 데이터
AAPL["2024-12-31"] # 특정 날짜 하루
# 컬럼 접근
AAPL$AAPL.Close # 종가
AAPL[, "AAPL.Adjusted"] # 수정 종가
한국 주식 수집하기
야후 파이낸스에서 한국 주식을 수집하려면 티커 뒤에 .KS(코스피) 또는 .KQ(코스닥)를 붙입니다.
# 삼성전자(005930), SK하이닉스(000660), 카카오(035720)
# 코스피 상장 종목: .KS 접미사
getSymbols(
c("005930.KS", "000660.KS", "035720.KS"),
src = "yahoo",
from = "2022-01-01",
to = "2024-12-31",
auto.assign = TRUE
)
# 변수명에 점(.)이 포함되어 있으므로 백틱 또는 get() 사용
head(`005930.KS`)
# 가독성을 위해 별칭 부여
samsung <- `005930.KS`
skhynix <- `000660.KS`
kakao <- `035720.KS`
head(samsung)
tidyquant로 수집하기
tidyquant의 tq_get() 함수는 getSymbols()와 동일하게 야후 파이낸스에서 데이터를 가져오지만, 결과를 xts가 아닌 일반 데이터프레임으로 돌려줍니다. tidyverse 파이프라인과 자연스럽게 연결됩니다.
# tq_get()으로 여러 종목 한 번에 수집
stocks_tbl <- tq_get(
c("AAPL", "MSFT", "GOOGL"),
get = "stock.prices",
from = "2022-01-01",
to = "2024-12-31"
)
# 결과 확인
class(stocks_tbl) # spec_tbl_df, tbl_df, tbl, data.frame
glimpse(stocks_tbl)
# symbol 컬럼으로 종목 구분
stocks_tbl |>
group_by(symbol) |>
summarise(
rows = n(),
start_date = min(date),
end_date = max(date),
avg_close = mean(close, na.rm = TRUE)
)
tq_get()의 반환 컬럼은 소문자입니다. open, high, low, close, volume, adjusted로 접근합니다.
수집 데이터 구조 탐색
데이터를 처음 받으면 곧바로 분석하기 전에 구조부터 살펴보는 습관을 들이는 것이 좋습니다.
# 한 종목으로 기본 탐색
aapl <- tq_get(
"AAPL",
get = "stock.prices",
from = "2022-01-01",
to = "2024-12-31"
)
# 기본 탐색
dim(aapl)
summary(aapl)
anyNA(aapl) # 결측치 여부
# 거래일 수 확인 (주말·공휴일 제외이므로 365일보다 적음)
aapl |> count(year(date))
# 종가 기본 통계
aapl |>
summarise(
mean_close = mean(close),
sd_close = sd(close),
min_close = min(close),
max_close = max(close)
)
간단한 첫 시각화
데이터를 손에 넣었으니 간단하게 주가 흐름을 그려봅니다.
# ggplot2로 종가 시계열 그래프
aapl |>
ggplot(aes(x = date, y = close)) +
geom_line(color = "#2196F3", linewidth = 0.6) +
labs(
title = "Apple (AAPL) 종가 추이",
subtitle = "2022년 1월 ~ 2024년 12월",
x = "날짜",
y = "종가 (USD)"
) +
theme_minimal(base_family = "AppleGothic") +
scale_y_continuous(labels = scales::dollar)
quantmod에는 chartSeries()라는 전용 차트 함수도 있습니다. 캔들스틱 차트를 한 줄로 그립니다.
# quantmod 전용 차트 (xts 객체 필요)
getSymbols("AAPL", src = "yahoo", from = "2024-01-01", auto.assign = TRUE)
chartSeries(
AAPL,
type = "candlesticks",
subset = "2024-06/2024-12",
theme = chartTheme("white"),
name = "AAPL Candlestick"
)
이 챕터를 마치며
주식 데이터를 수집하는 방법을 두 가지 경로로 익혔습니다. getSymbols()는 xts 객체로, tq_get()은 데이터프레임으로 가져옵니다. 이후 챕터에서는 tq_get()으로 받은 데이터프레임을 주로 사용합니다. tidyverse 파이프라인과 자연스럽게 연결되기 때문입니다.
다음 챕터에서는 이 데이터로 수익률과 변동성을 계산합니다. 주가 자체보다 수익률이 분석에 더 유용한 이유를 함께 알아봅니다.