iBetter Books
수정

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 파이프라인과 자연스럽게 연결되기 때문입니다.

다음 챕터에서는 이 데이터로 수익률과 변동성을 계산합니다. 주가 자체보다 수익률이 분석에 더 유용한 이유를 함께 알아봅니다.