Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PRS-Recon

PRS 공시 완전성 대조 엔진 — 외부 계약 정황과 재무제표 주석을 기계적으로 대조해, 부외부채 성격의 주가수익스왑(PRS)이 주석에서 누락·축소 기재된 정황을 정량 지표로 산출합니다.

Python deps License

2025 교내 경영학부 학술경진대회 최우수상 연구 「주가수익스왑(PRS): 수정된 자본조달순위이론으로 본 한계기업의 자금 조달 행태 연구」 에서 제안한 「사전적 PRS 계약 탐지 알고리즘」을 실제 동작하는 도구로 구현한 것입니다. 원 연구는 유료 데이터 접근 제약으로 시스템을 완전히 구동하지 못했고, 이 저장소가 그 부분을 채웁니다.


1. 왜 필요한가

PRS는 주가 하락 시 회사가 차액을 보전해야 하는 실질적 상환 의무입니다. 그런데 기초자산을 "매각"으로 처리하면 재무상태표에 부채로 나타나지 않습니다. 그 결과:

  • 부채비율은 그대로인데 상환 부담은 실재하는 회계적 착시가 생깁니다.
  • 계약 구조가 회사마다 달라(재매입옵션·자금보충약정·조기정산 트리거) 주석 조건을 따져야 실질이 드러납니다.
  • 지표 방어 유인이 있는 기업일수록 축소 기재할 여지가 있습니다.

감사에서 가장 입증하기 어려운 것이 이런 부외부채의 완전성(completeness) 검증입니다. 기업이 애초에 기재하지 않은 항목은, 기업이 제출한 자료를 아무리 정밀하게 검토해도 드러나지 않기 때문입니다.

2. 착안 — 재량이 낮은 쪽을 기준선으로

검증의 출발점을 기업 제출 자료에서 법정 의무공시로 옮깁니다.

기업의 재량
주요사항보고서 (자산양수도·타법인주식 양도) — 이사회 결의 후 지체 없이 제출 낮음 — 거래 사실 자체를 숨길 수 없음
정기보고서 주석 (파생상품 인식 여부·금액·설명) 높음 — 측정·인식 시점·표시에 판단 개입

재량이 낮은 쪽을 기준(anchor)으로 삼아 재량이 높은 쪽을 검증합니다.

[A. 모집단]                [B. 기준금액 E]           [C. 주석 대조]          [D. 리포트]
주요사항보고서       ──▶   양도금액 추출        ──▶   전수의 파생상품 주석 ──▶  불일치율 순위
list.json (pblntf_ty=B)    + 본문 PRS 정황           최대손실노출액 D         + 원문 발췌
KOSPI · KOSDAQ             정정공시 중복 제거        + 주석 PRS 정황          + DART 링크
자산양도 계열              → 회사별 대표건

주석까지 전수 조사하는 이유. 실제로 2024~2025년 자산양도 계열 주요사항보고서 264건의 본문을 훑어보니, PRS를 명시한 건은 2건뿐이었습니다. PRS 체결 자체가 공시 의무 사항이 아니기 때문입니다 — 원 연구도 롯데케미칼 LCLA 건을 두고 "이러한 공시는 종속회사의 유상증자로 인해 공시한 것으로, PRS로 인한 공시의무가 아니었다"고 지적했습니다. 따라서 PRS의 존재는 주로 주석에서 드러나고, 주요사항보고서는 기업이 숨길 수 없는 기준금액 E를 제공하는 역할을 합니다. 그래서 정황 유무와 무관하게 모집단 전체의 주석을 조회합니다.

3. 지표

E = 주요사항보고서상 조달·양도 금액        (외부 정황 — 재량 낮음)
D = 주석상 PRS 관련 최대손실노출액          (기업 기재 — 재량 높음)
                                            최대노출액 → 파생상품부채 → 미발견 시 0

gap_ratio = clip( (E − D) / E , 0, 1 )
등급 조건 해석
HIGH gap_ratio ≥ 0.7 조달금액의 70% 이상이 주석에서 확인되지 않음
MEDIUM 0.3 ≤ gap_ratio < 0.7 일부 기재되었으나 규모 대비 설명 부족
LOW gap_ratio < 0.3 주석이 계약 규모를 대체로 반영
UNKNOWN E 추출 실패 판단 보류

