R 함수로 코스닥 데이터 가져오기

R은 통계 관련 대표적인 오프 소스 도구이지만 머신러닝에서도 최근 많이 사용된다. 머신러닝이라고 하면 데이터를 다루는 기법(또는 분야 학문)다. 필자가 관심있어 하는 주식도 마찬가지로 데이터로 구성된 분야이기에 머신러닝 적용이 가능하다. 예로 예측하는 것도 주식의 과거 데이터를 이용해서 예측할 수 있겠다.

그러므로 R를 이용해서 어쩌면 주식 관련 처리를 하고 싶은 분들도 있을 것이다. 기본적인 통계뿐 아니라 머신러닝에도 적합한 도구이기 때문이다. 사실은 필자도 그 중 한명이기에 R를  활용하여 주식 관련 데이터를 처리하고 싶어 이것저것 찾아보았다. 역시나 R에서 주식 관련 패키지들이 존재한다.

quantmod, tseries 그리고 fImport와 같은 것들이 있다. 하지만 아쉽게도 국내 KOSDAQ 데이터를 가져올 수 있는 패키지는 없었다.

그렇지만 우연히 국내 사이트(http://blog.naver.com/lisist/220417131329)에서 R을 활용하여 코스닥 (KOSDAQ) 데이터를 가져오는 법을 확인할 수 있었다. 그나마 다행이었다. 다양한 패키지에 속해있는 함수들은 사용할 수 없겠지만 그래도 데이터를 가져올 수 있었다. 그 버전을 보완해서 약간의 locale 문제도 반영한 R 함수를 github에 올려놓았다. 참고하시길 바란다

https://github.com/lifegear/get-Korean-stocks-by-R

R 소스를 다운로드받고 우선  XML 패키지를 설치해야 한다. (필자의 경우 R Studio 활용)

> install.packages("xml")

그리고 나서 XML 패키지를 불러온다

> library(xml)

그런 다음 g.hist2 라는 함수를 아래와 같이 호출한다.

> output <- g.hist2("KOSDAQ:035720", "2017-01-01", "2017-05-01")
> output
 Date Open High Low Close Volume
1 2017-04-28 14050 14050 13600 13650 129595
2 2017-04-27 14000 14150 13900 13900 66842
3 2017-04-26 14000 14250 13750 14000 115246
4 2017-04-25 13900 14150 13850 13900 98483
5 2017-04-24 14250 14300 13850 13900 118903
6 2017-04-21 14350 14500 14000 14250 136055
7 2017-04-20 14650 14850 14150 14250 250277
8 2017-04-19 13600 15700 13600 14700 1282552
9 2017-04-18 13600 13600 13300 13550 151580
10 2017-04-17 13800 13850 13450 13500 175651
11 2017-04-14 14200 14200 13600 13750 155652
...

아래는 output 데이터를 활용해서 출력한 주식 차트 그래프이다

> plot(output$Date, output$Close, type="l")
chart

아래는 R 함수 소스이다 (github url 바로가기)

library(XML)

g.hist2 <- function(ticker, start_date, end_date){

 #ticker set & modify
 ticker_m <- gsub(":","%3A",ticker)

 #set locale
 lct<-Sys.getlocale("LC_TIME")
 Sys.setlocale("LC_TIME", "C")

 #set date
 start_date = as.Date(start_date)
 end_date = as.Date(end_date)

 #format date for calling google finance url
 fmtstr <- "%b+%d%%2C+%Y" #ex) Jan+01,+2017
 start_date_fmt <- as.character(format(start_date, fmtstr))
 end_date_fmt <- as.character(format(end_date, fmtstr))

 #set URL
 url = 'http://www.google.com/finance/historical?q='
 url = paste(url,ticker_m,'&startdate=',start_date_fmt,'&enddate=',end_date_fmt,'&num=200',sep='')

 #downloading data from the Google Finance
 output <- as.data.frame(readHTMLTable(url,stringsAsFactors=FALSE)[4])

 output[, 1] <- as.Date(output[, 1], format="%b %d, %Y")
 names(output) <- c("Date", "Open","High","Low","Close","Volume")

 for (k in 2:6){
 output[, k] <- as.numeric(gsub(",", "", output[, k]))
 }

 #### Checking whether all data are retrieved or not ####
 end <- as.Date(output[length(output[, 1]), 1])
 ll <- 200 - length(output[, 1])
 if ((end-ll)<start_date) end <- start_date
 if (end > start_date) {
 output <- rbind(output, g.hist2(ticker,start_date,as.character(end-1)))
 }

 return(output)
}

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중