recipes.fundamental.governance.chaebolEntityNetwork Recipes Recipe curated

재벌 계열사 망 (지분율·이사 동시재직)

한국 재벌 그룹 안 회사들의 지분율 cross-holding + 임원/이사 동시재직 (interlocking directorate) network 매핑. 지주사·순환출자·차등의결권의 정량 진입점. governance ↔ scan 결합. 트리거 — '재벌 계열사 망 (지분율·이사 동시재직)', 'chaebol entity network', 'chaebolEntityNetwork'.

이 스킬

재벌 계열사 망 (지분율·이사 동시재직)

한국 재벌 그룹 안 회사들의 지분율 cross-holding + 임원/이사 동시재직 (interlocking directorate) network 매핑. 지주사·순환출자·차등의결권의 정량 진입점. governance ↔ scan 결합. 트리거 — '재벌 계열사 망 (지분율·이사 동시재직)', 'chaebol entity network', 'chaebolEntityNetwork'.

Recipes curated recipes.fundamental.governance.chaebolEntityNetwork

연계 절차

이 절차의 단계

  1. 1
    지분율 괴리도·순환출자·차등의결권 진단 recipes.fundamental.quality.forensics.ownershipDisparityMap

    지배지분 vs 의결지분 괴리.

  2. 2
    실질지배력·연결범위·방어권 판단 진단 (IFRS 10) recipes.fundamental.quality.forensics.controllingPowerJudgment

    실질지배력 판정.

  3. 3
    recipes.fundamental.governance.audit recipes.fundamental.governance.audit

    거버넌스 종합.

절차

실행 순서

  1. 1

    Company.panel('groupAffiliation') → groupName 식별

  2. 2

    `dartlab.scan("network")` → dict (corp_edges · invest_edges · code_to_group · cycles). 출자 사슬과 계열 관계

  3. 3

    각 affiliate × (ownershipPct + reverseOwnershipPct + sharedDirectorCount) 3 metric

  4. 4

    crossHolding = outwardPct > 0 AND inwardPct > 0

  5. 5

    그룹 식별 reference 누락 회사 (비재벌·소규모) 비적용.

  6. 6

    공정위 그룹 ≠ IFRS 연결범위 → 분리 표기 필수.

  7. 7

    순환출자 자체 위법 X (2014 이후 신규만 금지) — *의심 후보* 표기.

  8. 8

    우회 cross-holding (재단/사모펀드 경유) → 미커버.

  9. 9

    crossHolding 3+ → `recipes.fundamental.quality.forensics.ownershipDisparityMap` 으로 지배 vs 의결 괴리.

  10. 10

    sharedDirectors 평균 ≥ 2 → `recipes.fundamental.governance.boardIndependenceTrend` 로 이사회 multiSeat 추세.

  11. 11

    outward 단방향 큼 (지주사 의심) → `recipes.fundamental.quality.forensics.controllingPowerJudgment` 로 실질지배력 판정.

  12. 12

    그룹 식별 reference 누락 회사 (비재벌·소규모) 는 본 recipe 비적용.

예시

이런 질문이 들어오면 이 skill 을 쓴다

  • 삼성 그룹 계열사 망 지분율 cross-holding
  • 재벌 그룹 안 임원 동시재직 (interlocking)
  • 005930 속한 그룹 지주사 / 순환출자 구조

출력

기대 결과

  • 그룹 안 회사 list + 지분율 cross-holding 표
  • interlocking directorate 카운트 (회사 × 임원)
  • 지주사 / 순환출자 / 차등의결권 라벨 (구조 분류)

공개 호출 방식

import dartlab
import polars as pl

target = "005930"
c = dartlab.Company(target)

# 그룹 식별 (reference)
try:
    group_info = c.panel("groupAffiliation").to_dicts()
    group_name = group_info[0].get("groupName") if group_info else None
except Exception:
    group_name = None

try:
    net = dartlab.scan("network")   # dict: corp_edges · code_to_group · invest_edges
    affiliates = net["corp_edges"] if group_name else []
except Exception:
    affiliates = []

# 각 affiliate 와 cross-holding 비율
network = []
for a in affiliates[:15]:
    code = a.get("code") or a.get("stockCode")
    if not code:
        continue
    holding = float(a.get("ownershipPct") or 0)  # target → affiliate
    reverse = float(a.get("reverseOwnershipPct") or 0)  # affiliate → target
    shared_directors = int(a.get("sharedDirectorCount") or 0)
    network.append({
        "affiliate": code,
        "name": a.get("name"),
        "outwardPct": holding,
        "inwardPct": reverse,
        "crossHolding": holding > 0 and reverse > 0,
        "sharedDirectors": shared_directors,
    })

