문제
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")
'R' 카테고리의 다른 글
[R + Python 연습] 증권사 Open API를 이용하여 종목의 일일 시세를 다운로드하라. (1) | 2023.12.05 |
---|---|
[R 연습] KOPSI 200을 추종하는 KODEX 200 ETF를 매매하는 전략을 선형 회귀 분석으로 도출하라. (0) | 2023.11.30 |
[R 연습] 기대 수익률이 더 높지만 기대 변동성도 더 높은 투자 상품은 장기적으로 얼마나 더 유리한가? (0) | 2023.11.29 |
[R 연습] 국내 주요 지수를 추종하는 ETF의 요일별 밤낮 평균 수익률은? (0) | 2023.11.29 |
[R 연습] 한국과 미국의 주요 주가지수를 추종하는 ETF들의 누적 수익률 그래프 그리기 (0) | 2023.11.28 |