본문 바로가기
퀀트 분석/퀀트 기초

[Python] FMP API 사용해 미국 재무제표 데이터 불러오기

by 쿼카퀀트 2021. 4. 4.
728x90

FMP(Financial Modeling Prep)은 미국, 유럽, 홍콩 등 거래소에 상장된 기업들의 주가, 재무제표, 뉴스 등 금융 관련 데이터를 받아올 수 있는 API를 제공해주는 업체다. 금융 데이터를 제공해주는 많은 소스(Quandl, Yahoo Finance 등)가 있지만, FMP가 제공되는 데이터 수준에 비해 가장 합리적인 가격이라 생각돼 FMP를 사용하는 방법을 소개하고자 한다.

 

위 FMP 링크를 들어가면 API의 Documentation이 아래와 같이 보인다.

FMP API Documentation

맨 왼쪽에 제공되는 데이터 종류, 중간엔 세부 사용 방법, 오른쪽엔 결과물 예시가 보인다. 이번 포스팅에선 Python을 활용해 FMP API로부터 JSON형식의 데이터를 불러오고, 이를 Pandas 형식으로 변형하는 과정을 해 보자.

 

시작하기 전, FMP 사용량 제한에 대해 설명하자면, FMP는 기본적으로 사용이 무료인 대신, 하루 250번의 쿼리 사용량 제한, 그리고 5년(혹은 5분기)의 재무제표 기간 제한이 있다. 매달 $19(혹은 1년 결제 시 월 $14)를 지불하면 쿼리 사용량 제한이 사라지고, 재무제표 기간 제한 역시 사라지므로, 일단 무료 버전으로 사용해보고 실전 분석을 하고싶을 때 결제하면 좋을 것 같다.

 

그럼 본격적으로 FMP를 활용한 재무제표 데이터 불러오기를 시작해보자.

 

1. API Key 발급받기

먼저, API Key를 발급받자. FMP 사이트에 들어가 로그인 후, 상단 Dashboard 탭에 들어가면, 아래 그림처럼 API Key가 발급된 것을 확인할 수 있다. 빨간색으로 가려놓은 부분에 각자의 API Key가 있다. 무료 버전이더라도 이 API Key가 있어야 제대로 된 데이터에 접근할 수 있으니, 꼭 Key가 발급된 것을 확인하고 넘어가도록 하자.

 

2. Documentation에서 재무제표 관련 쿼리 찾기

다음으론 FMP 사이트 Documentation 탭에서 재무제표와 관련된 쿼리를 찾아보자. 재무제표는 아래 그림처럼 소제목 'Company Financial Statements'에서 Income Statement, Balance Sheet, Cash Flow세 가지로 나뉘어 쿼리를 날려 수집할 수 있다.

또한, 쿼리로 period=quarter를 추가해 분기별 재무제표를 받아오거나, limit=n으로 최근 n개의 재무제표만을 불러오도록 설정할 수 있다.

JSON링크 예시를 하나 들어가보면, 이렇게생긴 데이터를 불러오는 것을 확인할 수 있다.

 

3. Python과 API 연결

사실 연결한다는 표현을 쓰긴 좀 그렇다. FMP의 JSON url로부터 불러오는 것이기 때문에, 별도의 패지키가 있는게 아니기 때문이다. 이렇게 설명하는 것보다 바로 실제 예시를 보면서 어떻게 파이썬에서 재무제표를 불러오는지 살펴보도록 하자.

 

먼저, 아래와 같이 pandas와 numpy를 import한다.

import pandas as pd
import numpy as np

 

 

FMP의 Documentation에선 request를 사용하라고 소개해주지만, pandas를 사용해 더 간편하게 해보자. 간단하다, 아래와 같이 api_key에 1번에서 발급받은 자신의 API Key를 복붙하고, url에 다음과 같이 Documentation에서 본 링크를 붙여넣는다. 예시는 Apple(AAPL)의 분기별 income statement를 불러오는 url이다.

url주소가 맞다면, pd.read_json(url)을 통해 바로 JSON형식 데이터를 pandas형식으로 변환할 수 있다.

api_key = 'YOUR_API_KEY_HERE'

url_is= "https://financialmodelingprep.com/api/v3/income-statement/AAPL?period=quarter&apikey={}".format(api_key)
pd_is = pd.read_json(url_is)

 

 

