Skip to content

Commit ffc969f

Browse files
committed
fix: audit 2차 — 유동성 위기 추가 조건 + CCC 마이너스 경고 제거 + 감가상각 이상치 필터
1. 유동성 위기: 이자보상 > 5배이면 "위기" → "주의"로 하향 (코웨이 등) 2. CCC 마이너스: 경고 제거 — 선수금/매입채무 우위는 운전자본 효율 3. 감가상각: 중앙값 대비 100배 이상 차이나면 스케일 이상치로 판단하여 제거
1 parent 227c21f commit ffc969f

2 files changed

Lines changed: 14 additions & 2 deletions

File tree

src/dartlab/analysis/financial/asset.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,13 +426,22 @@ def calcCapexPattern(company, *, basePeriod: str | None = None) -> dict | None:
426426
history = []
427427
latest = None
428428

429+
# 감가상각 이상치 필터용 중앙값 사전 계산
430+
_rawDeps = [abs(_get(depRow, c)) for c in yCols]
431+
_validDeps = [d for d in _rawDeps if d > 0]
432+
_depMedian = sorted(_validDeps)[len(_validDeps) // 2] if _validDeps else 0
433+
429434
for col in yCols:
430435
cip = _get(cipRow, col)
431436
ppe = _get(ppeRow, col)
432437
ta = _get(taRow, col)
433438
# CAPEX는 CF에서 음수로 나옴 → abs
434439
capex = abs(_get(capexRow, col)) + abs(_get(intCapexRow, col))
435440
dep = abs(_get(depRow, col))
441+
# 이상치 필터: 중앙값 대비 100배 이상 차이나면 스케일 오류로 판단
442+
if dep > 0 and _depMedian > 0:
443+
if dep / _depMedian > 100 or _depMedian / dep > 100:
444+
dep = 0 # 이상치 제거 → 아래 fallback으로 추정
436445
# 3순위 fallback: 감가상각 null이면 유형자산/10으로 추정
437446
if dep == 0 and ppe is not None and ppe > 0:
438447
dep = ppe / 10 # 평균 내용연수 10년 가정
@@ -501,8 +510,8 @@ def calcAssetFlags(company, *, basePeriod: str | None = None) -> list[str]:
501510
ccc = wc["latest"]["ccc"]
502511
if ccc > 120:
503512
flags.append(f"CCC {ccc:.0f}일 — 현금 회수 매우 느림")
504-
elif ccc < 0:
505-
flags.append(f"CCC {ccc:.0f}일 — 마이너스 CCC (선수금/매입채무 우위)")
513+
# CCC < 0은 선수금/매입채무 우위로 운전자본 효율적 → 경고 아닌 정보
514+
# efficiency.py의 "운전자본 유리 구조"로 충분
506515

507516
capex = calcCapexPattern(company, basePeriod=basePeriod)
508517
if capex and capex["latest"]["capexToDepRatio"] is not None:

src/dartlab/analysis/financial/capital.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,9 @@ def calcCapitalFlags(company, *, basePeriod: str | None = None) -> list[tuple[st
754754
if isNetCash:
755755
# 순현금이면 유동비율 낮아도 실질 유동성 위험 낮음 (IFRS16 리스부채 등)
756756
flags.append((f"유동비율 주의 ({cr:.0f}%) — 순현금이므로 실질 위험 낮음", "warning"))
757+
elif ic is not None and ic > 5:
758+
# 이자보상배율 양호하면 실질 유동성 위험 낮음
759+
flags.append((f"유동비율 주의 ({cr:.0f}%) — 이자보상 {ic:.0f}배로 양호", "warning"))
757760
else:
758761
flags.append((f"유동성 위기 (유동비율 {cr:.0f}%)", "warning"))
759762

0 commit comments

Comments
 (0)