GIL's LAB

FinanceDataReader를 이용한 주식, 비트코인 및 경제 지표 데이터 수집 본문

퀀트 투자/데이터 수집

FinanceDataReader를 이용한 주식, 비트코인 및 경제 지표 데이터 수집

GIL~ 2021. 9. 5. 18:35

본 포스팅에서는 금융 데이터를 수집하는데 많이 사용되는 파이썬 패키지인 FinanceDataReader를 이용하여, 주식 및 다양한 경제 지표 데이터를 수집하는 방법을 소개한다.

API나 크롤링을 사용하는 것에 비해, 굉장히 손쉽게 수집할 수 있어, 일별 데이터만 수집한다면 이 패키지를 사용하는 것을 추천한다 (추후에 반드시 API를 이용하여 분/틱 데이터 수집하는 것을 공유해야겠다..)

 

패키지 설치

Anaconda prompt를 실행하여 pip install finance-datareader를 입력하여 아래와 같이 패키지를 설치한다.

 

환율 데이터 수집

환율 데이터는 fdr.DataReader(환율, 시작날짜, 종료날짜)를 입력하여 수집할 수 있다.

단, 종료날짜를 입력하지 않으면 시작날짜부터 현재날짜까지의 데이터를, 시작날짜와 종료날짜를 모두 입력하지 않으면 전체 기간의 환율을 수집한다. 

예를 들어, 2021년 8월 한 달 동안의 달러당 원화 환율 데이터는 다음과 같이 얻을 수 있다.

 

참고로 입력 가능한 환율 목록은 아래와 같다. 

 

입력 설명
USD/KRW 달러당 원화 환율
USD/EUR 달러당 유로화 환율
USD/JPY 달러당 엔화 환율
CNY/KRW 위엔화 원화 환율
EUR/USD 유로화 달러 환율
USD/JPY 달러 엔화 환율
JPY/KRW 엔화 원화 환율
AUD/USD 오스트레일리아 달러 환율
EUR/JPY 유로화 엔화 환율
USD/RUB 달러 루블화

이제 언제 사용할진 모르지만, 다음과 같이 5개년치 데이터를 수집해서 저장해보자.

여기서 time.sleep(1)은 데이터를 수집하다가 연결이 끊기는 것을 방지하기 위해 1초씩 텀을 두고 데이터를 수집하기 위한 코드이다.

import FinanceDataReader as fdr
import pandas as pd
import time
ex_rate_list = ["USD/KRW", "USD/EUR", "USD/JPY", "CNY/KRW", "EUR/USD", "USD/JPY", "JPY/KRW", "AUD/USD", "EUR/JPY", "USD/RUB"]
for ex_rate in ex_rate_list:
    df = fdr.DataReader(ex_rate, "2016-09-01", "2021-08-31")
    df.reset_index(inplace = True) # 날짜 인덱스를 컬럼으로 변경
    df.to_csv("{}.csv".format(ex_rate.replace("/", "-"), index = False)) # /는 파일명에 사용할 수 없어서 -로 변경
    time.sleep(1)

 

증시 데이터 수집

주식 데이터 역시 fdr.DataReader를 이용하여 다음과 같이 수집할 수 있다.

 

fdr.DataReader(코드명/심볼, 시작날짜, 종료날짜)

 

코드명 혹은 심볼은 StockListing 함수를 이용하면 손쉽게 구할 수 있다.

이 함수의 코드명으로 입력할 수 있는 값은 다음과 같다.

  • 'KRX' ('KOSPI', 'KODAQ', 'KONEX')
  • 'NASDAQ'
  • 'NYSE'
  • 'AMEX'
  • 'S&P500'

이 함수의 출력은 다음과 같이 Symbol, Name, Sector, Industry로 구분된 데이터프레임이다. 

 

본 예제에서는 S&P 500 데이터와 NASDAQ 데이터 5개년치를 다음과 같이 수집한다.

파일명은 종목명으로 하기 위해, symbol과 name을 같이 순회하도록 코드를 작성했다. 

또, reset_index를 사용한 이유는 날짜를 나타내는 인덱스를 컬럼으로 사용하기 위함이다. 

 

<S&P 500>

