Chapter 3 API를 이용한 데이터 수집

이 CHAPTER와 다음 CHAPTER에서는 본격적으로 데이터를 수집하는 방법을 배우겠습니다. 먼저 API를 이용해 데이터를 수집하는 방법을 살펴봅니다.

API 제공자는 본인이 가진 데이터베이스를 다른 누군가가 쉽게 사용할 수 있는 형태로 가지고 있으며, 해당 데이터베이스에 접근할 수 있는 열쇠인 API 주소를 가진 사람은 이를 언제든지 사용할 수 있습니다.

API 개념

그림 3.1: API 개념

API는 API 주소만 가지고 있다면 데이터를 언제, 어디서, 누구나 쉽게 이용할 수 있다는 장점이 있습니다. 또한 대부분의 경우 사용자가 필요한 데이터만을 가지고 있으므로 접속 속도가 빠르며, 데이터를 가공하는 번거로움도 줄어듭니다. 해외에는 금융 데이터를 API의 형태로 제공하는 업체가 많으므로, 이를 잘만 활용한다면 매우 손쉽게 퀀트 투자에 필요한 데이터를 수집할 수 있습니다.

3.1 API를 이용한 Quandl 데이터 다운로드

데이터 제공업체 Quandl은 일부 데이터를 무료로 제공하며 API를 통해서 다운로드할 수 있습니다.6 이 책에서는 예제로 애플(AAPL)의 주가를 다운로드해보겠습니다. csv 형식의 API 주소는 다음과 같습니다.

https://www.quandl.com/api/v3/datasets/WIKI/AAPL/data.csv?api_key=xw3NU3xLUZ7vZgrz5QnG

위 주소를 웹 브라우저 주소 창에 직접 입력하면 csv 형식의 파일이 다운로드되며, 파일을 열어보면 애플의 주가 데이터가 있습니다.

API 주소를 이용한 데이터 다운로드

그림 3.2: API 주소를 이용한 데이터 다운로드

그러나 웹 브라우저에 해당 주소를 입력해 csv 파일을 다운로드하고 csv 파일을 다시 R에서 불러오는 작업은 무척이나 비효율적입니다. R에서 API 주소를 이용해 직접 데이터를 다운로드할 수 있습니다.

url.aapl = "https://www.quandl.com/api/v3/datasets/WIKI/AAPL/data.csv?api_key=xw3NU3xLUZ7vZgrz5QnG"
data.aapl = read.csv(url.aapl)

head(data.aapl)
##         Date  Open  High   Low Close   Volume Ex.Dividend Split.Ratio Adj..Open
## 1 2018-03-27 173.7 175.2 166.9 168.3 38962839           0           1     173.7
## 2 2018-03-26 168.1 173.1 166.4 172.8 36272617           0           1     168.1
## 3 2018-03-23 168.4 169.9 164.9 164.9 40248954           0           1     168.4
## 4 2018-03-22 170.0 172.7 168.6 168.8 41051076           0           1     170.0
## 5 2018-03-21 175.0 175.1 171.3 171.3 35247358           0           1     175.0
## 6 2018-03-20 175.2 176.8 174.9 175.2 19314039           0           1     175.2
##   Adj..High Adj..Low Adj..Close Adj..Volume
## 1     175.2    166.9      168.3    38962839
## 2     173.1    166.4      172.8    36272617
## 3     169.9    164.9      164.9    40248954
## 4     172.7    168.6      168.8    41051076
## 5     175.1    171.3      171.3    35247358
## 6     176.8    174.9      175.2    19314039

url에 해당 주소를 입력한 후 read.csv() 함수를 이용해 간단하게 csv 파일을 불러올 수 있습니다.

3.2 getSymbols() 함수를 이용한 API 다운로드

이전 예시에서 API 주소를 이용하면 매우 간단하게 데이터를 수집할 수 있음을 살펴보았습니다. 그러나 이 방법에는 단점도 있습니다. 먼저 원하는 항목에 대한 API 주소를 일일이 얻기가 힘듭니다. 또한 Quandl의 경우 무료로 얻을 수 있는 정보에 제한이 있으며, 다운로드 양에도 제한이 있습니다. 이 방법으로 한두 종목의 데이터를 수집할 수 있지만, 전 종목의 데이터를 구하기는 사실상 불가능합니다.

다행히 야후 파이낸스 역시 주가 데이터를 무료로 제공하며, quantmod 패키지의 getSymbols() 함수는 해당 API에 접속해 데이터를 다운로드합니다.

3.2.1 주가 다운로드

getSymbols() 함수의 기본적인 사용법은 매우 간단합니다. 괄호 안에 다운로드하려는 종목의 티커를 입력하면 됩니다.

