이어 가기
- Scan
engines.scan - Scan - 스크리닝
engines.scan.screen - Scan - 밸류에이션
engines.scan.valuation - Scan - 계정
engines.scan.account - Quality + Value 횡단 스크리닝 (Novy-Marx GP/A 기반)
engines.recipe.qualityValueScreen - Altman-lite 부도 위험 회피 필터 (역방향 블랙리스트)
engines.recipe.distressFilter - Piotroski F-Score 7 항목 횡단 점수카드
engines.recipe.piotroskiLite - Analysis - 가치평가
engines.analysis.valuation
절차
실행 순서
- 1
Lakonishok-Shleifer-Vishny (1994): 저-PBR 가치주 1968-90 미국 연 17.3% vs 성장주 9.3%.
- 2
Chan-Hamao-Lakonishok (1991): 일본 시장 동일 효과 — 저-PBR + 높은 매출/주가 결합 우월.
- 3
한국: 단순 저-PBR 은 chaebol discount 함정 → Graham 의 4 게이트 결합으로 함정 회피.
- 4
`stockCode`, `corpName`
- 5
`valuation.pbr : float` — PBR (≤ 1.0)
- 6
`valuation.per : float`
- 7
`finance.ratio.currentRatio : float` — 유동비율
- 8
`finance.ratio.debtRatio : float` — 부채비율
- 9
`finance.ratio.netMargin : float` — 순이익률
- 10
별도 5 년 net_income 컬럼은 후처리 join 시 보존 가능
- 11
**NCAV 직접 계산 X** — Graham 원전 net-net 공식은 `(cash + 0.75·AR + 0.5·Inv − totalLiab) × 2/3` 가 marketCap 보다 커야 한다. 본 recipe 는 PBR 게이트로 근사. 정확한 NCAV 는 `scanAccount` 4 항목 (현금·매출채권·재고·총부채) 결합 + 시가총액 join 별 단계.
- 12
**PBR 1.0 임계는 한국 시장 평균 부근** — 너무 느슨. 진정 deep value 는 PBR 0.7 이하 가능. 단계적 임계 (PBR 0.7 / 0.8 / 1.0) 권장.
학술 근거
Benjamin Graham, The Intelligent Investor (1949) + Security Analysis (1934, with Dodd): Margin of Safety — 시장가 < 본질가치 와 자본구조 안전성 동시 요구. 핵심 게이트:
- PBR ≤ 1.0 — 시장가 ≤ 장부가 (회계상 청산가치 안전마진).
- Current Ratio ≥ 2.0 — 단기 부채 대비 유동자산 2 배 이상 (유동성 안전).
- Debt Ratio ≤ 50% — 자본 대비 부채 1:1 이내 (레버리지 안전).
- 5 년 흑자 — 사이클 전체 생존성 검증.
학술 검증:
- Lakonishok-Shleifer-Vishny (1994): 저-PBR 가치주 1968-90 미국 연 17.3% vs 성장주 9.3%.
- Chan-Hamao-Lakonishok (1991): 일본 시장 동일 효과 — 저-PBR + 높은 매출/주가 결합 우월.
- 한국: 단순 저-PBR 은 chaebol discount 함정 → Graham 의 4 게이트 결합으로 함정 회피.
dartlab 한계: 진정한 NCAV (Net Current Asset Value) 계산은 (currentAssets - totalLiabilities) × 2/3 가 marketCap 보다 커야 하는데 시가총액 시계열 직접 결합 어려움 → 본 recipe 는 PBR 게이트로 근사. NCAV 계산은 engines.scan.account 로 별도 후속 단계.
공개 호출 방식
import dartlab
import polars as pl
# 1) 4 게이트 동시 통과
safe = dartlab.scan("screen", spec={"where": [
{"field": "valuation.pbr", "op": "<=", "value": 1.0},
{"field": "finance.ratio.currentRatio", "op": ">=", "value": 2.0},
{"field": "finance.ratio.debtRatio", "op": "<=", "value": 50},
{"field": "finance.ratio.netMargin", "op": ">", "value": 0},
]})
# 2) 5 년 흑자 후처리 — net_income freq="Y" 5 기간 모두 양수
ni = dartlab.scanAccount("net_income", freq="Y").select(
["stockCode", "2025", "2024", "2023", "2022", "2021"]
)
profit5y = ni.with_columns(
pl.all_horizontal([pl.col(y) > 0 for y in ["2025","2024","2023","2022","2021"]]).alias("profit5y")
).filter(pl.col("profit5y"))
# 3) Join → 4 게이트 + 5 년 흑자 동시 통과 deep value
candidates = (
safe.join(profit5y.select(["stockCode"]), on="stockCode")
.sort("valuation.pbr")
) 호출 동작
scan("screen", spec=...)— PBR 1.0 + currentRatio 2.0 + debtRatio 50% + netMargin 양수 4 게이트.scanAccount("net_income", freq="Y")— 5 기간 (2021-2025) 컬럼 wide 테이블.pl.all_horizontal— 5 년 모두 양수만 필터.- join — 4 게이트 통과 + 5 년 흑자 교집합.
- PBR 오름차순 정렬 — 가장 저평가 우선.
대표 반환 형태
candidates : pl.DataFrame — 컬럼:
stockCode,corpNamevaluation.pbr : float— PBR (≤ 1.0)valuation.per : floatfinance.ratio.currentRatio : float— 유동비율finance.ratio.debtRatio : float— 부채비율finance.ratio.netMargin : float— 순이익률- 별도 5 년 net_income 컬럼은 후처리 join 시 보존 가능
한계
- NCAV 직접 계산 X — Graham 원전 net-net 공식은
(cash + 0.75·AR + 0.5·Inv − totalLiab) × 2/3가 marketCap 보다 커야 한다. 본 recipe 는 PBR 게이트로 근사. 정확한 NCAV 는scanAccount4 항목 (현금·매출채권·재고·총부채) 결합 + 시가총액 join 별 단계. - PBR 1.0 임계는 한국 시장 평균 부근 — 너무 느슨. 진정 deep value 는 PBR 0.7 이하 가능. 단계적 임계 (PBR 0.7 / 0.8 / 1.0) 권장.
- 5 년 흑자만 봄 — 사이클 회사 (조선·반도체) 부분 적자도 정상 가능. 산업별 적용 한계 명시.
- 금융업 부채비율 게이트 부적합 — 은행·보험·증권은 부채비율 1000% 일상. 본 recipe 결과에서 금융업 별도 분리 권장.
한국 / 미국 시장 차이
- 한국: KOSPI 평균 PBR ≈ 1.0, KOSDAQ ≈ 1.5. 본 게이트 (PBR 1.0) 통과 종목 풀 약 800-1000 개. 그중 chaebol governance discount 종목 다수 → 실제 deep value 식별 어려움. 4 게이트 + 5 년 흑자 결합으로 약 50-150 개 후보 좁힘.
- 미국: S&P 500 평균 PBR ≈ 4. PBR 1.0 통과 종목 풀 매우 작음. Russell 2000 (소형주) 에서 본 framework 효과 강함 — 1968-90 백테스트의 본 시장.
연계 절차
- 본 recipe 로 후보 발굴 →
tableRef에 4 게이트 + 5 년 흑자 분포. - 상위 후보에 대해 NCAV 정확 계산 —
scanAccount로 cash·AR·inventory·totalLiabilities 가져와서 시가총액 join. engines.recipe.piotroskiLite의 F-Score 추가 검증 (가치 함정 회피 강화).engines.recipe.distressFilter로 부도 위험 거름.engines.analysis.valuation의 DCF + valuation band — 본질가치 산출.engines.story로 narrative — 사이클 위치, 산업 구조, 자본정책 (배당·자사주) 까지.
기본 검증
- 후보 수 — 4 게이트 + 5 년 흑자 모두 통과 50-150 개가 정상.
- 산업 분포 — 한 산업 (제조업·금융) 80% 이상 = 산업 편향. 게이트 조정 또는 산업별 별도 적용.
- PBR 분포 — 중앙값 0.7-0.85 면 진짜 deep value 풀.
- 흑자 일관성 외에 영업이익 일관성 추가 점검 권장 (본 recipe 는 net_income 만).
- 회사가 PBR 낮은 이유 검증 필수 — chaebol 계열 deep discount, 사업부 매각 가치 등 정성 분석 필수.
런타임
실행 환경별 호환성
| 환경 | 상태 | 비고 / 제한 |
|---|---|---|
| Local Python | supported | — |
| Server | supported | — |
| MCP | unknown | — |
| Web AI | unknown | — |
| Pyodide | limited |
|