왜 공정가치가 아니라 최대손실노출액인가. 보고기간말 공정가치는 "지금 정산하면 얼마"일 뿐, 계약이 회사에 지우는 위험의 크기가 아닙니다. 계약 직후에는 0에 가깝습니다 (효성화학은 실제로 "거래 시점 근접성"을 이유로 파생상품부채를 계상하지 않았습니다). 조달금액 E는 손실 노출의 상한에 직접 대응하므로, E와 D의 괴리가 곧 주석만 보는 정보이용자가 인지하지 못하는 위험의 크기입니다.

→ 임계값 근거와 K-IFRS 조문 연결은 docs/methodology.md

4. 실행 결과

조회 기간 2024-01-01 ~ 2025-12-31, 조회 시점 2026-08-12.

단계 결과
A. 모집단 자산양도 계열 주요사항보고서 264건 (KOSPI + KOSDAQ)
→ 정정공시 중복 제거 → 94개사
B~C. 전수 주석 대조 PRS 정황 포착 2개사
D. 위험등급 HIGH 2개사 (효성화학, APS)
회사 등급 불일치율 계약금액 E 주석 노출액 D 근거
효성화학 HIGH 100% 645억원 (주석) 0 20250425000960
APS HIGH 99.8% 1,006억원 (주요사항보고서) 2.3억원 20250310001010

2개사는 적은 숫자이고, 그 자체가 이 연구의 발견입니다. 자산양도 공시를 낸 94개 상장사 중 PRS 흔적이 공시·주석에 남은 곳은 2곳뿐이었습니다. PRS 체결이 공시 의무 사항이 아니어서 대부분 어디에도 드러나지 않는다는 뜻이며, 원 연구가 제기한 정보 비대칭 문제를 데이터로 뒷받침합니다.

효성화학은 주석에 "지분 49%를 64,500백만원에 매각하고 기초자산으로 하여 주가수익스왑 계약 체결" 이라고 적으면서 파생상품부채는 계상하지 않았습니다. 원 연구가 수작업으로 지적한 바로 그 지점을, 도구가 규칙만으로 독립적으로 찾아냈습니다.

산출물은 outputs/ 에 있습니다.

파일 내용
population.csv 모집단 전수 — 정황이 없다고 판정된 기업까지 포함
findings.csv PRS 정황이 포착된 기업의 gap_ratio · 등급
report.md 심사·검토용 요약. HIGH 등급은 원문 발췌와 DART 링크 포함

정황이 없다고 판정한 기업까지 population.csv에 전부 공개합니다. 선별 과정 자체를 검증할 수 있어야 체리피킹이 아님을 보일 수 있기 때문입니다.

5. 재현 방법

키 없이 (동봉된 스냅샷으로 재현)

git clone <이 저장소> && cd PRS_project
python -m pytest tests -q                       # 파싱·지표 로직 25건
PYTHONPATH=src python -m prs_recon run --offline    # 94개사 전수 스캔 재현
PYTHONPATH=src python -m prs_recon cases --offline  # 사례사 10곳 검증 재현

data/snapshot/ 에 264건의 공시 본문과 104개사의 주석 발췌를 gzip으로 동봉했습니다 (5.7MB). 파싱·지표 로직 전체가 이 텍스트 위에서 다시 실행되므로, 규칙을 고쳐가며 결과가 어떻게 달라지는지 API 키 없이 실험할 수 있습니다.

라이브 실행 (DART API 키 필요)

cp .env.example .env        # DART_API_KEY 를 채웁니다 (opendart.fss.or.kr, 무료·즉시 발급)
PYTHONPATH=src python -m prs_recon ping
PYTHONPATH=src python -m prs_recon run --from 20240101 --to 20251231
옵션 설명
--from / --to 조회 기간 (기본 20240101 ~ 20251231)
--offline 스냅샷만 사용, API 키 불필요
--include-piic 유상증자결정까지 모집단에 포함 (건수·오탐 증가)
--limit N 원문 조회 N건으로 제한 (빠른 시험용)

응답은 data/cache/ 에 캐시되므로 재실행 시 네트워크를 다시 타지 않습니다. data/snapshot/ 에는 재현에 필요한 소형 텍스트만 남겨 커밋합니다.

6. 검증 — 연구보고서 사례사 재발견

