1 코스피 200 주식데이터

한국거래소 KRX에서 통계 → 주식 → 종목시세 → [81004] 전체 종목시세에서 81004 전체 종목시세에서 한국거래소에서 거래되고 있는 상장사 목록 및 시가총액 데이터를 구할 수 있다. 1월 3일 다운로드 받은 데이터를 바탕으로 시가총액기준으로 상위 200개 종목을 뽑아내어 별도 데이터프레임으로 저장한다.

library(tidyverse)
library(readxl)
library(quantmod)

kospi50_dat <- read_excel("data/KRX-상장사-20190111.xlsx", sheet="KOSPI") %>% 
  mutate(`거래소` = "코스피",
         `시가총액` = parse_number(`시가총액`)) %>% 
  mutate(stock_code = paste0(`종목코드`, ".KS")) %>% 
  top_n(50, wt=`시가총액`)

시가총액 상위 200개 업체를 뽑아낸 후에 종목코드를 기준으로 주식데이터를 quantmod 팩키지를 사용해서 데이터를 가져오는 대신 상위 50개 종목만 추출하여 데이터를 가져온다.

library(quantmod)
## 상위 50 주식 데이터 가져오기 -----
kospi50_df <- kospi50_dat %>% 
  select(stock_code, `종목코드`, `종목명`, `시가총액`) %>% 
  mutate(stock_data = map(stock_code, function(x) getSymbols(x, src="yahoo", from="2015-01-01",
                                                             auto.assign = FALSE, USE.NAMES = FALSE, 
                                                             simplify = FALSE))) 
## 변수명 통일 -----
for(i in 1:nrow(kospi50_df)) {
  names(kospi50_df$stock_data[[i]]) <- c("open", "high", "low", "close", "volume", "adjust")
}

kospi50_df %>% write_rds("data/kospi50_df.rds")

2 종목별 기초 통계

무명함수를 사용해서 기본적인 통계량을 각 종목별로 작업을 수행할 수 있다.

kospi50_df  <- read_rds("data/kospi50_df.rds")

kospi50_df %>% 
  arrange(desc(`시가총액`)) %>% 
  mutate(close_max_price = map_dbl(stock_data, function(x) max(x$close)),
         close_min_price = map_dbl(stock_data, function(x) min(x$close)))
# A tibble: 50 x 7
   stock_code 종목코드 종목명 시가총액 stock_data close_max_price
   <chr>      <chr>    <chr>     <dbl> <list>               <dbl>
 1 005930.KS  005930   삼성전자…  2.42e14 <S3: xts>            57220
 2 000660.KS  000660   SK하이닉…  4.74e13 <S3: xts>            95300
 3 005935.KS  005935   삼성전자우…  2.72e13 <S3: xts>            46700
 4 068270.KS  068270   셀트리온…  2.72e13 <S3: xts>           366176
 5 005380.KS  005380   현대차  2.63e13 <S3: xts>           184000
 6 207940.KS  207940   삼성바이오…  2.62e13 <S3: xts>           584000
 7 051910.KS  051910   LG화학  2.46e13 <S3: xts>           441500
 8 005490.KS  005490   POSCO   2.23e13 <S3: xts>           395000
 9 015760.KS  015760   한국전력…  2.23e13 <S3: xts>            63000
10 035420.KS  035420   NAVER   2.16e13 <S3: xts>           192000
# … with 40 more rows, and 1 more variable: close_min_price <dbl>

3 주식 빅데이터 시각화

무명함수를 사용해서 기본적인 통계량을 각 종목별로 작업을 수행할 수 있다.

3.1 xts → 데이터프레임

plotly를 사용해서 시각화를 하려면 quantmod를 통해 다운로드 받은 xts 데이터를 데이터프레임으로 변환시킨다.

kospi50_df  <- read_rds("data/kospi50_df.rds")

options(encoding = "utf-8")
library(trelliscopejs)
library(plotly)


kospi50_df <- kospi50_df %>% 
  mutate(stock_df = map(stock_data, ~ data.frame(date=index(.x), coredata(.x))))

3.2 map_plot 시각화 객체 생성

plot_ly() 함수를 간결하게 OHLC를 시각화할 수 있도록 ohlc_plot() 사용자 정의 함수를 생성하고 이를 map_plot()을 전달한다.

ohlc_plot <- function(df) {
  plot_ly(df, x = ~date, type = "ohlc",
          open = ~open, close = ~close,
          high = ~high, low = ~low)
}

kospi50_plot_df <- kospi50_df %>% 
  mutate(panel = map_plot(stock_df, ohlc_plot))

3.3 trelliscopeJS 시각화

마지막으로 trelliscope() 함수로 시각화한다.

trelliscope(kospi50_plot_df,
            name = "ohlc", nrow = 2, ncol = 3,
            state = list(labels = c("종목명", "종목코드")),
            path="finance-trelliscope-advanced_files")