library(quantmod)
getSymbols('AAPL')
## [1] "AAPL"
head(AAPL)
##            AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
## 2007-01-03     3.082     3.092    2.925      2.993  1238319600         2.570
## 2007-01-04     3.002     3.070    2.994      3.059   847260400         2.627
## 2007-01-05     3.063     3.079    3.014      3.038   834741600         2.608
## 2007-01-08     3.070     3.090    3.046      3.053   797106800         2.621
## 2007-01-09     3.087     3.321    3.041      3.306  3349298400         2.839
## 2007-01-10     3.384     3.493    3.337      3.464  2952880000         2.974

먼저 getSymbols() 함수 내에 애플의 티커인 AAPL을 입력합니다. 티커와 동일한 변수인 AAPL이 생성되며, 주가 데이터가 다운로드된 후 xts 형태로 입력됩니다.

다운로드 결과로 총 6개의 열이 생성됩니다. Open은 시가, High는 고가, Low는 저가, Close는 종가를 의미합니다. 또한 Volume은 거래량을 의미하며, Adjusted는 배당이 반영된 수정주가를 의미합니다. 이 중 가장 많이 사용되는 데이터는 Adjusted, 즉 배당이 반영된 수정주가입니다.

chart_Series(Ad(AAPL))

Ad() 함수를 통해 다운로드한 데이터에서 수정주가만을 선택한 후 chart_Series() 함수를 이용해 시계열 그래프를 그릴 수도 있습니다. 시계열 기간을 입력하지 않으면 2007년 1월부터 현재까지의 데이터가 다운로드되며, 입력 변수를 추가해서 원하는 기간의 데이터를 다운로드할 수도 있습니다.

data = getSymbols('AAPL',
                  from = '2000-01-01', to = '2018-12-31',
                  auto.assign = FALSE)
head(data)
##            AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
## 2000-01-03    0.9364    1.0045   0.9079     0.9994   535796800        0.8581
## 2000-01-04    0.9665    0.9877   0.9035     0.9152   512377600        0.7858
## 2000-01-05    0.9263    0.9872   0.9196     0.9286   778321600        0.7973
## 2000-01-06    0.9475    0.9554   0.8482     0.8482   767972800        0.7283
## 2000-01-07    0.8616    0.9018   0.8527     0.8884   460734400        0.7628
## 2000-01-10    0.9107    0.9129   0.8460     0.8728   505064000        0.7494

from에는 시작시점을 입력하고 to에는 종료시점을 입력하면 해당 기간의 데이터가 다운로드됩니다.

getSymbols() 함수를 통해 다운로드한 데이터는 자동으로 티커와 동일한 변수명에 저장됩니다. 만일 티커명이 아닌 원하는 변수명에 데이터를 저장하려면 auto.assign 인자를 FALSE로 설정해주면 다운로드한 데이터가 원하는 변수에 저장됩니다.

ticker = c('FB', 'NVDA') 
getSymbols(ticker)
## [1] "FB"   "NVDA"
head(FB)
##            FB.Open FB.High FB.Low FB.Close FB.Volume FB.Adjusted
## 2012-05-18   42.05   45.00  38.00    38.23 573576400       38.23
## 2012-05-21   36.53   36.66  33.00    34.03 168192700       34.03
## 2012-05-22   32.61   33.59  30.94    31.00 101786600       31.00
## 2012-05-23   31.37   32.50  31.36    32.00  73600000       32.00
## 2012-05-24   32.95   33.21  31.77    33.03  50237200       33.03
## 2012-05-25   32.90   32.95  31.11    31.91  37149800       31.91
head(NVDA)
##            NVDA.Open NVDA.High NVDA.Low NVDA.Close NVDA.Volume NVDA.Adjusted
## 2007-01-03     6.178     6.253    5.798      6.013   115482000         5.525
## 2007-01-04     5.992     6.013    5.838      5.985    79729800         5.499
## 2007-01-05     5.843     5.867    5.570      5.610   124334400         5.154
## 2007-01-08     5.630     5.760    5.533      5.652    65727000         5.192
## 2007-01-09     5.660     5.698    5.535      5.542    76416600         5.091
## 2007-01-10     5.483     5.867    5.400      5.815   110874600         5.342

한 번에 여러 종목의 주가를 다운로드할 수도 있습니다. 위 예제와 같이 페이스북과 엔비디아의 티커인 FB와 NVDA를 ticker 변수에 입력하고 getSymbols() 함수에 티커를 입력한 변수를 넣으면 두 종목의 주가가 순차적으로 다운로드됩니다.

3.2.2 국내 종목 주가 다운로드