table = pl.DataFrame(network) if network else pl.DataFrame(
    schema={"affiliate": pl.Utf8, "name": pl.Utf8, "outwardPct": pl.Float64,
            "inwardPct": pl.Float64, "crossHolding": pl.Boolean, "sharedDirectors": pl.Int64}
)

cross_n = int(table["crossHolding"].sum()) if table.height else 0
emit_result(
    table=table,
    values={"groupName": group_name, "affiliates": table.height, "crossHoldings": cross_n},
    date=None,
    sources=["dartlab://show/groupAffiliation", "dartlab://scan/groupAffiliates"],
)

호출 동작

1. 결론 도출

그룹 affiliate × crossHolding × sharedDirectors 단정. 예: “005930 그룹=‘삼성’ / affiliates=15 / crossHoldings=3 (양방향 지분 동시 보유 — 005930↔028260, 005930↔010140 등) / 평균 sharedDirectors=1.2 / 최대 sharedDirectors=4 (특정 계열사 임원 중첩) → cross 구조 + 임원 network 동조 — 그룹 결속력 강.”

2. 핵심 근거 수집

  • Company.panel(‘groupAffiliation’) → groupName 식별
  • dartlab.scan("network") → dict (corp_edges · invest_edges · code_to_group · cycles). 출자 사슬과 계열 관계
  • 각 affiliate × (ownershipPct + reverseOwnershipPct + sharedDirectorCount) 3 metric
  • crossHolding = outwardPct > 0 AND inwardPct > 0

3. 메커니즘 분석

그룹 universe (≤ 15 affiliate) → 3 metric 매트릭스
   outwardPct (target → affiliate)
   inwardPct  (affiliate → target)
   sharedDirectors (공유 이사 수)

crossHolding 카운트:
   crossHolding True 다수 → 순환출자 구조 의심 (2014 개정 이후 신규는 위법)
   sharedDirectors 평균 ≥ 2 → interlocking directorate 강
   outward 큼 + inward 0 → 단방향 지배 (지주사 구조)
   outward 0 + inward 큼 → 단방향 피지배

구조 분류:
   지주사    → 1 affiliate 가 다수 outward (peak 30%+)
   순환출자  → cross 3+ (예: A→B→C→A)
   차등의결권 → 별 metric (본 recipe 미커버)

KR 재벌 — 공정거래위원회 발표 그룹 (대규모기업집단 = 자산 5조+). IFRS 연결범위 ≠ 공정위 그룹 (지배구조 vs 회계 기준 차이).

4. 반례·한계

  • 그룹 식별 reference 누락 회사 (비재벌·소규모) 비적용.
  • 공정위 그룹 ≠ IFRS 연결범위 → 분리 표기 필수.
  • 순환출자 자체 위법 X (2014 이후 신규만 금지) — 의심 후보 표기.
  • 우회 cross-holding (재단/사모펀드 경유) → 미커버.

5. 후속 모니터링

  • crossHolding 3+ → recipes.fundamental.quality.forensics.ownershipDisparityMap 으로 지배 vs 의결 괴리.
  • sharedDirectors 평균 ≥ 2 → recipes.fundamental.governance.boardIndependenceTrend 로 이사회 multiSeat 추세.
  • outward 단방향 큼 (지주사 의심) → recipes.fundamental.quality.forensics.controllingPowerJudgment 로 실질지배력 판정.

대표 반환 형태

column의미
affiliate계열사 코드
outwardPct본 회사 → 계열사 지분율
inwardPct계열사 → 본 회사 지분율
crossHolding양방향 지분 동시 보유
sharedDirectors공유 이사 수

연계 절차

  1. recipes.fundamental.quality.forensics.ownershipDisparityMap - 지배지분 vs 의결지분 괴리.
  2. recipes.fundamental.quality.forensics.controllingPowerJudgment - 실질지배력 판정.
  3. recipes.fundamental.governance.audit - 거버넌스 종합.

기본 검증

  • 그룹 식별 reference 누락 회사 (비재벌·소규모) 는 본 recipe 비적용.
  • 공정거래위원회 발표 그룹과 IFRS 연결범위 불일치 가능 — 분리 표기.
  • 순환출자 자체가 위법 X (2014 개정 이후 신규만 금지) — 의심 후보 표기.

런타임

실행 환경별 호환성

환경상태비고 / 제한
Local Python supported·
Server supported·
MCP supported·
Web AI limited·
Pyodide limited·