ggplot2 로 캔들차트(주식차트) 만들기

ggplot2 에는 주식차트로 흔하게 쓰이는 캔들차트 함수가 따로 없다. 알아서 네모난 모양과 세로선 하나를 조합해서 캔들차트로 만들어야 한다. 그리 어렵진 않으나, 한번에 만드는 함수가 있으면 좋을 거 같긴한데, 이제껏 없는거 보면 알아서 잘 조합해서 사용하라는 거 같다.

데이터 가져오기

investing.com 에서 종목코드를 가지고 조회하면 쉽게 하이닉스 주가 정보를 다운받을 수 있다. 그 데이터를 가지고 약간의 가공을 통해 읽어들인다. up_yn 은 시가보다 종가가 올랐는지 여부를 저장해서 추후에 색을 셋팅할때 활용한다. 그리고 nrow 는 데이터가 영업일 내역만 있다보니, 차트를 만들때, 1,2,3…n 순번을 지정하고, x 축을 숫자에 기반해 그리려고 한다. 만약 x축을 날짜 데이터로 이용한다면, 중간중간 비영업일이 비어서 표시되는 상황이 발생한다.

dt_anystock = read_csv('./data/SK Hynix Inc Stock Price History.csv', show_col_types = F) |> 
  clean_names() |> 
  mutate(date = mdy(date)) |> 
  arrange(date) |> 
  mutate(up_yn = open <= price, nrow = row_number())

price 는 종가, open 은 시가, high 는 최고가, low 는 최저가 이다.

> dt_anystock |> head()
# A tibble: 6 × 9
  date         price    open    high     low vol   change_percent up_yn  nrow
  <date>       <dbl>   <dbl>   <dbl>   <dbl> <chr> <chr>          <lgl> <int>
1 2026-04-06  886000  877000  901500  869000 3.00M 1.14%          TRUE      1
2 2026-04-07  916000  917000  933000  888000 3.30M 3.39%          FALSE     2
3 2026-04-08 1033000 1007000 1056000  992000 6.60M 12.77%         TRUE      3
4 2026-04-09  998000 1015000 1025000  990000 4.34M -3.39%         FALSE     4
5 2026-04-10 1027000 1030000 1042000 1024000 3.04M 2.91%          FALSE     5
6 2026-04-13 1040000  999000 1043000  996000 2.77M 1.27%          TRUE      6

주식차트 만들기

주식차트는 캔들모양의 차트인데, 우선 직사각형의 모양이 필요하다. geom_rect 함수를 사용하며, 시가와 종가를 이용하여 그리면 된다. 그리고 xmin, xmax0.3 을 각각 더하거나 빼고 있는데, 아까 x축의 값이 nrow 값, 즉 1,2,3…n 자연수로 되있기 때문에, 사각형 두께를 0.6 정도로 셋팅했다고 보면된다. 더 넓게, 더 좁게 셋팅하려면 저 숫자를 줄이거나 늘이면 된다.

ggplot(data = dt_anystock) +
  geom_rect(aes(xmin = nrow - 0.3, xmax = nrow + 0.3, 
                ymin = open, ymax = price, fill = up_yn)) +
  theme_bw()

최고가, 최저가를 잇는 선이 필요하다. 그 부분은 geom_segment 함수를 이용한다.

ggplot(data = dt_anystock) +
  geom_rect(aes(xmin = nrow - 0.3, xmax = nrow + 0.3, 
                ymin = open, ymax = price, fill = up_yn)) +
  geom_segment(aes(x = nrow, xend = nrow, 
                   y = low, yend = high)) +
  theme_bw()

x축 레이블 표시를 날짜로 해주는 것까지하면 거의 끝이다.

ggplot(data = dt_anystock) +
  geom_rect(aes(xmin = nrow - 0.3, xmax = nrow + 0.3, 
                ymin = open, ymax = price, fill = up_yn)) +
  geom_segment(aes(x = nrow, xend = nrow, 
                   y = low, yend = high, colour = up_yn)) +
  scale_x_continuous(labels = label_date_short()(dt_anystock |> pull(date)),
                     breaks = dt_anystock |> pull(nrow)) +
  theme_bw()

마지막으로 scale_fill_manual, scale_colour_manual 를 이용하여 약간의 디자인과 색상을 덧붙이면 아래와 같이 완성.