}

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [R/Python] 주식 종목 코드 모으기
    Project/연구 2020. 10. 16. 20:26
    반응형

    요즘 주식 자동매매의 기능 중 하나로 주식종목을 최신화하고 있다.

    매일 거래되는 데이터를 분석해서 새롭게 모델링을 하는 게 목적이다보니 매일 종목을 최신화하고 있다.

    전체 과정은 ①주식 종목코드 최신화 → ②종목별 주가 데이터 수집 → ③모델링의 과정을 거쳐서 진행하는데, 오늘은 그 첫단계인 주식 종목코드 최신화를 하는 R 스크립트다.

    기본적인 구조는 NAVER 금융에서 제공하는 데이터를 크롤링해서 data.table로 정리한다. 정리된 데이터는 종목코드/종목명/시장구분으로 나뉘고 시장구분은 코스피 또는 코스닥을 말한다. 이전에 참고했던 페이지에서는 종목코드에 알파벳이 들어간 경우는 모두 누락되었는데 이 크롤러는 종목코드에 알파벳이 포함되어 있어도 모두 가져온다는 장점이 있다.

    특히 코드 작업을 하면서 현재 작동이 잘 되고 있는지 늘 확인이 필요하다보니... 시작할 때 메세지를 주고, 끝날 때에도 메세지를 주는 함수이다.

    해당 함수는 별다른 인자가 들어가지 않기 때문에 실행하면 바로 작동하고 콘솔창에 Updating tickers..라고 뜨고 완료되면 Updating tickers...[DONE]이라는 메세지가 출력된다. 작업을 빠르게 하기 위해 foreach함수를 쓴 병렬 컴퓨팅을 해서, 현재 나의 컴퓨터 기준으로 몇초면 완료된다. 코드는 아래와 같다.

    crawling_ticker <- function(){
      cat("\r Updating tickers...... ")
      packages <- c("rvest", "httr", "parallel", "foreach","doParallel", "data.table", "readxl", "dplyr",
                    "foreach")
      pacman::p_load("BiocManager","rvest", "httr", "parallel", "foreach","doParallel", "data.table","dplyr",
                     "doSNOW")
      numCores    <- detectCores() - 1
      cl          <- makeCluster(numCores)
      registerDoParallel(cl)
      registerDoSNOW(cl)
    
      for (j in 0:1){
            page <- 1
            url <- paste0("https://finance.naver.com/sise/sise_market_sum.nhn?sosok=", j, "&page=", page)
            tick_url <- GET(url)
            final_page <- read_html(tick_url, encoding = "EUC-KR") %>%
                  html_nodes(., "table") %>%
                  html_nodes(., "a") %>%
                  html_attr(., "href") %>%
                  tail(., 1) %>%
                  strsplit("=") %>%
                  unlist() %>%
                  tail(., 1) %>%
                  as.numeric()
    
            df <- foreach (page = 1:final_page, .packages = packages) %dopar%
                  {
                        url <- paste0("https://finance.naver.com/sise/sise_market_sum.nhn?sosok=",
                                      j, "&page=", page)
                        tick_url <- GET(url)
                        name <- read_html(tick_url, encoding = "EUC-KR") %>%
                              html_nodes(., ".type_2") %>%
                              html_nodes(., "a") %>%
                              html_text()
    
                        name <- name[nchar(name) > 0]
    
                        df <- read_html(tick_url, encoding = "EUC-KR") %>%
                              html_nodes(., ".type_2") %>%
                              html_nodes(., "a") %>%
                              html_attr(., "href") %>%
                              strsplit("=") %>%
                              unlist()
                        code <- df[nchar(df) == 6] %>% unique()
    
                        result <- data.frame(name, code, j)
    
                        return(result)
    
                  }
            if (j == 0){
    
                  ticker0 <- df
    
            }else if(j == 1){
    
                  ticker1 <- df
            }
      }
    
      ticker0 <- rbindlist(ticker0)
      ticker1 <- rbindlist(ticker1)
      df      <- rbind(ticker0, ticker1)
    
      names(df) <- c("name","code", "MKT")
      df$code   <- as.character(df$code)
      df$MKT    <- ifelse(df$MKT == "0", "KOSPI", "KOSDAQ")
    
      stopCluster(cl)
    
    
      cat("\r Updating tickers......[DONE]                                   \n")
      return(df)
      }
    반응형

    댓글

Designed by Tistory.