이 스킬
배당성향 vs FCF 커버리지 z-score
회사의 배당성향 (Dividends / Net Income) 과 FCF 커버리지 (Dividends / FCF) 두 축의 trailing 5y baseline 대비 z-score 를 동시에 본다. EPS 기준 payout 은 정상인데 FCF 기준이 무너진 row 가 *회계이익↔현금* 괴리 신호. analysis 단일축. 트리거 — '배당 FCF 커버리지', 'payout sustainable', '배당 갭'.
연계 절차
이 절차의 단계
- 1 recipes.fundamental.dividend.capitalReturn
recipes.fundamental.dividend.capitalReturn환원 thesis 진입.
- 2 recipes.fundamental.dividend.stressTest
recipes.fundamental.dividend.stressTest매크로 침체 시 커버리지 무너지는 임계.
- 3 Revenue To Cash Bridge
recipes.fundamental.quality.forensics.revenueToCashBridge회계이익↔현금 괴리 깊이.
절차
실행 순서
- 1
Company.analysis('capitalAllocation') 연도별 (dividends_paid + net_income + free_cash_flow)
- 2
payoutNi = dividends / netIncome
- 3
payoutFcf = dividends / FCF (= OCF - capex)
- 4
trailing baseline (직전 4 년) 평균 + std → 최신 z-score 2 종
- 5
baseline 표본 < 3 년이면 z-score 계산 무의미 — coverage 한계 명시.
- 6
payoutFcf > 1 단독으로 "cut 위험" 단정 X — 차입 + 자본구조 조정 동반 가능.
- 7
일회성 손익 (감액손실 / 처분이익) 으로 NI 튄 연도는 baseline 분리.
- 8
capex lump-sum 산업 (유통 부동산) 에서 단년 FCF noise 를 z 신호로 오인.
- 9
gap > +1.0 → `recipes.fundamental.quality.forensics.revenueToCashBridge` 로 회계↔현금 괴리 깊이.
- 10
payoutFcf > 1 + zFcf > +2 → `recipes.fundamental.dividend.stressTest` 로 매크로 침체 시 cut 임계.
- 11
일관 zNi + zFcf ≥ 0 → `recipes.fundamental.dividend.capitalReturn` 으로 환원 thesis 진입.
- 12
baseline 표본 < 3 년이면 z-score 계산 안 함, 한계로 명시.
예시
이런 질문이 들어오면 이 skill 을 쓴다
- 005930 5년 payoutNI vs payoutFcf z-score
- 회계이익은 견조하나 FCF 커버리지 깨진 종목
출력
기대 결과
- 연도별 payoutNI / payoutFcf 표
- trailing 5y baseline z-score 2 종
- 두 z-score 갭 신호
공개 호출 방식
import dartlab
import polars as pl
target = "005930"
c = dartlab.Company(target)
try:
rows = c.analysis("capitalAllocation").to_dicts()
except Exception:
rows = []
audit = []
for r in rows:
div = abs(float(r.get("dividends_paid") or r.get("dividendsPaid") or 0))
ni = float(r.get("net_income") or r.get("netIncome") or 0)
fcf = float(r.get("free_cash_flow") or r.get("freeCashFlow") or 0)
audit.append({
"year": r.get("year") or r.get("period"),
"dividends": div,
"netIncome": ni,
"fcf": fcf,
"payoutNi": (div / ni) if ni else None,
"payoutFcf": (div / fcf) if fcf else None,
})
table = pl.DataFrame(audit) if audit else pl.DataFrame(
schema={"year": pl.Utf8, "dividends": pl.Float64, "netIncome": pl.Float64,
"fcf": pl.Float64, "payoutNi": pl.Float64, "payoutFcf": pl.Float64}
)
def z_last(col):
series = table[col].drop_nulls()
if series.len() < 3:
return None
mean = float(series.head(series.len()-1).mean()) if series.len() > 1 else None
std = float(series.head(series.len()-1).std()) if series.len() > 2 else None
cur = float(series.tail(1)[0])
if std is None or std == 0 or mean is None:
return None
return (cur - mean) / std
z_ni = z_last("payoutNi")
z_fcf = z_last("payoutFcf")
emit_result(
table=table,
values={"zNi": z_ni, "zFcf": z_fcf, "gap": (z_fcf - z_ni) if (z_ni is not None and z_fcf is not None) else None},
date=str(table["year"].max()) if table.height else None,
sources=["dartlab://analysis/capitalAllocation"],
) 호출 동작
1. 결론 도출
zNi + zFcf gap 단정. 예: “최근 5y baseline payoutNi 평균 0.28 / std 0.05 → 최신 0.32 → zNi = +0.8. payoutFcf 평균 0.45 / std 0.08 → 최신 0.68 → zFcf = +2.9. gap = +2.1 → 회계이익 기준 정상이나 현금 기준 부담 가중 (z 갭 ≥ 1.0 — 회계이익↔현금 괴리 의심).”
2. 핵심 근거 수집
- Company.analysis(‘capitalAllocation’) 연도별 (dividends_paid + net_income + free_cash_flow)
- payoutNi = dividends / netIncome
- payoutFcf = dividends / FCF (= OCF - capex)
- trailing baseline (직전 4 년) 평균 + std → 최신 z-score 2 종
3. 메커니즘 분석
연도별 → 2 ratio
payoutNi = dividends / netIncome (EPS 기준)
payoutFcf = dividends / FCF (현금 기준)
↓
최근 연도 z-score:
zNi = (payoutNi[-1] - mean(payoutNi[:-1])) / std
zFcf = (payoutFcf[-1] - mean(payoutFcf[:-1])) / std
↓
gap = zFcf - zNi
gap > +1.0 → EPS 정상 / 현금 압박 (FCF 약화 또는 capex 가속)
|gap| < 1.0 → 동조 (EPS+FCF 같은 방향)
gap < -1.0 → EPS 약화 / 현금 정상 (NI 일회성 하향)
↓
배당 sustainability:
payoutFcf > 1.0 + zFcf > +2 → cut 위험 후보 (단, 자본구조 조정 분리 필요)
gap 큼 + |zFcf| > 2 → forensics 후속 (회계↔현금 괴리) EPS 기준만 보면 못 보는 현금 기준 배당 부담 을 z-score 로 본다. NI 가 일회성 손익으로 튀면 zNi 만 깨지고 zFcf 는 정상 — 분리 필요.
4. 반례·한계
- baseline 표본 < 3 년이면 z-score 계산 무의미 — coverage 한계 명시.
- payoutFcf > 1 단독으로 “cut 위험” 단정 X — 차입 + 자본구조 조정 동반 가능.
- 일회성 손익 (감액손실 / 처분이익) 으로 NI 튄 연도는 baseline 분리.
- capex lump-sum 산업 (유통 부동산) 에서 단년 FCF noise 를 z 신호로 오인.
5. 후속 모니터링
- gap > +1.0 →
recipes.fundamental.quality.forensics.revenueToCashBridge로 회계↔현금 괴리 깊이. - payoutFcf > 1 + zFcf > +2 →
recipes.fundamental.dividend.stressTest로 매크로 침체 시 cut 임계. - 일관 zNi + zFcf ≥ 0 →
recipes.fundamental.dividend.capitalReturn으로 환원 thesis 진입.
대표 반환 형태
| column | 의미 |
|---|---|
year | 결산 연도 |
dividends | 배당총액 |
netIncome | 순이익 |
fcf | FCF (OCF - capex) |
payoutNi | 배당 / NI |
payoutFcf | 배당 / FCF |
연계 절차
- recipes.fundamental.dividend.capitalReturn - 환원 thesis 진입.
- recipes.fundamental.dividend.stressTest - 매크로 침체 시 커버리지 무너지는 임계.
- recipes.fundamental.quality.forensics.revenueToCashBridge - 회계이익↔현금 괴리 깊이.
기본 검증
- baseline 표본 < 3 년이면 z-score 계산 안 함, 한계로 명시.
- payoutFcf > 1 단독으로 “cut 위험” 단정 금지 — 자본구조 조정 동반 가능.
- 일회성 손익 (
oneOffAdjustment메모 동행) 으로 NI 튄 연도는 baseline 분리.
런타임
실행 환경별 호환성
| 환경 | 상태 | 비고 / 제한 |
|---|---|---|
| Local Python | supported | · |
| Server | supported | · |
| MCP | supported | · |
| Web AI | limited | · |
| Pyodide | limited | · |
실패 회피
흔한 실패 · 절대 금지
- 일회성 손익으로 NI 가 튄 연도를 baseline 에 그대로 포함
- FCF 계산식 (OCF - capex) 변형으로 비교 시점간 일관성 깨짐
- 유통 부동산) 에서 단년 노이즈를 신호로 오인
- 단일 연도 z-score 로 배당 cut 결론
- payoutFcf > 1 자체를 컷 위험 단정 (M&A·자본구조 조정 동반 가능)