R

[R 연습] 증권사에서 다운받은 일일주가 데이터를 구글 시트에 올려 공유하고, 이를 가져오는 코드를 작성하라.

오렌지사과키위 2023. 12. 4. 15:19

문제

Yahoo Finance에서 제공하는 국내 주식 데이터는 결측치가 포함되어 있거나 경우에 따라서는 잘못된 값이 있을 수 있다. 보다 깨끗한 데이터를 제공하는 증권사 HTS를 이용하여 데이터를 다운로드 받아라. 이렇게 구한 국내 주식 데이터를 다른 시스템 또는 사용자가 사용할 수 있도록 구글 시트를 통해 공유하라. 최종적으로 R에서 공유된 데이터를 다운로드하는 코드를 작성하라.

 

코드

library(googlesheets4)  ## for read_sheet()
library(tidyverse)  ## for others.

# Google sheet id in a URL for sharing.
korea_stock_sheet_id  <- "1wN5G71U-rI1QQj33Bt__deZfwHGwRLGULJjoH8Pl-lo"

# Read the first sheet which contains other sheet index.
ko_stock_index <- read_sheet(korea_stock_sheet_id)

# Reach each sheet which contains prices for a specific stock.
for (sheet in ko_stock_index$sheet) {
  assign(sheet,
         read_sheet(
           korea_stock_sheet_id, sheet = sheet,
           # Read only the first 6 columns.
           range = "A:F",
           col_names = c("date", "open", "high", "low", "close", "volume"),
           # Treat cell contents as numeric. (Otherwise they could be lists.)
           col_types = "n",
           # Skip the header row.
           skip = 1) %>%
           # Remove lines contains NA.
           na.omit() %>%
           # Convert the first column to date.
           mutate(date = ymd(date)) %>%
           # Order rows by date.
           arrange(date)
  )
}

 

결과 및 해석

미래에셋증권의 HTS인 카이로스에서는 개별 주식 차트 창에서 해당 데이터를 엑셀로 저장할 수 있습니다. 차트에서 오른쪽 버튼을 누르면 "엑셀로저장" 항목이 뜹니다. 자동으로 엑셀이 불려지고 그 내용을 확인할 수 있습니다. 저장된 파일은 확장자가 .nc2입니다. 저장 위치는 윈도우 탐색기를 띄우면 (윈도우 키 + E) 최근 항목 목록에서 확인할 수 있습니다.

 

.nc2 파일 형식은 실제로는 탭으로 항목이 구분된 .tsv 파일 형식입니다. 확장자를 .tsv를 바꾸고 구글 드라이브에 올린 후, 구글 시트에서 새 시트 삽입 방식으로 가져오면 됩니다. 아래는 이렇게 해서 정리한 7개의 종목 시세와 인덱스입니다.

 

인덱스 페이지는 시트 이름과 티커 그리고 이름을 나열했습니다. 개별 종목 시트는 다운로드 받은 자료를 그대로 올린 것입니다. 시가, 고가, 저가, 종가는 모두 수정 주가입니다. (차트 환경 설정에서 수정 주가 적용 여부를 설정할 수 있습니다.)  거래량 이후의 5, 10, 20, 60, 120 칼럼은 거래량의 이동 평균입니다.

 

기본으로 3,000개 즉 일봉으로는 대략 12년치가 받아지는데, 차트에서 범위를 조정하면 그 이전 데이터에 대해서도 접근이 가능합니다. 이런 소소한 번거로움 때문에 데이터 수집은 가능하면 증권사 Open API를 이용하는 것이 편리합니다. 

 

 

 

 

위 스크립트를 실행하면, 구글 계정에 로그인을 하기 위한 창을 띄우게 됩니다. 이 경우 데이터 접근을 위한 전용 계정을 하나 만들어서 쓰는 것이 좋습니다.

 

실행 결과 아래와 같이 시트 이름과 동일한 변수에 티블(tibble) 형태로 저장됩니다.

KO.069500
----------

# A tibble: 3,001 × 6
   date        open  high   low close  volume
   <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>
 1 2011-10-04 17986 18157 17697 18153 4874134
 2 2011-10-05 18287 18295 17742 17807 6013311
 3 2011-10-06 18230 18587 18218 18287 7047483
 4 2011-10-07 18766 18917 18713 18815 8316619
 5 2011-10-10 18827 19071 18823 18839 5754812
 6 2011-10-11 19327 19339 19156 19177 4288347
 7 2011-10-12 19177 19327 18990 19323 4883306
 8 2011-10-13 19534 19616 19433 19433 3667859
 9 2011-10-14 19408 19599 19250 19542 4044636
10 2011-10-17 19725 19872 19681 19843 3784048
# ℹ 2,991 more rows
# ℹ Use `print(n = ...)` to see more rows

 
 
아래는 가져온 데이터를 이용하여 KODEX 200과 KODEX 코스닥 150 ETF의 누적 수익률을 그래프로 나타낸 것입니다. (x축 날짜 표기가 좀 이상하네요)
 

library(PerformanceAnalytics)

prices <- 
  cbind(as.xts(KO.069500)$close,
        as.xts(KO.229200)$close) %>%
  setNames(c("KODEX KOSPI 200", "KODEX KOSDAQ 150")) %>%
  na.omit()

rets <- Return.calculate(prices) %>% na.omit()
chart.CumReturns(rets, legend.loc = "topleft")

 
 

도움이 되었다면, 이 글을 친구와 공유하는 건 어떻까요?

facebook twitter kakaoTalk naver band