getSymbols() 함수를 이용하면 미국뿐 아니라 국내 종목의 주가도 다운로드할 수 있습니다. 국내 종목의 티커는 총 6자리로 구성되어 있으며, 해당 함수에 입력되는 티커는 코스피 상장 종목의 경우 티커.KS, 코스닥 상장 종목의 경우 티커.KQ의 형태로 입력해야 합니다.

다음은 코스피 상장 종목인 삼성전자 데이터의 다운로드 예시입니다.

getSymbols('005930.KS',
           from = '2000-01-01', to = '2018-12-31')
## [1] "005930.KS"
tail(Ad(`005930.KS`))
##            005930.KS.Adjusted
## 2018-12-20              35073
## 2018-12-21              35073
## 2018-12-24              35209
## 2018-12-26              34801
## 2018-12-27              35033
## 2018-12-28              35445

삼성전자의 티커인 005930에 .KS를 붙여 getSymbols() 함수에 입력하면 티커명에 해당하는 005930.KS 변수명에 데이터가 저장됩니다. 변수명에 마침표(.)가 있으므로 Ad() 함수를 통해 수정주가를 확인하려면 변수명 앞뒤에 억음 부호(`)를 붙여야 합니다.

국내 종목은 종종 수정주가에 오류가 발생하는 경우가 많아서 배당이 반영된 값보다는 단순 종가(Close) 데이터를 사용하기를 권장합니다.

tail(Cl(`005930.KS`))
##            005930.KS.Close
## 2018-12-20           38650
## 2018-12-21           38650
## 2018-12-24           38800
## 2018-12-26           38350
## 2018-12-27           38250
## 2018-12-28           38700

Cl() 함수는 Close, 즉 종가만을 선택하며, 사용 방법은 Ad() 함수와 동일합니다. 비록 배당을 고려할 수는 없지만, 전반적으로 오류가 없는 데이터를 사용할 수 있습니다.

다음은 코스닥 상장종목인 셀트리온제약의 예시이며, 티커인 068670에 .KQ를 붙여 함수에 입력합니다. 역시나 데이터가 다운로드되어 티커명의 변수에 저장됩니다.

getSymbols("068760.KQ",
           from = '2000-01-01', to = '2018-12-31')
## [1] "068760.KQ"
tail(Cl(`068760.KQ`))
##            068760.KQ.Close
## 2018-12-20              NA
## 2018-12-21              NA
## 2018-12-24              NA
## 2018-12-26              NA
## 2018-12-27              NA
## 2018-12-28              NA

3.2.3 FRED 데이터 다운로드

미국 연방준비은행에서 관리하는 Federal Reserve Economic Data(FRED)는 미국 및 각국의 중요 경제지표 데이터를 살펴볼 때 가장 많이 참조되는 곳 중 하나입니다. getSymbols() 함수를 통해 FRED 데이터를 다운로드할 수 있습니다. 먼저 미 국채 10년물 금리를 다운로드하는 예제를 살펴보겠습니다.

getSymbols('DGS10', src='FRED')
## [1] "DGS10"
chart_Series(DGS10)

미 국채 10년물 금리에 해당하는 티커인 DGS10을 입력해주며, 데이터 출처에 해당하는 src에 FRED를 입력해줍니다. FRED에서 제공하는 API를 이용해 데이터가 다운로드되며, chart_Series() 함수를 통해 금리 추이를 살펴볼 수 있습니다.

각 항목별 티커를 찾는 방법은 매우 간단합니다. 먼저 FRED의 웹사이트7원 하는 데이터를 검색합니다. 만일 원/달러 환율에 해당하는 티커를 찾고자 한다면 그림 3.3와 같이 이에 해당하는 South Korea / U.S. Foreign Exchange Rate를 검색해 원하는 페이지에 접속합니다. 이 중 페이지 주소에서 /series/ 다음에 위치하는 DEXKOUS가 해당 항목의 티커입니다.

FRED 사이트 내 원/달러 환율의 티커 확인

그림 3.3: FRED 사이트 내 원/달러 환율의 티커 확인

getSymbols('DEXKOUS', src='FRED')
## [1] "DEXKOUS"
tail(DEXKOUS)
##            DEXKOUS
## 2021-10-22    1177
## 2021-10-25    1168
## 2021-10-26    1168
## 2021-10-27    1171
## 2021-10-28    1167
## 2021-10-29    1175

해당 티커를 입력하면, FRED 웹사이트와 동일한 데이터가 다운로드됩니다. 이 외에도 509,000여 개의 방대한 FRED 데이터를 해당 함수를 통해 손쉽게 R에서 다운로드할 수 있습니다.


  1. 자세한 내용은 https://docs.quandl.com/ 에서 확인할 수 있습니다.↩︎

  2. https://fred.stlouisfed.org/↩︎