3. FMP api 사용 및 피쳐 엔지니어링
개요
fmp api를 구독하여, 데이터를 분석 및 확인해보았습니다.
기업들의 이름인 Ticker 를 제공하지 않아, 따로 크롤링이 필요했습니다.
결측치는 손으로 셀 수 있는 정도로 적었고, 재무제표가 각 나라의 통화기반으로 구성이 되어있어 이를 미국통화로 바꾸어주는 전처리가 필요했습니다.
fmp api 이용 방법
fmp는 financialmodelingprep 의 줄임말이다. 해당 사이트에 들어가서 가입을 진행하면된다.
구독 가격 비교

위의 사진은 사이트의 구독 가격 비교 내용이다.
주요 차이점은 아래와 같다. 아래에서 데이터라 함은 재무제표, 가격데이터라고 생각해도 무방하다.
- 무료 요금제
- 하루에 250번의 호출
- 예시 데이터를 다운 받을 수 있음
- STARTER 요금제
- 한달에 29$를 지불 (이것도 너무 비싸다..)
- 1분에 300번의 호출 가능
- 5년치 데이터
- PREMIUM
- 한달에 69$ 지불
- 1분에 750번의 호출가능
- 30년치 데이터
- ULTMATE
- 한달에 139$ 지불
- 어닝콜 (각 회사의 실적 발표날 CEO가 전망을 발표하는 시간) 에 대한 녹취록을 제공
- 13F 라고해서 비동기적으로 실적 발표외에 중요한 발표를 할때가 있는데, 그에 대한 제공을 해줌
- 전체 데이터에 액세스가능
STARTER와 PREMIUM의 경우 정적인 분석 (백테스팅)에 적합하다고 봤고, ULTIMATE는 실시간 매매에 적합한 것 같았다.
나의 경우는 백테스팅을 기획하고 있으므로, STARTER 티어를 사용하기로 결정하였다. (추가로 가격문제..)
데이터 끌고 오기
가입을 완료했다면, FMP 홈페이지 > General > Dashboard 를 확인하면 API Key를 확인할 수 있다.
해당 API Key를 잘 저장해두자.
api
나는 아래와 같은 api를 사용하여, 핵심적인 재무제표와 일간 데이터를 끌고 온다.
- balance_sheet
- https://financialmodelingprep.com/stable/balance-sheet-statement?symbol={ticker}&limit=5&period=annual&apikey={FMP_API_KEY}
- symbol=ticker명, limit=몇년치를 가져올지, period=어떤 데이터를 가져올지 (annual로 하면 전부 가져올 수 있다), apikey=아까 확인한 api key
- cash_flow
- price
- https://financialmodelingprep.com/stable/historical-price-eod/full?symbol={ticker}&apikey={FMP_API_KEY}
위와같이 끌고 올 수 있는데, 중요한점이 ticker를 알아야한다는것이다. 아쉽게도 fmp api에서 ticker의 리스트를 제공하지는 않는다.
- https://financialmodelingprep.com/stable/historical-price-eod/full?symbol={ticker}&apikey={FMP_API_KEY}
ticker list
ticker 리스트를 제공하지 않는 문제를 해결하기위해 아래와 같이 미국 3대지수 기업의 위키피디아를 크롤링하여 csv파일에 저장하였다.
data 삽입
마지막으로 PostgreSQL에 SQL로 저장하여 ticker 별 재무제표와 가격 데이터를 저장하였다.
저장할때는 balance_sheet과 cash_flow 와 같이 분기별 재무제표 관련데이터를 저장하는 테이블과 price와 같이 매일매일의 가격을 알려주는 데이터를 나누어 저장하였다.
피쳐 엔지니어링
잘 저장된 데이터를 아래와 같은 목적을 위해 검증을 진행하였다.
- 결측치 얼마나 존재하는지 확인
- 0값 None값이 어떻게 되는지 확인
- 달러이외의 단위 있으면, 달러로 변경 필요
- 미래 편향 방지를 위해 공시기준일과 발표일을 잘 나누었는지 검증
- 공시기준일은 회사가 이날 기준으로 통계내고 발표한 것 입니다! 라고 명시한 날짜
- 발표일은 실제 발표를 한 날짜
- 발표일을 백테스팅의 기준으로 삼아야함, 그때가 정보가 실제로 풀린날이기 때문
피쳐 분석
python 코드와 sql을 사용해 결측치 확인을 진행하였다.
파이썬에서 csv파일을 데이터 프레임으로 불러와서, 각 지표별 최소, 최대, 중앙, 평균을 분석하였다.
결측치 확인
- 데일리 마켓 데이터의 경우 결측치가 존재하지 않음
- 주말이나, 미국장 휴일의 경우 아예 해당 날짜의 데이터가 없는 방식으로 저장됨
- 재무제표의 경우 4개의 결측치 존재
- otherAdjustmentsToNetIncome 과 netIncomeDeductions 라는 데이터가 결측이 되어있는데, 이는 내가 필요한 데이터가 아니기에 무방함
피쳐 통계
주요 내용만 아래와 같이 정리하였다.
지표 min 50% max mean
revenue 302554000.00 12019000000.00 2894308000000.00 38494560278.23
eps_growth -1256.03 0.10 292.75 0.01
- revenue는 수익인데 이가 4조를 넘어가는 기업이 있음
- 이는 단위에 에러가 있다고 생각이 되었음 (달러, 위안, 원 ..)
- eps growth (주당 이익의 증가분)
- 작년대비 -1256배 역성장 한 기업이 존재함
- 292.75배 성장한 기업이 존재함
- 이는 이상치라고 생각되었음
피쳐 통계 기반 SQL 분석
- 비정상적으로 성장률이 높은 기업은 SQL로 확인하였을때, 특이한 이상한 점을 발견하지는 못하였음

- 매출이 극도로 높은 기업의 경우 중국/대만기업이였음, 즉 통화단위가 달라서 발생한 오해였음 (TSMC, 징동닷컴)

- 또한 PER과 같은 가치지표가 극도로 저평가 되어있는 기업의 경우, 핀둬둬, 징동과 같은 외국기업이 대다수 였음

정리 및 해결책
- fmp api는 가장 유명한 api 답게 안정적이고 결측치가 적음
- 하지만 재무제표에서 단위에 대한 고려가 안되어있음 (가격의 경우는 usd로 되어있음)
- 이를 해결하기 위해 ai를 활용해, ticker json 파일에 usd 대비 통화의 비율을 추가는 방식을 적용하였음