[R lang 크롤링] (R) R에서 주가정보 가져오기 / quantmod 패키지(1)

(R) R에서 주가정보 가져오기 / quantmod 패키지(1)

 
프로필

2018. 8. 24. 12:58

오늘 포스팅할 내용은 R에서 quantmod패키지를 이용해 주가정보를 불러오는 것입니다.
이 방법을 사용하면 원하는 주식의 주가정보를 쉽게 얻을 수 있어서 유용합니다.

1. 주가정보 불러오기

먼저 R을 실행시키고 xts 패키지와 quantmod 패키지를 설치하고 실행합니다.
xts 패키지는 time series 즉 시계열 데이터 처리를 위해 사용하는 패키지이며, qunatmod는 주식관련 패키지입니다.

https://cran.r-project.org/web/packages/quantmod/quantmod.pdf
quantmod패키지에 대한 자세한 정보는 위 경로에서 확인할 수 있습니다.

먼저 예시로 삼성전자 주가정보를 가져와보겠습니다. getSymbols()함수를 사용하는데 변수를 입력할 때 해당 "종목코드.상장 증권 시장"으로 입력해야합니다. 
삼성전자의 종목 코드는 주식에 관심있는 사람이면 웬만큼 외우고 다닐 정도로 유명한 005930이고, 코스피에 상장되어 있으므로 코스피의 인식명인 KS를 종목 코드에 붙여서 입력합니다.
auto.assign은 자동으로 값을 배열해준다는 의미인거 같은데 필요 없으므로 FALSE로 입력합니다.
이제 주가정보를 받아왔으면 받아온 데이터의 열이름을 다음과 같이 open, high, low, close, volume, adjusted로 바꿔줍니다. 이 작업을 하는 이유는 단지 알아보기 쉽게 하는 것입니다. (시가, 고가, 저가, 종가, 거래량, 수정가를 의미함)

samsung을 출력했더니 2007년부터 현재까지의 시가, 고가, 저가, 종가, 거래량, 수정주가가 정리되어 있는 것을 볼 수 있습니다.

여기서 head()함수와 tail()함수를 사용하면 가장 첫 값과 끝 값을 불러올 수 있습니다. quantmod의 데이터들은 시작값들이 2007년 1월로 되어있는데 왜 2007년부터만 데이터가 받아지는지는 모르겠습니다. 그래서 2007년 이전의 데이터를 불러오려면 따로 발품을 팔아서 찾으셔야합니다. 그런데 만약 내가 원하는 데이터는 2007년부터가 아니라 2018년부터 알고 싶다라면 어떻게 해야할까요?

그럴때는 getSymbols()함수를 사용할 때 from과 to를 설정해주시면, 2018년부터 원하는 날짜까지값만 가져오게 됩니다.
이제 편의를 위해 2017년 데이터만 사용하도록 하겠습니다.
nrow()함수를 사용하면 데이터가 몇 개의 행을 가지고 있는지 나타냅니다. 241이 출력되었으므로 총 241일의 데이터를 가지고 있음을 알 수 있습니다. 이는 2017년의 유가증권 시장에서 휴일을 제외한 총 거래일이 241일이었음을 나타냅니다.

2. 자료 전처리하기

다음은 가져온 데이터를 전처리하는 방법입니다. 저장된 변수를 입력하고 $를 입력한 뒤 Tab키를 누르시면 해당 변수 내의 하위 값들이 나옵니다. 아까 불러온 데이터의 열 값인 시가, 고가, 저가, 종가, 거래량, 수정주가입니다.
samsung$close를 입력하면 samsung변수에서 종가만 불러올 수 있습니다.

 주가데이터를 다루다보면 가끔 volume 즉 거래량이 0인 경우가 존재합니다. quantmod 패키지에서는 Vo()함수를 제공하는데 이것을 사용하면 시가, 고가, 저가, 종가, 거래량, 수정율을 모두 출력해주는 변수에서 거래량만 출력할 수 있습니다. 이를 활용해 samsung[Vo(samsung)>1]를 입력하면 samsung변수에서 Vo()가 1보다 큰 경우만 가져올 수 있습니다.