Pandas형식으로 변형해 pd_is에 저장한 객체의 형태는 아래와 같다. 총 133개의 row(1985년부터 2020년까지 분기별), 34개의 column(매출, 매출총이익, 순이익 등)이 존재하는 것을 확인할 수 있다. AAPL은 FMP에서 예시 종목으로 열어뒀기 때문에 무료 계정도 1985년부터 데이터를 전부 받을 수 있지만, AAPL이 아닌 다른 종목의 데이터를 불러온다면 최근 5개의 종목만 받아올 수 있다는 점을 고려하자(제대로 데이터 분석/머신러닝 알고리즘 개발 용도로 쓸라면 아무래도 결제를 해야한다...).

4. 불러온 Dataset 연결

3번처럼 income statement를 불러오고, balance sheet, cash flow도 불러오면, 우리에게 총 3개의 데이터 테이블이 존재하게 될 것이다. 이 세 테이블을 하나로 합쳐보자. 파이썬에 조금만 익숙한 사람은 스스로 할 수 있을테니, 한번 직접 합쳐보자.

먼저, 세 종류의  재무제표 관련 데이터를 불러오는 코드를 살펴보면 아래와 같다. 각각 income statement, balance sheet, cash flow이며, AAPL의 분기별 재무제표를 불러왔다.

url_is= "https://financialmodelingprep.com/api/v3/income-statement/AAPL?period=quarter&apikey={}".format(api_key)
pd_is = pd.read_json(url_is)
url_bs = "https://financialmodelingprep.com/api/v3/balance-sheet-statement/AAPL?period=quarter&apikey={}".format(api_key)
pd_bs = pd.read_json(url_bs)
url_cf = "https://financialmodelingprep.com/api/v3/cash-flow-statement/AAPL?period=quarter&apikey={}".format(api_key)
pd_cf = pd.read_json(url_cf)

 

이 세 데이터셋을 이제 간단히 inner join 하면 된다. 합치는 기준은 date와 symbol로 한다(이번 예시는 AAPL 한 종목만 사용했기 때문에 date만 써도 상관없지만, 향후 여러 종목을 사용하게 될 경우가 있을지도 모르니 이처럼 여러 column을 기준 column으로 삼을 수 있다는 것을 보여주기 위해 굳이 두개의 column을 기준으로 합치는 코드를 써 봤다.

pd_mg = pd_is.merge(pd_bs,left_on=['date', 'symbol'], right_on=['date', 'symbol'], how='inner',suffixes=('', '_delme'))
pd_mg = pd_mg.merge(pd_cf,left_on=['date', 'symbol'], right_on=['date', 'symbol'], how='inner',suffixes=('', '_delme'))

옵션 suffixes=('','_delme')는 합치는 두 데이터셋 간 동일한 이름의 컬럼이 존재할 경우, 한 데이터는 원래 컬럼명 그대로, 다른 한 데이터는 컬럼명 끝에 _delme를 붙이도록 하는 코드다. 이 코드를 짠 이유는, 중복되는 컬럼을 제거하기 위해서이다.

 

중복되는 컬럼 제거는 아래 코드와 같이 컬럼명 끝에 _delme가 붙은 컬럼을 drop하는 방식으로 처리한다.

pd_mg = pd_mg[[c for c in pd_mg.columns if not c.endswith('_delme')]]

 

이렇게 할 경우, 최종적으로 pd_mg의 생김새는 아래와 같다.

세 데이터셋이 합쳐지며 컬럼 수가 100개로 늘어났으며, 중복되는 column 역시 존재하지 않는 것을 확인할 수 있다.

 

5. 마무리

이렇게 애플(AAPL)의 30년 간 분기별 재무제표 데이터를 불러와 보았다. 전에 설명한 Yahoo Finance에 비하면 훨씬 간편한 방식으로 불러올 수 있다는 점이 매우 편리하다.

FMP를 통해서 과거 및 실시간 주가 데이터 역시 불러올 수 있기 때문에, 만약 FMP 결제를 한다면 Yahoo Finance API는 더이상 쓸 필요 없을 것 같다는 생각이 든다.

 

지금까지 이렇게 재무제표와 주가 등 데이터를 불러오는 방법에 대해 설명했으니, 향후 차차 통계/머신러닝을 활용한 금융 데이터 분석 및 활용 튜토리얼을 배워보도록 하자.

728x90

댓글