이 스킬
매출 상위 고객 / 매입 상위 거래처 비중 (HHI 기반)
회사의 매출 상위 5 고객 비중 + 매입 상위 5 거래처 비중을 HHI (Herfindahl) 로 정량화. 단일 큰 고객 의존 = 가격 협상력 약화·credit 리스크 누적. 사업보고서 본문 (특수관계자 거래·주요고객) raw 가 들어와야. analysis 단일축. 트리거 — '매출 상위 고객 / 매입 상위 거래처 비중 (HHI 기반)', 'supply chain concentration', 'supplyChainConcentration'.
연계 절차
이 절차의 단계
- 1 산업 단계 매핑 — ROIC-WACC spread 분포로 phase 판정
recipes.industry.industryStagePhasemature phase 의 집중도 비교.
- 2 recipes.fundamental.credit.distressCandidateScreen
recipes.fundamental.credit.distressCandidateScreenHHI > 2500 → credit 신호 가중.
- 3 Filing Note Signal Extractor
recipes.fundamental.quality.forensics.noteSignalExtractor특수관계자 매출 분리.
절차
실행 순서
- 1
Company.gather('majorCustomers') 사업보고서 본문 — 상위 고객 sharePct
- 2
Company.gather('majorSuppliers') 사업보고서 본문 — 상위 거래처 sharePct
- 3
각 metric × 상위 5 × HHI = sum(s_i^2) (0-10000 scale)
- 4
B2C 소매 (롯데쇼핑 등) 회사는 사업보고서에 고객 명시 안 됨 — 본 recipe 비적용.
- 5
5 미만만 명시 시 HHI 상향 편향 — top 3 / top 5 분리.
- 6
특수관계자 매출과 일반 고객 매출 혼합 — 별도 분리 필요 (RPT recipe 와 cross).
- 7
HHI 시점 단일 — 추세 (연도별) 분리 시 변동성 신호 추가.
- 8
custHhi > 2500 → `recipes.fundamental.credit.distressCandidateScreen` 으로 credit 신호 가중.
- 9
suppHhi > 2500 → `recipes.industry.peerCapexWave` 로 공급망 capex 추세 점검.
- 10
특수관계자 매출 큼 → `recipes.fundamental.quality.forensics.noteSignalExtractor` 로 주석 본문 분리.
- 11
사업보고서 raw 없는 회사 (B2C 소매·다수 소비자) 는 본 recipe 비적용.
- 12
5 미만 거래처만 명시된 경우 HHI 상향 편향 — top 3 / top 5 분리 표기.
예시
이런 질문이 들어오면 이 skill 을 쓴다
- 005930 매출 상위 고객 의존도가 얼마
- 단일 고객 매출 비중 50% 넘는 종목
- 매출 / 매입 HHI 정량 — 가격 협상력 약화 신호
출력
기대 결과
- 매출 top 5 고객 비중 + HHI 단일값 (0-1)
- 매입 top 5 거래처 비중 + HHI 단일값
- 사업보고서 출처 (특수관계자 거래·주요고객 본문 ref)
공개 호출 방식
import dartlab
import polars as pl
target = "005930"
c = dartlab.Company(target)
def hhi(shares):
"""shares = list of share % (sum ≤ 100). HHI = sum(s_i^2). 0 ~ 10000."""
return sum(s * s for s in shares)
# 사업보고서 본문에서 추출된 raw 가정 — 실제 API: c.gather('majorCustomers') 또는 disclosure parse
try:
cust_rows = c.gather("majorCustomers").to_dicts()
except Exception:
cust_rows = []
try:
supp_rows = c.gather("majorSuppliers").to_dicts()
except Exception:
supp_rows = []
def top_shares(rows, n=5):
rows_sorted = sorted(rows, key=lambda r: -float(r.get("sharePct") or 0))[:n]
return [float(r.get("sharePct") or 0) for r in rows_sorted]
cust_top = top_shares(cust_rows)
supp_top = top_shares(supp_rows)
table = pl.DataFrame([{
"metric": "customers",
"topShares": str(cust_top),
"hhi": hhi(cust_top),
"topCount": len(cust_rows),
}, {
"metric": "suppliers",
"topShares": str(supp_top),
"hhi": hhi(supp_top),
"topCount": len(supp_rows),
}])
emit_result(
table=table,
values={"custHhi": hhi(cust_top), "suppHhi": hhi(supp_top)},
date=None,
sources=["dartlab://gather/majorCustomers", "dartlab://gather/majorSuppliers"],
) 호출 동작
1. 결론 도출
custHhi + suppHhi 집중도 단정. 예: “005930 매출 top5 (HHI 1840 — 보통 집중) → 상위 1 고객 25% / 상위 5 합 62%. 매입 top5 (HHI 3200 — 고도 집중) → 단일 거래처 40% (반도체 장비 의존). 매입 측 협상력 약화 + 공급망 리스크 신호.”
2. 핵심 근거 수집
- Company.gather(‘majorCustomers’) 사업보고서 본문 — 상위 고객 sharePct
- Company.gather(‘majorSuppliers’) 사업보고서 본문 — 상위 거래처 sharePct
- 각 metric × 상위 5 × HHI = sum(s_i^2) (0-10000 scale)
3. 메커니즘 분석
2 시리즈 (customers + suppliers) → 각 HHI
상위 5 (또는 명시 개수) 의 share % 추출
HHI = sum(s_i^2)
↓
임계 (산업조직 기준):
HHI < 1500 → 분산 (가격 협상력 균형)
HHI 1500-2500 → 보통 집중
HHI > 2500 → 고도 집중 (단일 의존 리스크)
↓
customer + supplier 결합:
custHhi 높음 → 매출 단일 의존 (고객 credit risk + 가격 협상력 약)
suppHhi 높음 → 매입 단일 의존 (cost 협상력 약 + 공급 중단 리스크)
둘 다 높음 → 양면 협상력 약 (mature phase + 자체 brand 약) 매출 단일 고객 50%+ = 그 고객 사정 (재고조정 / 단가인하 / 거래중단) 이 회사 실적 직접 직격. 매입 단일 거래처 50%+ = 공급 중단 시 즉시 생산 중단.
4. 반례·한계
- B2C 소매 (롯데쇼핑 등) 회사는 사업보고서에 고객 명시 안 됨 — 본 recipe 비적용.
- 5 미만만 명시 시 HHI 상향 편향 — top 3 / top 5 분리.
- 특수관계자 매출과 일반 고객 매출 혼합 — 별도 분리 필요 (RPT recipe 와 cross).
- HHI 시점 단일 — 추세 (연도별) 분리 시 변동성 신호 추가.
5. 후속 모니터링
- custHhi > 2500 →
recipes.fundamental.credit.distressCandidateScreen으로 credit 신호 가중. - suppHhi > 2500 →
recipes.industry.peerCapexWave로 공급망 capex 추세 점검. - 특수관계자 매출 큼 →
recipes.fundamental.quality.forensics.noteSignalExtractor로 주석 본문 분리.
대표 반환 형태
| column | 의미 |
|---|---|
metric | customers / suppliers |
topShares | 상위 5 의 share% list |
hhi | Herfindahl 지수 |
topCount | 사업보고서 명시 거래처 수 |
연계 절차
- recipes.industry.industryStagePhase - mature phase 의 집중도 비교.
- recipes.fundamental.credit.distressCandidateScreen - HHI > 2500 → credit 신호 가중.
- recipes.fundamental.quality.forensics.noteSignalExtractor - 특수관계자 매출 분리.
기본 검증
- 사업보고서 raw 없는 회사 (B2C 소매·다수 소비자) 는 본 recipe 비적용.
- 5 미만 거래처만 명시된 경우 HHI 상향 편향 — top 3 / top 5 분리 표기.
- 특수관계자 거래는 별도 분리 — 일반 고객 HHI 와 섞지 않는다.
런타임
실행 환경별 호환성
| 환경 | 상태 | 비고 / 제한 |
|---|---|---|
| Local Python | supported | · |
| Server | supported | · |
| MCP | supported | · |
| Web AI | limited | · |
| Pyodide | limited | · |