stock_code_list = fdr.StockListing('S&P500')
for symbol, name in stock_code_list[['Symbol', 'Name']].values:
    df = fdr.DataReader(symbol, "2016-09-01", "2021-08-31")
    df.reset_index(inplace = True)
    df.to_csv("{}.csv".format(name), index = False)
    time.sleep(1)

<나스닥>

나스닥 같은 경우는 중간에 오류가 나는 종목들이 섞여 있어, try/except 구문을 사용하였다.

stock_code_list = fdr.StockListing('NASDAQ')
for symbol, name in stock_code_list[['Symbol', 'Name']].values:
  try:
    df = fdr.DataReader(symbol, "2016-09-01", "2021-08-31")
    df.reset_index(inplace = True)
    df.to_csv("{}.csv".format(name), index = False)
    time.sleep(1)
  except:
  	pass

 

채권 수익률 데이터 수집

 

채권 수익률은 다음을 입력하여 수집할 수 있다.

  • N년만기 한국국채 수익률: "KRNYT=RR" (예: KR1YT=PR: 1년만기 한국국채 수익률); N = 1,2,3,4,5,10,20,30,50 
  • N개월만기 미국국채 수익률: "USNMT=X" (예: US3MT=X: 3개월만기 미국국채 수익률); N = 1,3,6
  • N년만기 미국국채 수익률: "USNYT=X" (예: US1YT=X; 1년만기 미국국채 수익률); N = 1,2,3,5,7,10,30

예제에서는 년단위 만기인 한국과 미국국채 수익률 데이터를 수집해서 저장한다.

# 한국 국채
for N in [1,2,3,4,5,10,20,30,50]:
    df = fdr.DataReader("KR{}YT=RR".format(N), "2016-09-01", "2021-08-31")
    df.reset_index(inplace = True)
    df.to_csv("{}년만기_한국국채수익률.csv".format(N), index = False)
    time.sleep(1)
# 미국 국채
for N in [1,2,3,5,7,10,30]:
    df = fdr.DataReader("US{}YT=X".format(N), "2016-09-01", "2021-08-31")
    df.reset_index(inplace = True)
    df.to_csv("{}년만기_미국국채수익률.csv".format(N), index = False)
    time.sleep(1)

 

상품 선물 데이터 수집

상품 선물 데이터는 아래 표를 이용하여 수집할 수 있다. 

심볼 내용
NG 천연가스 선물 (NYMEX)
GC 금 선물 (COMEX)
SI 은 선물 (COMEX)
HG 구리 선물 (COMEX)
CL WTI유 선물 (NYMEX)

예제에서는 모든 데이터를 수집해서 저장해보자.

for symbol, name in zip(["NG", "GC", "SI", "HG", "CL"],
                        ["천연가스", "금", "은", "구리", "WIT유"]):
    df = fdr.DataReader(symbol, "2016-09-01", "2021-08-31")
    df.reset_index(inplace = True)
    df.to_csv(name, index = False)
    time.sleep(1)

비트코인 데이터 수집

비트코인 데이터는 아래를 참고해서 수집할 수 있다. 

심볼 내용
BTC/KRW 비트코인 원화 가격
ETH/KRW 이더리움 원화 가격
XRP/KRW 리플 원화 가격
BCH/KRW 비트코인 캐시 원화 가격
EOS/KRW 이오스 원화 가격
LTC/KRW 라이트 코인 원화 가격
XLM/KRW 스텔라 원화 가격

역시 예제에서는 모든 데이터를 수집해서 저장해보자.

for symbol, name in zip(["BTC/KRW", "ETH/KRW", "XRP/KRW", "BCH/KRW", "EOS/KRW", "LTC/KRW", "XLM/KRW"],
                        ["비트코인", "이더리움", "리플", "비트코인캐시", "이오스", "라이트코인", "스텔라"]):
    df = fdr.DataReader(symbol, "2016-09-01", "2021-08-31")
    df.reset_index(inplace = True)
    df.to_csv(name, index = False)
    time.sleep(1)

 

수집하고 싶은 금융 데이터나 실험하고 싶은 퀀트 관련 아이디어가 있으면 댓글로 남겨주세요! 
관련 포스팅을 준비하도록 하겠습니다!

 

Comments