Cl()함수를 사용하면 해당 변수에서 종가만 출력할 수 있습니다. ROC()함수는 변화율을 출력해주는 함수입니다. 이 두 개의 함수를 혼합해서 사용하면 일별 종가의 변화율을 계산하여 일일 수익률을 계산할 수 있습니다.
방금 위에서 알려드린 $를 이용하여 samsung에 rtn이라는 새로운 하위 항목을 만들어 저장하겠습니다. rtn에는 종가의 변화율 즉 일일 수익률을 입력합니다.

samsung$rtn을 불러오니 수익률이 저장되어 있습니다. 1월 2일의 값이 NA값인 이유는 1월 2일의 전날 데이터가 없기 때문에 변화율을 측정하지 못해서 그렇습니다.

head()함수에 samsung$close, 3을 입력하면 삼성전자 종가의 상위 3개 데이터를 출력합니다.
tail()함수에 samsung$close,1을 입력하면 삼성전자 종가의 하위 1개 데이터를 출력합니다.
인덱싱을 사용할 수도 있습니다. samsung$close['2017-03-21']을 입력하면 2017년 03월21의 종가만이 출력됩니다.
만약 데이터에 NA값 즉 결측치가 있다면, na.omit()함수를 사용하면 제거할 수 있습니다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

mean()함수를 사용하면 데이터의 평균 값을 알 수 있습니다. samsung$rtn에 mean()함수를 사용하면 일일 수익률의 평균 값을 알 수 있겠죠? 계산해보았더니 0.001442461이 나왔고 %로 환산하면 약 0.14%가 기간간 평균 일일 수익률이라고 생각하시면 됩니다.

drift라는 변수에 일일평균수익률에 2017년 총 거래일을 곱하면 2017년 연 평균 수익률이 도출됩니다. 241을 곱한 이유는 앞에서 nrow()함수로 확인해 본 결과 241일이 총 거래일이었기 때문입니다. 여기에 %로 환산하기 위해 100을 곱하면 연 평균 수익률이 약 34.8%로 계산됩니다.
이번에는 volatility 변수에 2017년 수익률의 변동성을 저장하겠습니다. 변동성은 통계에서 사용하는 분산과 표준편차로 정의할 수 있고 이를 사용하여 주식의 변동성을 계산할 수 있습니다.

위의 식을 사용해 sd()함수에 일 수의 루트값을 곱한 뒤에 100을 더 곱해주면 수익률의 연 평균 변동성을 구할 수 있습니다.
약 23.7%로 계산되었네요.

3. 그래프로 출력하기

R에서 그래프로 출력하기 위해서 plot()함수를 많이 사용합니다. 2017년 삼성전자의 종가를 출력하려면 위와 같은 식을 입력합니다. type = "l"은 line으로 출력한다는 의미입니다. col은 line의 색깔을 의미하며, main은 그래프의 제목, cex.main은 제목 글자의 크기를 말합니다.
그래프가 출력되면 mtext()함수를 사용해 소제목을 달아줍니다.
abline()함수는 그래프에 디테일을 주기위해 수직선 또는 수평선을 그려줍니다. h = x로 입력하면 x라는 변수의 값을 수평선으로 출력해주며, h 대신에 v = x로 입력하면 x라는 변수값을 수직선으로 출력합니다.

출력된 결과입니다.

일일 종가의 변동성을 출력한 결과입니다. 

일일 수익률의 분포를 나타낸 모습입니다. abline()함수에서 v=0을 입력해 x좌표가 0인 지점에서 수직선을 출력하여 나타냈습니다.

인덱싱을 사용하면 내가 원하는 기간의 데이터만 볼 수도 있습니다. 인덱싱을 할때 [ ] 기호를 사용하는데, 특정 날짜부터 자료의 끝까지 출력하고 싶으면 ['2017-09-15::']와 같이 끝 날짜를 입력하지 않으면 됩니다.
특정 날짜부터 또 다른 특정 날짜까지 출력하고 싶으면 ['2017-09-15::2017-10-15']로 끝 날짜를 채워주면 됩니다.
이번에는 일일 거래량을 출력해보았습니다. 그래프로 출력하면 언제 거래량이 많았는지 한 눈에 파악할 수 있습니다.

마지막으로 전체 코드입니다.

읽어주셔서 감사합니다.

[출처] https://m.blog.naver.com/jk940/221345104532

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED