Finance Toolkit을 활용한 저평가 주식 스크리닝
요약
Finance Toolkit 라이브러리를 사용하여 Python 코드로 저평가 주식을 스크리닝하는 방법을 소개합니다. 밸류에이션 배수 추출부터 수익성 지표를 활용한 가치 함정 구분까지의 전 과정을 다룹니다.
핵심 포인트
- Finance Toolkit을 활용한 자동화된 주식 스크리닝 프로세스 구축
- P/E, P/FCF, P/B 등 다양한 밸류에이션 지표의 교차 검증 중요성
- 단일 지표 정렬 시 발생할 수 있는 오류(음수 값 등) 주의 필요
- FMP API를 통한 금융 데이터 확보 및 분석 방법
수천 개의 상장 기업이 존재하는 상황에서 수작업으로 저평가된 주식을 찾는 것은 비현실적입니다. 체계적인 스크리닝 (Screening)은 이를 변화시킵니다. 전체 유니버스 (Universe)에 걸쳐 밸류에이션 배수 (Valuation multiples)를 추출하고, 여러 기준을 동시에 적용하여 필터링하며, 수익성 지표 (Profitability metrics)를 중첩하여 진정한 가치와 가치 함정 (Value traps)을 구분합니다. Finance Toolkit을 사용하면 이러한 각 단계를 단 몇 줄의 Python 코드로 수행할 수 있습니다.
이 글에서는 유니버스 정의부터 최종 쇼트리스트 (Shortlist) 선정까지의 전체 스크리닝 과정을 살펴봅니다. 로직을 설명하기 위해 5개 섹터에 걸친 15개 주식을 사용합니다. 실제 스크리닝은 더 넓은 범위를 대상으로 하며, Discovery 모듈 또한 이를 지원합니다.
모든 계산에 대한 소스 코드는 GitHub에서 확인할 수 있습니다. MCP 서버 문서는 여기에 있습니다.
설정하기
먼저 Finance Toolkit을 설치합니다:
pip install financetoolkit
그 다음 라이브러리를 임포트 (Import)하고 티커 (Tickers) 유니버스를 정의합니다. 아래 예시는 기술 (Technology), 헬스케어 (Healthcare), 필수 소비재 (Consumer staples), 금융 (Financials), 에너지 (Energy) 섹터에 걸친 15개 주식을 사용합니다.
import pandas as pd
from financetoolkit import Toolkit
...
jeroenbouma.com/fmp에서 FMP API 키를 받으세요. 무료 플랜은 5년의 과거 데이터를 제공하며, 유료 플랜은 더 깊은 과거 데이터와 더 넓은 유니버스를 제공합니다.
1단계: 밸류에이션 배수 추출하기
첫 번째 단계에서는 상대적인 저렴함을 파악하기 위해 4가지 비율 (Ratios)을 사용합니다. P/E (주가수익비율)와 EV/EBITDA (기업가치 대비 EBITDA 배수)는 가장 일반적인 진입점이며, P/FCF (주가현금흐름비율)와 P/B (주가순자산비율)는 조작하기 어려운 교차 검증 수단을 제공합니다.
pe = screener.ratios.get_price_to_earnings_ratio()["2025"]
pfcf = screener.ratios.get_price_to_free_cash_flow_ratio()["2025"]
pb = screener.ratios.get_price_to_book_ratio()["2025"]
...
결과는 다음과 같습니다:
| Ticker | P/E | P/FCF | P/B | EV/EBITDA |
|---|---|---|---|---|
| INTC | neg | neg | 1.6 | 19.1 |
| ... |
스프레드(Spread)가 즉시 확인됩니다. BAC와 MRK는 이익의 15배 미만에서 거래되고 있습니다. WMT는 46배에 거래됩니다. INTC가 정렬 상단에 나타나는 이유는 해당 기업이 순손실을 기록하여 P/E (주가수익비율)가 음수(-)이기 때문이며, 이것이 바로 추가적인 필터 없이 단일 지표만으로 정렬하는 것이 위험한 이유입니다.
주의 깊게 살펴볼 만한 다른 수치들도 있습니다. KO는 23배라는 비교적 완만한 P/E에도 불구하고 잉여현금흐름 대비 주가(P/FCF)가 57배로 거래되고 있는데, 이는 높은 CapEx (자본적 지출) 또는 자본 구조의 영향임을 시사합니다. AAPL의 P/B (주가순자산비율) 55.3배는 Apple이 너무 많은 자기주식을 매입하여 남은 자본이 거의 없다는 현실을 반영하며, 이는 P/B가 금융이나 에너지와 같은 자산 집약적 섹터에서 가장 유용하다는 점을 상기시켜 줍니다.
2단계: 필터 적용
단일 지표 스크리닝은 회계적 선택, 일회성 비용 또는 특이한 자본 구조에 의해 왜곡되기 쉽습니다. 여기서 사용하는 접근 방식은 두 가지 지표를 동시에 통과해야 합니다: P/E 20배 미만 및 EV/EBITDA (기업가치 대비 EBITDA) 18배 미만이며, 음수 이익을 내는 기업은 제외합니다.
value_candidates = valuation[
(valuation["P/E"] > 0) &
(valuation["P/E"] < 20) &
...
결과는 다음과 같습니다:
['BAC', 'JNJ', 'MRK', 'PFE', 'XOM']
JPM은 P/E 필터는 통과했지만, EV/EBITDA가 18.7배로 임계값을 약간 상회하여 탈락했습니다. CVX는 EV/EBITDA(8.9배)는 통과했지만, P/E가 23배로 기준치를 약간 벗어났습니다. 최종적으로 다섯 개의 주식이 두 필터를 모두 통과했습니다: BAC, JNJ, MRK, PFE, XOM.
은행의 경우 기업 가치(Enterprise Value)와 영업 이익의 개념이 산업 기업과는 다르게 작동하므로 EV/EBITDA가 덜 유의미하다는 점에 유의하십시오. P/E 16배에 P/FCF 8.9배인 JPM은 Tangible Book (유형장부가치) 대비 주가나 ROE (자기자본이익률)와 같은 은행 특화 지표를 사용하여 별도로 고려할 가치가 있습니다.
3단계: 퀄리티 오버레이 (Quality Overlay)
밸류에이션(Valuation) 측면에서 저렴하다는 것이 저평가되었다는 것과 동일하지는 않습니다. 가치 함정(Value trap) 문제는 실재합니다. 투자자들이 수익성 악화, 재무제표(Balance sheet)의 압박, 또는 구조적 쇠퇴를 예상하기 때문에 주식이 낮은 배수(Multiples)로 거래되는 경우가 있습니다. 다섯 가지 후보군에 대해 행동하기 전에, 수익성 지표가 뒷받침되어야 합니다.
roe = screener.ratios.get_return_on_equity()["2025"]
roic = screener.ratios.get_return_on_invested_capital()["2025"]
gross_margin = screener.ratios.get_gross_margin()["2025"]
...
결과값:
| 티커 (Ticker) | ROE | ROIC | 매출총이익률 (Gross Margin) |
|---|---|---|---|
| BAC | 9.7% | 4.8% | 56.1% |
| ... |
이 표는 차별점을 보여줍니다. JNJ와 MRK는 모두 71% 이상의 매출총이익률(Gross margin)과 함께 투하자본이익률(ROIC) 28% 이상을 기록하고 있습니다. 이들이 저렴한 이유는 사업이 악화되고 있기 때문이 아닙니다. 제약주들이 광범위한 섹터 압박, 특허 절벽(Patent cliff) 우려(MRK), 그리고 소송 리스크(Litigation overhangs)(JNJ)에 직면했기 때문입니다. 근본적인 수익성은 온전합니다.
XOM은 14.8%의 ROIC를 기록하고 있는데, 이는 상당한 고정 자산 기반을 바탕으로 운영되는 에너지 기업으로서 견고한 수치입니다. 21.7%의 낮은 매출총이익률은 구조적 약점이라기보다 석유 정제 및 유통의 원자재 경제(Commodity economics)를 반영합니다. 여기서의 리스크는 경기 순환적(Cyclical)입니다. 유가가 하락하면 에너지 수익이 압축됩니다.
PFE의 ROIC는 11.3%로 경계선에 있습니다. 70.3%의 매출총이익률은 근본적인 제약 사업이 강력한 경제성을 창출하고 있음을 확인시켜 주지만, 헤드라인 수익 지표는 코로나19 백신 매출이 감소한 이후의 매출 재설정(Revenue reset)으로 인해 저하된 상태입니다. 이것이 진정한 회복 기회인지 아니면 장기적인 구조조정인지는 파이프라인(Pipeline)에 달려 있습니다.
ROIC가 4.8%인 BAC는 산업재(Industrial) 맥락에서는 탈락 사유처럼 보일 것입니다. 자산이 자기자본(Equity)보다는 예금에 의해 조달되는 은행의 경우, 9.7%의 ROE가 더 관련성 있는 지표입니다. 그렇다 하더라도, 이는 시장의 할인율이 명백한 저가 매수 기회라기보다는 완만한 수준임을 시사합니다.
4단계: 최종 스크리닝
5개의 주식이 이중 가치 평가 필터(dual valuation filter)를 통과했습니다. 마지막 단계에서는 ROIC(자본수익률) 임계값을 적용하여, 진정한 기회와 저렴한 가격이 구조적으로 취약한 자본 수익률을 반영하는 경우를 구분합니다.
final_screen = quality[quality["ROIC"] > 0.10].sort_values("ROIC", ascending=False)
결과는 다음과 같습니다:
| 티커 (Ticker) | ROE (자기자본이익률) | ROIC (자본수익률) | 매출총이익률 (Gross Margin) |
|---|---|---|---|
| JNJ | 35.0% | 33.0% | 72.8% |
| ... |
BAC는 산업 임계값 미만인 4.8%의 ROIC로 인해 제외되었으나, 은행업의 맥락을 고려하면 별도의 분석이 필요합니다. 남은 4개 종목은 의미 있게 서로 다른 리스크 프로필(risk profiles)을 나타냅니다.
JNJ와 MRK는 이번 스크리닝에서 가치와 품질이 가장 강력하게 결합된 종목입니다. 두 기업 모두 자본 비용(cost of capital)을 훨씬 상회하는 수익을 올리고 있으며, 강력한 프랜차이즈 지위를 보유하고 있습니다. 또한, 두 기업 모두 상당한 제품 파이프라인을 보유하고 있다는 점을 고려하면 보수적인 수준인, 이익 성장이 반영되지 않은 멀티플(multiples)에서 거래되고 있습니다. XOM은 적절한 자본 효율성과 9.3배의 낮은 EV/EBITDA를 갖춘 원자재 노출(commodity exposure) 기회를 제공하며, 이는 유가 사이클 리스크를 감수할 수 있는 투자자에게 적합합니다. PFE는 투기적 회복 후보입니다. 비즈니스 모델은 온전하고 할인율은 실재하지만, 회복 시점은 불확실합니다.
스크리닝이 알려주지 않는 것
정량적 스크리닝(quantitative screen)은 범위를 좁혀줄 뿐입니다. 스크리닝이 모든 작업을 대신해주지는 않습니다.
이 종목들 각각은 Toolkit이 지원할 수는 있지만 자동화할 수는 없는 분석들을 필요로 합니다: 부채 만기 프로필(debt maturity profiles), 단기 이익 촉매제(earnings catalysts), 경영진의 자본 배분 실적(capital allocation track records), 그리고 섹터별 리스크 요인들입니다. MRK의 키트루다(Keytruda) 특허 만료(patent cliff)는 과거 ROIC에 포착되지 않는 알려진 리스크입니다. XOM의 자본 지출(capital expenditure) 계획은 어떤 스크리닝도 예측할 수 없는 원자재 가격 경로에 크게 의존합니다.
이 스크리닝의 결과물은 매수 목록(buy list)이 아니라 관심 종목 리스트(watchlist)입니다. 이 과정이 효율적으로 수행하는 역할은 가격과 품질의 조합이 더 자세히 살펴볼 가치가 없는 11개의 주식을 제거하는 것입니다.
Finance Toolkit MCP로 이렇게 시도해 보세요: "기술, 헬스케어, 필수 소비재, 금융, 에너지 섹터 전반에서 P/E 20 미만, EV/EBITDA 18 미만, ROIC 10% 초과인 주식 15개를 스크리닝하세요. 밸류에이션 (Valuation) 지표와 품질 (Quality) 지표를 나란히 보여주세요."
_Finance Toolkit은 오픈 소스이며 GitHub에서 확인할 수 있습니다. Finance Toolkit MCP 서버는 Claude, Copilot, Cursor, Windsurf, Gemini에서 직접 접근할 수 있어, 코드를 작성하지 않고도 분석을 수행할 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기