정답 라벨이 붙은 PRS 계약 목록은 공개적으로 존재하지 않습니다. 그래서 원 연구가 사람이 공시를 읽어 판정한 'PRS 사용 그룹' 10개사를 유일한 대조군으로 씁니다. 목록을 도구에 알려주지 않고, 각 사의 정기보고서 주석만 입력으로 주어 규칙이 같은 결론에 도달하는지 봅니다.

PYTHONPATH=src python -m prs_recon cases --offline

PRS 탐지 6/10개사 · 불일치율 산출 5/10개사 — 전체 표는 outputs/validation.md.

회사 탐지 계약금액 E 주석 노출액 D 불일치율 등급
롯데케미칼 O 6,626억원 128억원 98.1% HIGH
효성화학 O 645억원 0 100.0% HIGH
롯데지주 O 9,000억원 0 100.0% HIGH
넷마블 O 5,235억원 121억원 97.7% HIGH
SK이노베이션 O 추출 실패 5,703억원 - UNKNOWN
CJ ENM O 839억원 691억원 17.6% LOW
한화솔루션 · 이마트 · 에코프로비엠 · LG화학 X - - - -

롯데케미칼 6,626억원은 원 연구가 기술한 "LCLA 지분 40%를 활용한 6,600억원 규모 PRS" 와 일치합니다. 미탐 4개사 중 한화솔루션·LG화학은 원 연구에도 "(예정)" 으로 표기돼 있어, 대조한 2024 사업보고서 시점에는 계약 전이었을 가능성이 있습니다.

이 결과는 재현율의 하한을 보여줄 뿐, 오탐률에 대해서는 아무것도 말해주지 않습니다. 표본이 10개사이고, 그 10개사 자체가 사람의 판단으로 선정된 것입니다.

pytest 25건은 파싱 로직을 실제 공시 원문에 고정합니다 — 서식 항목명 (양도금액(원)(A)), 단위 환산(천원·백만원), 유사계정명 배제 (파생상품부채평가이익파생상품부채), 서식 고정항목 오탐 방지 등.

7. 한계와 책임 범위

이 도구의 출력은 회계부정의 증거가 아닙니다. 감사인이 전문가적 의구심을 발동할 지점을 선별하는 위험평가 보조 지표이며, 결론은 사람이 원문을 확인한 뒤에 내려야 합니다. 그래서 모든 결과에 원문 발췌와 DART 링크를 붙였습니다.

주요 한계 — 주석 서식 차이로 인한 미탐(→ gap_ratio 과대 → 오탐), 단위 오인식, 계약 직후 보고서의 시점 불일치, 모집단(자산양도 계열 주요사항보고서) 밖의 계약, 정밀도·재현율 미측정. 자세한 내용은 docs/limitations.md.

8. 저장소 구조

src/prs_recon/
  rules.py      키워드·가중치·임계값 — 튜닝 파라미터 단일 지점
  dart.py       DART OpenAPI 래퍼 + 디스크 캐시
  parse.py      정황 스코어링, 금액·주석 추출, 불일치율 (순수 함수, 네트워크 없음)
  pipeline.py   A~D 단계 오케스트레이션
  __main__.py   CLI
tests/          파싱 로직 검증 + 픽스처
docs/           방법론 · 한계
data/snapshot/  offline 재현용 텍스트 (커밋)
data/cache/     API 원본 응답 (gitignore)
outputs/        산출물

런타임 의존성이 없습니다. 표준 라이브러리(urllib, zipfile, gzip, csv, re)만 사용합니다. 외부 패키지 설치가 제한되는 감사 환경을 고려한 설계입니다. pytest는 테스트에만 필요합니다.

사용한 DART OpenAPI

엔드포인트 용도
/api/list.json 공시 검색 (pblntf_ty=B 주요사항보고, A 정기공시)
/api/document.xml 공시서류 원본 (ZIP → XML) — 주석 본문에 접근하는 유일한 경로

타법인주식 양도결정에는 정형 API가 없어 list.jsonreport_nm 필터 + document.xml 본문 파싱으로 처리합니다.

라이선스

MIT — LICENSE

About

자산양도 공시와 파생상품 주석을 대조해 주가수익스왑(PRS)의 주석 누락·축소 기재 정황을 불일치율로 뽑는 감사 보조 도구

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages