본문 바로가기

Data Scraping/#Quant Portfolio

[퀀트] R을 활용한 퀀트 투자 포트폴리오 만들기 (3)

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

API는 주소를 갖고 있는 사람이라면 누구나 이용할 수 있고 접근 속도가 빠르며 데이터 가공이 수월하다는 장점이 있음

대부분의 해외 금융 기업은 데이터를 API로 제공하기 때문에 퀀트 투자에 API의 이해는 필수!

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

Quandl은 API로 데이터를 무료로 제공하는 업체

R에서 바로 애플의 주가 데이터 다운로드하는 것이 효율적

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

head(data.appl)

        Date   Open   High    Low
1 2018-03-27 173.68 175.15 166.92
2 2018-03-26 168.07 173.10 166.44
3 2018-03-23 168.39 169.92 164.94
4 2018-03-22 170.00 172.68 168.60
5 2018-03-21 175.04 175.09 171.26
6 2018-03-20 175.24 176.80 174.94
    Close   Volume Ex.Dividend
1 168.340 38962839           0
2 172.770 36272617           0
3 164.940 40248954           0
4 168.845 41051076           0
5 171.270 35247358           0
6 175.240 19314039           0
  Split.Ratio Adj..Open Adj..High
1           1    173.68    175.15
2           1    168.07    173.10
3           1    168.39    169.92
4           1    170.00    172.68
5           1    175.04    175.09
6           1    175.24    176.80
  Adj..Low Adj..Close Adj..Volume
1   166.92    168.340    38962839
2   166.44    172.770    36272617
3   164.94    164.940    40248954
4   168.60    168.845    41051076
5   171.26    171.270    35247358
6   174.94    175.240    19314039

 

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

API 주소를 이용한 데이터 수집은 간편하지만 모든 항목에 대한 개별적 API를 일일이 얻기 힘들며 가용한 다운로드 양에 제한이 있다는 한계

야후 파이낸스 주가 데이터를 quantmod 패키지의 getSymbols() 함수로 다운로드 가능

3.2.1 주가 다운로드

require(quantmod)
getSymbols('AAPL')

head(AAPL)

           AAPL.Open AAPL.High
2007-01-03  12.32714  12.36857
2007-01-04  12.00714  12.27857
2007-01-05  12.25286  12.31428
2007-01-08  12.28000  12.36143
2007-01-09  12.35000  13.28286
2007-01-10  13.53571  13.97143
           AAPL.Low AAPL.Close
2007-01-03 11.70000   11.97143
2007-01-04 11.97429   12.23714
2007-01-05 12.05714   12.15000
2007-01-08 12.18286   12.21000
2007-01-09 12.16429   13.22429
2007-01-10 13.35000   13.85714
           AAPL.Volume AAPL.Adjusted
2007-01-03   309579900      10.34498
2007-01-04   211815100      10.57460
2007-01-05   208685400      10.49929
2007-01-08   199276700      10.55114
2007-01-09   837324600      11.42763
2007-01-10   738220000      11.97450

 

함수 내에 티커를 입력하면 해당 티커의 주가 데이터가 xts 형태로 입력됨시가, 고가, 저가, 종가, 거래량, 수정주가가 표시 (Adjusted 데이터가 가장 많이 사용됨)

 

이후 chart_Series() 함수로 시계열 데이터 시각화 가능

원하는 기간을 입력변수로 입력해서 선택적으로 시각화할 수도 있음

 

 

 

 

 

 

 

 

data = getSymbols('AAPL", from = '2000-01-01', to = '2018-12-31', auto.assign = FALSE)

head(data)

           AAPL.Open AAPL.High
2000-01-03  3.745536  4.017857
2000-01-04  3.866071  3.950893
2000-01-05  3.705357  3.948661
2000-01-06  3.790179  3.821429
2000-01-07  3.446429  3.607143
2000-01-10  3.642857  3.651786
           AAPL.Low AAPL.Close
2000-01-03 3.631696   3.997768
2000-01-04 3.613839   3.660714
2000-01-05 3.678571   3.714286
2000-01-06 3.392857   3.392857
2000-01-07 3.410714   3.553571
2000-01-10 3.383929   3.491071
           AAPL.Volume AAPL.Adjusted
2000-01-03   133949200      3.454628
2000-01-04   128094400      3.163368
2000-01-05   194580400      3.209661
2000-01-06   191993200      2.931901
2000-01-07   115183600      3.070781
2000-01-10   126266000      3.016772

▶ 아래 코드처럼 from 에 시작점을, to에 종료 시점을 입력변수로 넣어 원하는 기간의 데이터만 다운로드 

 auto.assign을 FALSE로 설정해두면 데이터를 자동으로 동일한 티커를 찾아 저장하도록하지 않고 원하는 변수명에 저장 가능

ticker = c('FB', 'NVDA')
getSymbols(ticker)

head(FB)

           FB.Open FB.High FB.Low
2012-05-18   42.05   45.00  38.00
2012-05-21   36.53   36.66  33.00
2012-05-22   32.61   33.59  30.94
2012-05-23   31.37   32.50  31.36
2012-05-24   32.95   33.21  31.77
2012-05-25   32.90   32.95  31.11
           FB.Close FB.Volume
2012-05-18    38.23 573576400
2012-05-21    34.03 168192700
2012-05-22    31.00 101786600
2012-05-23    32.00  73600000
2012-05-24    33.03  50237200
2012-05-25    31.91  37149800
           FB.Adjusted
2012-05-18       38.23
2012-05-21       34.03
2012-05-22       31.00
2012-05-23       32.00
2012-05-24       33.03
2012-05-25       31.91

head(NVDA)

           NVDA.Open NVDA.High
2007-01-03  24.71333  25.01333
2007-01-04  23.96667  24.05333
2007-01-05  23.37333  23.46667
2007-01-08  22.52000  23.04000
2007-01-09  22.64000  22.79333
2007-01-10  21.93333  23.46667
           NVDA.Low NVDA.Close
2007-01-03 23.19333   24.05333
2007-01-04 23.35333   23.94000
2007-01-05 22.28000   22.44000
2007-01-08 22.13333   22.60667
2007-01-09 22.14000   22.16667
2007-01-10 21.60000   23.26000
           NVDA.Volume NVDA.Adjusted
2007-01-03    28870500      22.12810
2007-01-04    19932400      22.02383
2007-01-05    31083600      20.64389
2007-01-08    16431700      20.79722
2007-01-09    19104100      20.39244
2007-01-10    27718600      21.39825

위 코드와 같이 한 번에 여러 종목의 데이터를 불러올 수 있음 

 

3.2.2 국내 종목 주가 다운로드

국내 종목의 경우 6자리의 티커로 구성되어 있고 코스피 상장 종목은 .KS, 코스닥은 .KQ 형태로 입력

getSymbols('005930.KS', from = '2000-01-01', to = '2018-12-31')
tail(Ad(`005930.KS`))

           005930.KS.Adjusted
2018-12-20           38293.23
2018-12-21           38293.23
2018-12-24           38441.84
2018-12-26           37996.00
2018-12-27           38250.00
2018-12-28           38700.00

tail(Ad(`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

위 코드는 코스피에 상장된 삼성전자의 주가 데이터를 getSymbols() 함수를 통해 불러온 것 

이때, 변수명에 '.'이 포함되므로 수정주가 확인 시 작은 따옴표(') 대신 억음 부호(`) 사용

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)만 다운로드

getSymbols("068760.KQ", from = '2000-01-01', to = '2018-12-31')

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

068760의 티커를 갖는 종목은 코스닥에 상장된 셀트리온으로, 해당 기간 종가만을 불러왔는데 NA 값이 뜸 (?)

 

3.2.3 FRED 데이터 다운로드

FRED는 Federal Reserve Economic Data의 약자로 미 연방준비은행에서 관리하는 기관

여기에서 미 국채 10년물 금리 다운로드 해보겠음

getSymbols('DGS10', src = 'FRED')

chart_Series(DGS10)

 

FRED에서는 티커명이 DGS10 이런 식인가봄 (DGS10은 미 국채 10년물 금리)

src 항목에는 데이터 출처인 FRED를 입력해주면 됨

최종적으로 getSymbols() 함수로 FRED의 API를 이용해 데이터를 받을 수 있고 마찬가지로 chart_Series() 함수로 시계열 데이터의 시각화 

금리가 1980년대 피크 찍고 계속 내려가는 모습

※ 이때, 항목 별 티커명은 FRED 사이트에서 검색창에 입력 후 페이지 주소에서 /series/ 다음의 항목을 찾으면 됨

 

 

 

DGS10 말고 원/달러 환율에 대한 추이를 보고 싶다면 해당 항목 검색 후 티커명 찾고 똑같이 실행해주면 됨

(원/달러 환율의 티커는 'DEXKOUS')

getSymbols('DEXKOUS', src = 'FRED')

tail(DEXKOUS)

           DEXKOUS
2020-08-07 1189.25
2020-08-10 1186.28
2020-08-11 1184.84
2020-08-12 1184.09
2020-08-13 1183.25
2020-08-14 1186.53

 

 

▶ 원/ 달러 환율은 이렇게 변해왔다고 함

지금은 1800대에서 왔다갔다

 

 

 

 

 

 

 

 

 


본 게시글은 다음 강의를 참고하여 공부한 내용을 기록한 것입니다.

https://www.fastcampus.co.kr/courses/202382/clips/


 

I'm a Senior Student in Data Science ! 

데이터 사이언스를 공부하고 있는 4학년 학부생의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 :)