1998년 봄, 코넬 대학 MBA 과정의 6명의 학생이 엔론의 재무제표에 단 하나의 공식을 적용했고, 결과는 -1.89가 나왔습니다.
"이 회사가 분식회계를 하고 있을 가능성이 높다"는 기준점은 -2.22입니다. 엔론은 이미 그 기준치를 넘어섰습니다. 게다가 이들은 일류 법정 회계 감정 기관이 아닌, 그저 학생들이었습니다.

그들은 이 보고서를 학교 웹사이트에 게시했습니다. 당시 월가의 거의 모든 곳은 엔론을 매수 등급으로 평가하고 있었고, 주가가 0이 되기 몇 주 전까지 대부분 그 등급을 유지했습니다.
이것은 누구나 확인할 수 있는 공시 서류였고, 손으로 계산해도 20분이면 끝나는 단 하나의 공식이었습니다. 제가 지금부터 알려드릴 내용이 바로 이것입니다. 단, 여러분은 몇 초 만에 실행할 수 있고 전 세계의 어떤 회사나 토큰에도 적용할 수 있다는 점이 다릅니다.
투자 조언이 아니며, 직접 조사하세요. 법정 감사 점수는 확실한 증거가 아닌 확률적 지표이며, 여기 언급된 모든 가격은 변동될 수 있으니 투자 전에 반드시 확인하세요. 저는 전문 예측 시장 트레이더를 위한 도구를 만듭니다 @coldvisionXYZ*
레벨 0: 데이터 창고
미국의 모든 상장 기업은 SEC에 서류를 제출하며, SEC는 이 서류를 EDGAR라는 API를 통해 그대로 제공합니다. URL에 접속하면 해당 기업이 보고한 모든 숫자를 이미 구조화된 형태로 받을 수 있습니다.
EDGAR를 강력한 도구로 만드는 2가지 이유:
- 전문 검색(Full text search). 제출된 모든 서류의 실제 텍스트를 색인화하므로, "중요한 취약점(material weakness)"과 같은 구문을 시장 전체에서 검색하여 조용히 내부 통계 시스템에 문제가 있음을 인정한 모든 기업을 즉시 찾아낼 수 있습니다. 말 그대로 1초 만에 공매도 관심 종목 리스트를 만드는 셈입니다.
- 구조화된 재무 데이터. 모든 항목, 모든 분기별 데이터를 기계가 읽을 수 있는 형태로 수년간 제공합니다.
edgartools가 바로 여러분이 원하는 도구입니다.

Pip install만 하면 되고, API 키도 필요 없으며, 10-K, 8-K, 내부자 Form 4, 13F 펀드 보유 현황 등 모든 것을 깔끔한 Python 객체로 파싱해줍니다.
MCP 서버도 함께 제공되므로, Claude에 바로 연결하여 "애플과 마이크로소프트의 3년간 매출 성장률을 비교해줘"라고 요청하면, 실제 서류를 가져와서 분석해주고 그럴듯한 숫자를 지어내지 않습니다.
sec-edgar-downloader는 대부분의 사람들이 가장 먼저 찾는 도구입니다. 단지 원본 서류를 다운로드하여 직접 파싱해야 하는 HTML 더미를 던져줄 뿐입니다. 몇 년 전에는 유용했지만, 지금은 그냥 불편할 뿐입니다. edgartools를 사용하세요.*
BamSEC은 1998년 스타일의 EDGAR 인터페이스 없이 서류를 읽고 싶을 때 좋습니다. 깔끔한 리더, 나란히 비교 기능을 제공하며, 대부분의 용도에 무료로 사용할 수 있습니다. 눈으로 확인할 때 유용합니다.

이제 여러분은 모든 상장 기업의 재무제표에 무료로 구조화된 접근이 가능해졌습니다.
레벨 1 - 거짓말쟁이를 잡아내기
이제 숫자가 있습니다. 경영진의 "혁신적인 한 해"라는 말을 단 한 줄이라도 읽기 전에, 먼저 원시 데이터에 몇 가지 공식을 적용합니다.
학계에서는 수십 년간의 실제 사기 사례를 바탕으로 이 공식들을 만들었습니다. 여러분은 각 공식이 무엇을 찾아내는지 알기만 하면 됩니다.
Beneish M-Score가 바로 엔론 사건에 사용된 그 공식입니다.
8개의 입력값이 하나의 숫자로 압축됩니다. 가장 큰 비중을 차지하는 입력값은 총자산 대비 총 발생액으로, 수익을 조작하는 가장 빠른 방법은 현금으로 실현되지 않은 수익을 계상하는 것이기 때문입니다. 다음으로는 지나치게 깔끔한 매출 성장률이며, 이것이 바로 엔론에서 경고등이 켜진 지표입니다. -2.22를 넘으면 조사에 착수해야 합니다. 엔론의 점수는 -1.89였습니다.

Altman Z-Score는 파산 위험을 읽는 지표입니다.
수익성, 레버리지, 자산 효율성을 결합하여 하나의 부실 점수로 나타냅니다. 1.81 미만이 위험 구간입니다.

Sloan 발생액 비율(Sloan accruals ratio)은 수익 품질을 측정합니다.
현금으로 실현된 수익은 진짜이지만, 발생액으로 계상된 수익은 결국 역전됩니다. 약 25% 이상 벗어나면, 수익은 기본적으로 회계상의 신기루이며 곧 사라질 것입니다.

Piotroski F-Score는 9가지 예/아니오 질문을 통해 회사가 실제로 재무적으로 강화되고 있는지를 평가합니다. 6점 이상이면 건전한 상태입니다.

이것을 단순한 숙제가 아닌 업무 흐름으로 만드는 핵심은, 위의 4가지 지표를 관심 종목 전체에 한 번에 적용하고 경고가 뜨는 종목의 이름만 읽는 것입니다. 아래 스크립트가 바로 그 역할을 합니다.
그리고 아무 블로그에서 본 공식을 그대로 구현하지 마세요. GitHub에 있는 M-Score 코드의 절반은 미묘하게 틀려 있습니다.
FinanceToolkit 저장소에는 150개 이상의 지표(Beneish, Altman, Piotroski, Sloan 등)가 있으며, 공식이 투명하게 공개되어 있어 결과가 의심스러울 때 직접 검증할 수 있습니다.
FMP 키와 함께 사용하면 준비 끝입니다. 솔직히 말해서, 가장 과소평가된 금융 관련 저장소 중 하나이며, 투명하고 꾸준히 관리되고 있습니다.

Beneish M-Score는 작년 데이터를 기반으로 실행되므로, 여러분이 결과를 볼 때쯤이면 이미 조작이 해소되고 있을 수도 있습니다. 또한 실제 사기를 놓치거나, 건전한 기업에 오경보를 울리기도 합니다. 낮은 점수는 서류를 열어보라는 신호일 뿐입니다. 단독으로 공매도를 결정할 근거가 되어서는 안 됩니다.
레벨 2: AI가 대신 문서를 읽게 하기
스크리닝을 했고, 어떤 항목에 경고가 떴습니다. 이제 10-K 서류를 열어볼 차례인데, 이는 읽기 어렵게 의도적으로 작성된 100페이지가 넘는 법률 용어의 향연입니다.
이 작업은 AI에게 맡기세요.
잘못된 방법은:
전체 서류를 채팅창에 붙여넣고 "이 회사 좋은 회사야?"라고 묻는 것입니다. AI는 압도당하고 여러분이 듣고 싶은 대답을 할 것입니다.
올바른 방법은:
올해 서류와 작년 서류를 비교(diff)하도록 요청하는 것입니다.
올해 10-K와 작년 10-K에서 위험 요소(Risk Factors) 섹션만 추출하여 모델에 전달하고 단 하나의 임무를 부여하세요.
올해 새로 추가된 내용이나 삭제된 내용만 알려주고, 새로운 문구를 인용하며, 양쪽에 공통으로 있는 판에 박힌 문장은 무시하라고 말입니다.
고객 집중도에 관한 문단을 조용히 추가한 회사는 주요 고객이 흔들리고 있다는 신호입니다. 핵심 공급업체에 관한 문장을 삭제한 회사는 관계가 끝났음을 알리는 것입니다. 이런 내용은 결코 보도자료에 나오지 않습니다. 변호사들은 소송을 당할까 두려워서 그런 문장들을 쓰는 것이며, 두려움은 아무도 두 번 읽지 않는 일반 텍스트 속에 숨겨진 정보입니다.
동일한 비교 방식은 경영진 논의 및 분석(MD&A) 섹션과 각주(footnotes)에도 적용됩니다. 엔론의 사기 전체는 대차대조표 밖의 특수목적법인에 관한 각주에 숨어 있었습니다. 스토리는 거짓이었지만, 각주는 진실이었습니다.
edgar-crawler 저장소는 정확히 이러한 항목 섹션(위험 요소, MD&A)을 깔끔한 JSON으로 추출하여 HTML을 정규식으로 파싱하는 수고를 덜어주기 위해 존재합니다. 이것이 이 저장소의 유일한 역할이며, 매우 잘 수행합니다. 출력물을 비교 도구에 넣기만 하면 됩니다.
직접 구축하는 대신 비용을 지불하고 사용하고 싶다면, 여러분을 대신해 이 작업을 해주는 업체들에 대한 정직한 정보는 다음과 같습니다.
Hudson Labs (구 Bedrock AI)
아직 널리 알려지지 않은 선택지이며, 제가 실제로 비용을 지불할 의향이 있는 곳입니다. 연간 교차 적자 추출을 자동으로 수행하고, 계속기업 불확실성 문구, 중요한 취약점, 특수관계자 위험 등을 별도 요청 없이 표면화합니다. 가격은 월 $100 정도부터 시작합니다. 서류를 진지하게 읽는 분이라면 이 리스트에서 가장 가성비가 좋은 선택입니다.

AlphaSense
기관의 기본 선택이며, 좌석당 약 15,000~20,000달러로 현실적으로는 회사에서 비용을 지불하지 않는 한 사용하기 어렵습니다. Tegus(전직 임원 및 고객과의 수천 건의 유료 인터뷰 라이브러리)를 소유하고 있습니다. 합법적인 내부 정보에 가장 가깝다고 할 수 있으며, 무료로 재현할 수 없습니다.

Daloopa
모델링에 바로 사용할 수 있는 재무 데이터를 추출하며, 모든 숫자가 서류 내 정확한 위치에 하이퍼링크로 연결되어 있습니다. 이 감사 추적(audit trail)이 진지하게 DCF(현금흐름할인) 모델을 구축하는 사람들이 사용하는 이유입니다. 기업용 가격이며, 모델링이 실제 업무가 아니라면 과한 솔루션입니다.

Fintool은 AI 우선, 미국 주식용으로 구축되었으며, 모든 내용에 출처를 표시하고 "어떤 회사든 공급망 문제를 새로 언급하면 알려줘"와 같은 상시 알림 기능을 제공합니다.
Hudson이 너무 법정 감사 중심적이고 AlphaSense가 너무 비싸게 느껴진다면 괜찮은 중간 지점입니다.

레벨 3: 암호화폐
이제 토큰 쪽으로 넘어가 보겠습니다. 개념은 정확히 동일합니다.
주식 시장에서는 사기가 발생액(accruals)과 각주(footnotes)에 숨어 있습니다.
암호화폐 시장에서는 공급 일정과 보유자 집중도에 숨어 있으며, 이 두 가지 모두 무료로 읽을 수 있는 공개 블록체인 상에 있습니다.
여기서 EDGAR에 해당하는 도구는 DefiLlama입니다.

무료 API, 키 불필요, 기본적으로 모든 프로토콜의 TVL, 수수료, 수익 및 잠금 해제 일정을 다룹니다.
프로토콜에는 일반 회사에 직접 대응되는 3가지 숫자가 있습니다.
- 수수료(Fees) = 사용자가 지불하는 모든 것. 이는 총 매출입니다.
- 수익(Revenue) = 프로토콜이 실제로 가져가는 몫. 이는 순수익입니다.
- 이익(Earnings) = 수익에서 사용자를 유치하기 위해 지급한 토큰 보상 비용을 뺀 것입니다.
Token Terminal은 이러한 수수료, 수익, 이익(암호화폐의 PER(주가수익비율)에 해당)을 모든 주요 체인에 걸쳐 표준화합니다.
진정한 '암호화폐계의 블룸버그'라고 할 수 있으며, 표준화 작업은 수작업으로 하기에는 정말 고된 일입니다. 하지만 개인이 사용하기에는 월 ~350달러라는 가격이 부담스럽고, 무료 티어와 DefiLlama를 함께 사용하면 대부분의 요구 사항을 충족할 수 있습니다.

그리고 법정 감사 스크리닝의 암호화폐 버전이라고 할 수 있는 2가지 핵심 요소가 있습니다.
먼저 잠금 해제 일정입니다.
토큰이 모두 출시와 동시에 유통되는 것은 아닙니다. 팀과 VC 물량은 수년에 걸쳐 베스팅되며, 잠금이 해제될 때 거의 제로에 가까운 가격에 진입한 사람들이 마침내 일반 투자자에게 덤핑할 수 있게 됩니다. 경험상, 단일 잠금 해제 물량이 유통 공급량의 5%를 초과하면 위험 신호입니다. 실제 사례로, Arbitrum의 첫 번째 큰 절벽(cliff) 잠금 해제 시 하루 만에 당시 전체 유통 공급량에 맞먹는 양의 ARB가 풀렸습니다. 초기부터 보유하던 고래들은 일반 투자자에게 차익 실현할 기회를 얻었고, 그 날짜는 몇 달 전부터 달력에 공지되어 있었습니다.
3가지 형태를 알아두세요.
- 절벽(Cliff) - 하루에 큰 덩어리를 쏟아냅니다 (급격함).
- 선형 베스팅(Linear vest) - 매일 소량씩 방출합니다 (느린 출혈로 때로는 버틸 수 있음).
- 활동 기반 발행(Emissions) - 활동에 기반하여 방출합니다. VC 지갑으로의 절벽 잠금 해제가 포트폴리오를 망가뜨리는 유형입니다.
두 번째는 보유자 집중도입니다. 누가 실제로 그 토큰을 소유하고 있는가입니다. 소수의 지갑이 대부분의 공급량을 보유하고 있고, 그 지갑들이 팀이나 초기 VC 펀드로 식별된다면, 축하합니다, 여러분은 설계상의 청산 유동성(exit liquidity)입니다.
이것이 바로 지갑 라벨링 도구의 가치가 발휘되는 부분입니다. 원시 체인 데이터는 누군가가 그것이 Jump Trading이나 팀 베스팅 계약이라고 알려주기 전까지는 그저 0xxxxxxxx...일 뿐이기 때문입니다.
Arkham
개인에게 무료로 제공되는 최초의 본격적인 플랫폼이므로 여기서 시작하세요. 익명 해제 엔진은 진짜입니다. 수십억 달러 규모의 도난 비트코인을 해커까지 공개적으로 추적한 회사입니다. 여러분이 살펴보는 모든 토큰에 대해 동일한 개체 추적을 실행할 수 있습니다. 무료라는 점이 가장 큰 장점입니다. 그냥 사용하세요.
Nansen
수많은 체인에서 일찍 그리고 정확하게 움직인 실적이 있는 "똑똑한 자금(smart money)" 지갑을 추적합니다. 최근 Pro 가격을 약 월 49달러로 대폭 인하했습니다. 라벨이 이 제품의 전부이며, 꽤 좋습니다. 하지만 자금이 중앙화 거래소에 도달하는 순간 추적이 중단됩니다. 온체인 트레이딩을 진지하게 한다면 가치가 있습니다.
Dune
직접 SQL을 한 줄도 작성하지 않고 포크(fork)할 수 있는 10만 개 이상의 커뮤니티 SQL 대시보드를 제공합니다. 무료 티어는 거의 모든 사람에게 충분하며, 여러분이 원하는 대시보드는 이미 누군가가 구축해 놓았을 것이므로 직접 만들기 전에 먼저 찾아보세요.
Messari는 강력한 질적 리서치와 평가를 제공합니다. 가격은 불투명하고 기업 중심이며, 무료 리서치는 읽을 가치가 있지만, 좋은 내용을 원한다면 영업 전화를 피하기 어려울 것입니다.
Tokenomist (구 Token Unlocks)는 잠금 해제 일정 전용 캘린더입니다. DefiLlama도 잠금 해제를 다루지만, 잠금 해제 트레이딩이 여러분의 전부라면 이쪽이 전문가용입니다.
레벨 4: 하나의 시스템
이제 필요한 조각들은 모두 갖췄습니다. 양쪽 모두 무료 데이터, 법정 감사 수학, 문서 비교, 온체인 스크리닝까지. 마지막 단계는 이 모든 것을 여러분이 15개의 탭을 복사 붙여넣기하며 돌아다니는 대신 하나의 기계처럼 작동하게 만드는 것입니다.
virattt/ai-hedge-fund는 유명 투자자의 철학을 모델링한 AI 에이전트 팀으로, 특정 주식에 대해 토론을 벌이고 결론을 내놓습니다. 투자자 페르소나 개념은 사실 다소 기믹에 가깝고, 실제 돈을 걸고 실시간 거래에 사용해서는 절대 안 됩니다.
하지만 분석 에이전트를 오케스트레이션하는 방법, 데이터 수집기를 스크리너에 연결하고 다시 추론 엔진에 연결하는 방법을 배우는 무료 강의로서는 현재 GitHub에서 최고의 교육 자료입니다.

OpenBB는 오픈소스 블룸버그 터미널입니다. 데이터 공급자를 한 번만 연결하면 모든 곳에서 사용할 수 있으며, 에이전트가 전체를 구동할 수 있는 MCP 서버도 제공합니다. 강력하지만 무겁고, 설정은 실제 작업이 필요하며 데이터 품질은 전적으로 어떤 무료 공급자를 연결하느냐에 달려 있습니다. 모든 것을 하나의 콕핏에서 관리하고 싶다면 가치가 있지만, 단순히 몇 개 종목만 스크리닝하려는 경우에는 과한 솔루션입니다.

FinGPT / FinRobot은 저렴하게 미세 조정(fine-tuning)할 수 있는 오픈소스 금융 LLM입니다. 학술적으로는 인상적이며, 실제로 미세 조정은 생각보다 비용이 많이 들지 않습니다.
하지만 거의 모든 사람에게 미세 조정은 필요 없습니다. 위에서 설명한 프롬프트와 함께 최첨단 프론티어 모델을 사용하는 것만으로 충분합니다.

순서대로 정리하자면
- 도구 레이어: 먼저 함수 호출(function calling)이나 EDGAR, FMP, DefiLlama를 래핑한 MCP 서버를 구축하여 모델이 실제 숫자를 가져오고 절대 허구를 만들어내지 못하게 합니다. 이는 필수 불가결한 사항입니다. 출처가 없는 금융 수치를 인용하는 AI는 분석가가 아닌 책임 소재가 될 뿐입니다.
- 스크리닝 레이어: 법정 감사 점수와 온체인 점검이 여러분의 관심 종목에 자동으로 실행됩니다.
- 읽기 레이어: 스크리닝을 통과한 종목에 대한 전년 대비 비교 분석(diff)을 수행합니다.
- 종합(Synthesis): 모델이 모든 주장에 출처를 표시한 메모를 작성하고, 여러분은 200페이지 분량의 서류 대신 그 메모를 읽습니다.
모델 측면에서는 Claude나 GPT 모두 작동합니다. 민감한 데이터를 다루고 서류가 내 기계를 벗어나는 것을 원하지 않는다면, Ollama를 통해 오픈소스 모델을 로컬에서 실행하세요. 모델 자체는 결코 해자가 아니었습니다. 해자는 깔끔하고, 검증되었으며, 출처가 연결된 데이터에 연결하고 훈련된 수학적 분석을 적용하는 데 있습니다.
레벨 5: 레벨 1 구축하기
티커를 입력하면 EDGAR에서 실제 서류를 가져와 Beneish, Altman, Piotroski 및 발생액 비율을 계산하고, 키가 있으면 전년 대비 위험 요소 비교 분석을 실행하여 한 문단 분량의 평가를 작성해줍니다.
1#!/usr/bin/env python32"""3forensic_screener.py - 단일 명령어로 모든 기업을 분석가처럼 분석합니다.45설정 방법:6 pip install edgartools anthropic7 export SEC_IDENTITY="Your Name [email protected]" # SEC에서 필요로 하는 헤더8 export ANTHROPIC_API_KEY="sk-..." # 선택 사항, 비교 분석에만 필요910실행 방법:11 python forensic_screener.py AAPL12 python forensic_screener.py TSLA NVDA SMCI # 여러 개 동시에 스크리닝13 python forensic_screener.py SMCI --diff # 위험 요소 비교 분석 추가1415import os, sys, argparse16from dataclasses import dataclass1718# 임계값 - 입장을 바꾸는 기준선. 취향에 따라 조정하세요.19M_FLAG = -1.78 # Beneish 점수가 이 값보다 높음 -> 조작 위험 (기준 임계값 -2.22)20Z_DISTRESS = 1.81 # Altman 점수가 이 값보다 낮음 -> 부실 위험 구간21Z_SAFE = 2.99 # Altman 점수가 이 값보다 높음 -> 안전 구간22ACCRUAL_BAD = 0.25 # |발생액/자산| 비율이 이 값보다 높음 -> 수익 품질 위험 신호23F_STRONG = 6 # Piotroski 점수가 이 값 이상 -> 재무 상태 강화2425@dataclass26class YearData:27 sales: float; cogs: float; sga: float; net_income: float; cfo: float28 receivables: float; current_assets: float; current_liabilities: float29 ppe_net: float; depreciation: float; total_assets: float30 total_liabilities: float; long_term_debt: float; retained_earnings: float31 ebit: float; market_cap: float; shares: float3233def load_two_years(ticker: str):34 """(올해 데이터, 작년 데이터)를 반환합니다. 네트워크를 통해 SEC EDGAR를 호출합니다."""35 from edgar import Company, set_identity36 identity = os.environ.get("SEC_IDENTITY")37 if not identity:38 sys.exit("SEC_IDENTITY='Your Name [email protected]'를 설정하세요. SEC에서 필요로 합니다.")39 set_identity(identity)4041 company = Company(ticker)42 fin = company.get_financials()43 inc, bal, cfs = fin.income_statement(periods=2), fin.balance_sheet(periods=2), fin.cash_flow(periods=2)4445 def g(stmt, col, *aliases):46 # 최선의 방식으로 행 찾기; 기업마다 동일한 개념을 다르게 태그함47 for a in aliases:48 try:49 row = stmt.loc[stmt.index.str.contains(a, case=False, na=False)]50 if not row.empty:51 return float(row.iloc[0, col])52 except Exception:53 continue54 return 0.05556 def build(col):57 return YearData(58 sales=g(inc, col, "RevenueFromContractWithCustomerExcludingAssessedTax", "Revenues", "SalesRevenueNet"),59 cogs=g(inc, col, "CostOfGoodsAndServicesSold", "CostOfRevenue"),60 sga=g(inc, col, "SellingGeneralAndAdministrativeExpense"),61 net_income=g(inc, col, "NetIncomeLoss"),62 cfo=g(cfs, col, "NetCashProvidedByUsedInOperatingActivities"),63 receivables=g(bal, col, "AccountsReceivableNetCurrent", "ReceivablesNetCurrent"),64 current_assets=g(bal, col, "AssetsCurrent"),65 current_liabilities=g(bal, col, "LiabilitiesCurrent"),66 ppe_net=g(bal, col, "PropertyPlantAndEquipmentNet"),67 depreciation=g(cfs, col, "DepreciationDepletionAndAmortization", "DepreciationAmortizationAndAccretionNet"),68 total_assets=g(bal, col, "Assets"),69 total_liabilities=g(bal, col, "Liabilities"),70 long_term_debt=g(bal, col, "LongTermDebtNoncurrent", "LongTermDebt"),71 retained_earnings=g(bal, col, "RetainedEarningsAccumulatedDeficit"),72 ebit=g(inc, col, "OperatingIncomeLoss"),73 market_cap=getattr(company, "market_cap", 0.0) or 0.0,74 shares=g(bal, col, "CommonStockSharesOutstanding"),75 )7677 # col 0 = 가장 최근 연도, col 1 = 이전 연도 (edgartools는 최신 것을 먼저 정렬)78 return build(0), build(1)7980def d(a, b): return a / b if b else 0.0 # 안전한 나눗셈8182def beneish_m_score(t, p):83 DSRI = d(d(t.receivables, t.sales), d(p.receivables, p.sales))84 GMI = d((p.sales - p.cogs)/p.sales if p.sales else 0, (t.sales - t.cogs)/t.sales if t.sales else 0)85 AQI = d(1 - d(t.current_assets + t.ppe_net, t.total_assets), 1 - d(p.current_assets + p.ppe_net, p.total_assets))86 SGI = d(t.sales, p.sales)87 DEPI = d(d(p.depreciation, p.depreciation + p.ppe_net), d(t.depreciation, t.depreciation + t.ppe_net))88 SGAI = d(d(t.sga, t.sales), d(p.sga, p.sales))89 TATA = d(t.net_income - t.cfo, t.total_assets)90 LVGI = d(d(t.total_liabilities, t.total_assets), d(p.total_liabilities, p.total_assets))91 return (-4.84 + 0.92*DSRI + 0.528*GMI + 0.404*AQI + 0.892*SGI92 + 0.115*DEPI - 0.172*SGAI + 4.679*TATA - 0.327*LVGI)9394def altman_z_score(t):95 wc = t.current_assets - t.current_liabilities96 return (1.2*d(wc, t.total_assets) + 1.4*d(t.retained_earnings, t.total_assets)97 + 3.3*d(t.ebit, t.total_assets) + 0.6*d(t.market_cap, t.total_liabilities)98 + 1.0*d(t.sales, t.total_assets))99100def piotroski_f_score(t, p):101 s = 0102 s += t.net_income > 0103 s += t.cfo > 0104 s += d(t.net_income, t.total_assets) > d(p.net_income, p.total_assets)105 s += t.cfo > t.net_income # 현금이 발생액보다 중요106 s += t.long_term_debt < p.long_term_debt107 s += d(t.current_assets, t.current_liabilities) > d(p.current_assets, p.current_liabilities)108 s += t.shares <= p.shares # 희석 없음109 s += d(t.sales - t.cogs, t.sales) > d(p.sales - p.cogs, p.sales)110 s += d(t.sales, t.total_assets) > d(p.sales, p.total_assets)111 return int(s)112113def sloan_accruals(t): return d(t.net_income - t.cfo, t.total_assets)114115def risk_factor_diff(ticker):116 """올해와 작년의 위험 요소를 비교 분석합니다. 스택에서 가장 유용한 단일 분석입니다."""117 key = os.environ.get("ANTHROPIC_API_KEY")118 if not key:119 return "(건너뜀 - 비교 분석을 사용하려면 ANTHROPIC_API_KEY를 설정하세요)"120 from edgar import Company121 import anthropic122 f = Company(ticker).get_filings(form="10-K").latest(2)123 this_rf = getattr(f[0].obj(), "risk_factors", str(f[0]))124 last_rf = getattr(f[1].obj(), "risk_factors", str(f[1]))125 client = anthropic.Anthropic(api_key=key)126 msg = client.messages.create(127 model="claude-opus-4-8", max_tokens=1024,128 messages=[{"role": "user", "content": (129 "연속된 두 연례 서류의 위험 요소 섹션을 비교하십시오. "130 "올해 새로 추가된 내용 또는 삭제된 내용만 보고하십시오. 새로운 문구를 인용하십시오. "131 "양쪽에 공통으로 있는 판에 박힌 문장은 무시하십시오. 마지막에 한 문장으로 "132 "이 중 위험을 변화시키는 내용이 있는지 결론을 내리십시오.\n\n"133 f"작년:\n{last_rf[:40000]}\n\n올해:\n{this_rf[:40000]}")}],134 )135 return msg.content[0].text136137def screen(ticker, do_diff=False):138 print(f"\n{'='*60}\n {ticker.upper()}\n{'='*60}")139 try:140 t, p = load_two_years(ticker)141 except Exception as e:142 print(f" 서류를 불러올 수 없습니다: {e}"); return143144 m, z, f, a = beneish_m_score(t, p), altman_z_score(t), piotroski_f_score(t, p), sloan_accruals(t)145 flags = []146 if m > M_FLAG: flags.append(f"M-Score {m:+.2f} - 수익 조작 위험")147 if z < Z_DISTRESS: flags.append(f"Z-Score {z:.2f} - 재무 부실 위험 구간")148 if abs(a) > ACCRUAL_BAD: flags.append(f"발생액 {a:+.1%} - 수익 품질 위험 신호")149 if f < F_STRONG: flags.append(f"F-Score {f}/9 - 재무 상태 강화 아님")150151 print(f" Beneish M : {m:+.2f} (> {M_FLAG} = 조사 필요)")152 print(f" Altman Z : {z:.2f} (< {Z_DISTRESS} 부실 위험, > {Z_SAFE} 안전)")153 print(f" Piotroski F: {f}/9 (>= {F_STRONG} 강함)")154 print(f" Sloan Accr : {a:+.1%} (|x| > {ACCRUAL_BAD:.0%} 위험 신호)")155 print(f"\n 판정: {'조사 필요' if flags else '양호'}")156 for fl in flags: print(f" - {fl}")157 if do_diff:158 print(f"\n 위험 요소 비교 분석 (전년 대비):")159 print(" " + risk_factor_diff(ticker).replace("\n", "\n "))160161def main():162 ap = argparse.ArgumentParser(description="미국 상장 기업을 위한 법정 감사 스크리너")163 ap.add_argument("tickers", nargs="+")164 ap.add_argument("--diff", action="store_true", help="위험 요소 비교 분석 실행")165 args = ap.parse_args()166 for tk in args.tickers:167 screen(tk, do_diff=args.diff)168 print("\n참고: 확률적 지표이며, 증거가 아닙니다. Beneish는 작년 데이터로 실행되므로 "169 "조작이 이미 해소 중일 수 있습니다. 낮은 점수는 서류를 열어보라는 의미이며, "170 "숫자만으로 공매도 결정을 내리지 마십시오.\n")171172if __name__ == "__main__":173 main()
배포 전에 수학적 계산을 확인했습니다. 건전한 숫자들을 입력하면 Beneish M-Score는 깔끔하게 약 -2.24, Altman Z-Score는 안전 구간, Piotroski F-Score는 9/9, 발생액 비율은 0에 가깝게 출력되며, 정확히 원하는 결과를 보여줍니다.
실시간 SEC 연결과 비교 분석을 위한 키만 있으면 여러분의 기기에서 실행할 수 있습니다. 태그 별칭은 표준 신고 기업을 다루며, 특이한 기업의 경우 한 줄을 추가해야 할 수도 있으며, 그 위치는 코드에 표시되어 있습니다.





