-
[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) }
반응형'Project > 연구' 카테고리의 다른 글
[연구일지 #1] 위대한 기업은 무엇일까 (0) 2023.07.30 [R/Python] 일별 주가 데이터 크롤링, 수집한 데이터 나눠서 연산하기 (0) 2020.10.02 [퀀트: 리밸런싱] 리밸런싱의 수익성 구조 ② (0) 2020.09.04 [퀀트: 리밸런싱] 리밸런싱의 수익성 구조 ① (0) 2020.07.29