4 min read

[R을 이용한 퀀트 투자 포트폴리오 만들기] 공부-2


출처(책): R을 이용한 퀀트 투자 포트폴리오 만들기
출처(Web): R을 이용한 퀀트 투자 포트폴리오 만들기
Fast campus강의: R을 활용한 퀀트 전략 구현 올인원 패키지 Online.

[R을 이용한 퀀트 투자 포트폴리오]를 따라 해보는 두번째 리뷰. 지난번에 첫번째 리뷰를 하고나서 몇가지가 변하게 되었다. 개정판이 나온것. 기존의 파란색에서 초록색으로 바뀌었으며, 내용이 조금 더 추가가 되었으니 이제는 개정판에 맞추어서 하나씩 따라 써보려 한다. 이번에 작성해보려 하는것은 네이버금융에서 회사들의 시가총액을 가져와 데이터로 구성 하는 부분이다. 책에서는 CHAPTER 4장의 크롤링 이해하기 파트이다. 크롤링에 대한 자세한 설명은 위의 CHAPTER 4장을 참고 하면 된다.

코스피 시가총액

우선 네이버금융에서 코스피의 시가총액을 가져와 보자. 네이버금융-시가총액 이곳에 있는 시가총액을 가져오려고 한다.

library(tidyverse)
library(rvest)
library(glue)

df_info <- c()
for(x in 1:5) {
  
  # url생성
  # glue()함수와 page에 숫자를 붙혀 반복적으로 url을 변경할 예정
  url <- glue("https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page={x}")
  
  # 생성된 url에 read_html()함수와, html_table()함수를 통해 Table데이터 수집
  df <- url %>% 
    read_html(encoding = "EUC-KR") %>% 
    html_table(fill = TRUE)
  
  # 이중에 시가총액에 해당하는 데이터는 두번째 리스트에 있는 데이터이기 때문에 df[[2]]를 선택
  df <- df[[2]] %>% 
    as_tibble() 
  
  df_info <- rbind(df_info, df)
}

# 이렇게 생성된 데이터는 df_info라고 정함 
# N컬럼(기업순위)가 비어있는 데이터는 제거 
# 토론실 컬럼도 제거
df_info <- df_info %>% 
  filter(!is.na(df_info$N)) %>% 
  select(-토론실)

df_info 
## # A tibble: 250 x 12
##        N 종목명 현재가 전일비 등락률 액면가 시가총액 상장주식수 외국인비율
##    <int> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>    <chr>           <dbl>
##  1     1 삼성전자… 82,800 1,000  +1.22% 100    4,942,9… 5,969,783        54.7
##  2     2 SK하이닉… 140,5… 4,000  +2.93% 5,000  1,022,8… 728,002          50.0
##  3     3 NAVER  385,5… 2,500  +0.65% 100    633,235  164,263          57.2
##  4     4 LG화학 891,0… 75,000 -7.76% 5,000  628,978  70,592           45.5
##  5     5 삼성전자우… 73,800 700    +0.96% 100    607,290  822,887          78.3
##  6     6 현대차 234,0… 2,000  +0.86% 5,000  499,984  213,668          30.8
##  7     7 삼성바이오… 733,0… 2,000  -0.27% 2,500  484,989  66,165           10.3
##  8     8 삼성SDI… 680,0… 6,000  -0.87% 5,000  467,599  68,765           43.5
##  9     9 카카오 479,0… 0      0.00%  500    424,895  88,705           33.2
## 10    10 셀트리온… 296,5… 7,500  +2.60% 1,000  400,357  135,028          20.9
## # … with 240 more rows, and 3 more variables: 거래량 <chr>, PER <chr>,
## #   ROE <chr>

코스피 종목 코드

이번에는 코스피의 종복코드를 가져와 보자. 영어로는 ticker라고 한다.

ticker_df <- c()
for(i in 1:5) {
  
  # url생성
  # glue()함수와 page에 숫자를 붙혀 반복적으로 url을 변경할 예정
  url <- glue("https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page={i}")
  
  # 생성된 url에서 read_html(), html_nodes()를 사용해 종목코드(ticker)와 종목명 구성
  ticker_set <- url %>% 
    read_html(encoding = "EUC-KR") %>% 
    html_nodes(".type_2") %>% 
    html_nodes("a") 
  
  # ticker_name라고 종목명 데이터 선택
  ticker_name <- ticker_set %>% 
    html_text()
  
  # ticker_code라고 종목 코드 구성
  ticker_code <- ticker_set %>% 
    html_attr("href") %>% 
    str_remove_all("\\D")
  
  # 생성된 종목명과, 종목코드는 data.frame로 구성
  ticker_df_1 <- data.frame(
    "종목명" = ticker_name,
    "종목코드" = ticker_code
  ) 
  
  ticker_df <- rbind(ticker_df, ticker_df_1)
}

ticker_df <- ticker_df %>% 
  as_tibble() 

ticker_df$종목코드 <- ticker_df$종목코드 %>% as.character()
ticker_df$종목명 <- ticker_df$종목명 %>% as.character()

ticker_df <- ticker_df %>% 
  filter(nchar(종목명) != 0)

ticker_df
## # A tibble: 250 x 2
##    종목명           종목코드
##    <chr>            <chr>   
##  1 삼성전자         005930  
##  2 SK하이닉스       000660  
##  3 NAVER            035420  
##  4 LG화학           051910  
##  5 삼성전자우       005935  
##  6 현대차           005380  
##  7 삼성바이오로직스 207940  
##  8 삼성SDI          006400  
##  9 카카오           035720  
## 10 셀트리온         068270  
## # … with 240 more rows

시가총액과, 종목코드 join

이렇개 생성된 시가총액 데이터와, 종목코드 데이터를 join시켜주자 left_join()함수를 사용했으며 이때 사용한 키값은 종목명으로 해두었다.

df_ticker_info <- df_info %>% 
  left_join(ticker_df) 
df_ticker_info
## # A tibble: 250 x 13
##        N 종목명 현재가 전일비 등락률 액면가 시가총액 상장주식수 외국인비율
##  * <int> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>    <chr>           <dbl>
##  1     1 삼성전자… 82,800 1,000  +1.22% 100    4,942,9… 5,969,783        54.7
##  2     2 SK하이닉… 140,5… 4,000  +2.93% 5,000  1,022,8… 728,002          50.0
##  3     3 NAVER  385,5… 2,500  +0.65% 100    633,235  164,263          57.2
##  4     4 LG화학 891,0… 75,000 -7.76% 5,000  628,978  70,592           45.5
##  5     5 삼성전자우… 73,800 700    +0.96% 100    607,290  822,887          78.3
##  6     6 현대차 234,0… 2,000  +0.86% 5,000  499,984  213,668          30.8
##  7     7 삼성바이오… 733,0… 2,000  -0.27% 2,500  484,989  66,165           10.3
##  8     8 삼성SDI… 680,0… 6,000  -0.87% 5,000  467,599  68,765           43.5
##  9     9 카카오 479,0… 0      0.00%  500    424,895  88,705           33.2
## 10    10 셀트리온… 296,5… 7,500  +2.60% 1,000  400,357  135,028          20.9
## # … with 240 more rows, and 4 more variables: 거래량 <chr>, PER <chr>,
## #   ROE <chr>, 종목코드 <chr>

코스닥

코스닥 역시 코스피와 동일한 방법으로 진행 하면 된다. url의 번호만 달라지는데 코스피의 경우 sosok=0이고, 코스닥의 경우 sosok=1로 진행해주면 된다.

총평

이렇게 [R을 이용한 퀀트 투자 포트폴리오 만들기]의 두번째 리뷰를 진행하게 되었다. 지난 블로그 이후 한달도 좀 더 지나서 쓴 만큼 속도를 더 내어야 마무리를 지을수 있을거 같은데, 아마 3월 안에는 전부 정리해서 올려보도록 해야 겠다.