이 프로젝트는 React와 TypeScript를 사용하여 미국 증권거래위원회(SEC)의 EDGAR API로부터 기업의 재무 데이터를 조회하는 웹 애플리케이션입니다. 사용자는 특정 기업과 기간을 선택하여 재무제표 항목들을 확인하고, 주요 투자 지표와 연간 성장률 그래프, 그리고 5단계 정량 분석 모델을 통해 기업의 재무 건전성을 직관적으로 파악할 수 있습니다.
성공적인 투자는 보통 두 가지 분석을 조화롭게 사용합니다.
-
정량적 분석으로 '좋은 기업'을 찾는다: 먼저 우리가 만든 앱을 통해 재무적으로 튼튼하고 성장 잠재력이 있는 기업을 관심 종목으로 편입합니다. 이는 투자의 가장 중요한 기초가 됩니다.
-
정성적 분석으로 '매수 시점'을 찾는다: 그 후, 시장 전체가 공포에 빠져 좋은 기업의 주가마저 저렴해졌을 때, 또는 기술적으로 의미 있는 지지선에 도달했을 때 등 자신만의 기준에 따라 매수 타이밍을 잡습니다.
-
동적 데이터 조회: 특정 기업과 기간(최근 1, 3, 5, 10년)을 선택하여 재무 데이터 검색
-
데이터 시각화: 주요 항목(매출, 영업이익, 순이익)의 YoY(전년 대비) 성장률을 막대그래프로 시각화
-
투자 지표 분석: ROE, ROA, 부채비율 등 핵심 투자 지표를 연도별 테이블로 제공
-
정량 분석 모델: 5단계 평가 모델을 통해 기업의 재무 건전성을 총점과 등급으로 요약 제공
-
상세 정보 모달: 상세 재무제표 테이블의 특정 행을 클릭 시 모든 정보를 모달 창으로 표시
-
상태 관리: React Query (@tanstack/react-query)를 사용하여 API 데이터 페칭, 캐싱, 로딩 및 에러 상태를 관리
-
배포 환경 구성: Netlify 배포를 위한 프록시 설정 (netlify.toml) 포함
※ 면책 조항: 이 모델은 교육 및 예시 목적으로 제작된 단순화된 평가 방법입니다. 실제 투자 결정은 훨씬 더 복합적인 분석을 통해 신중하게 내려져야 하며, 이 모델은 투자를 권유하거나 보장하지 않습니다.
이 애플리케이션은 SEC EDGAR API로부터 직접 데이터를 가져오므로, 원본 데이터의 특성에 따라 일부 항목이 예상과 다르게 표시될 수 있습니다.
이 앱에서 계산된 부채비율이 증권사 앱과 다르게 보일 수 있습니다. 이는 '부채'를 정의하는 기준이 다르기 때문이며, 어느 한쪽이 틀린 것이 아닙니다.
| 구분 | 이 앱 (회계 기준) | 증권사 앱 (금융 분석 기준) |
|---|---|---|
| 계산 공식 | 총 부채 / 자기자본 |
이자 발생 부채 / 자기자본 |
| '부채'의 정의 | 모든 부채 (차입금, 매입채무 등) | 이자 발생 부채 (차입금, 회사채 등) |
| 목적 | 기업의 전체적인 재무 안정성 평가 | 순수하게 빌린 돈에 대한 의존도 평가 |
결론적으로, 이 앱은 회계 원칙에 따른 가장 포괄적인 데이터를 보여주며, 증권사는 금융 분석에 더 초점을 맞춘 특정 데이터를 보여주는 것입니다.
기업들은 SEC에 매출을 보고할 때 항상 동일한 항목명(concept)을 사용하지 않습니다. 이 앱은 가장 보편적으로 사용되는 아래의 항목들을 우선순위에 따라 순차적으로 확인하여 매출 데이터를 가져옵니다.
RevenuesSalesRevenueNetRevenueFromContractWithCustomerExcludingAssessedTax
만약 특정 기업이 위에 명시되지 않은 다른 항목으로 매출을 보고하는 경우, 해당 데이터를 찾지 못하고 N/A로 표시될 수 있습니다.
-
10-K (연간 보고서): 회계연도 전체에 대해 감사를 거친 최종 확정본입니다. 이 앱의 모든 핵심 지표(YoY, ROE, ROA, 5단계 분석 모델 등)는 가장 신뢰도 높은 이 10-K 데이터를 기준으로 계산됩니다.
-
10-Q (분기 보고서): 감사를 거치지 않은 예비 성격의 보고서입니다. 연말 최종 결산 시 수치가 조정될 수 있으므로, 4개 분기의 단순 합계가 최종 연간 보고서의 수치와 정확히 일치하지 않을 수 있습니다. '손익계산서 요약' 테이블의 분기 데이터는 연중 실적의 흐름(Trend)을 참고하는 용도로 활용하는 것이 좋습니다.
이 앱은 기업의 재무 건전성을 빠르고 직관적으로 파악하기 위해 5단계 정량 평가 모델을 사용합니다. 모든 평가는 가장 최근의 연간 보고서(10-K) 데이터를 기준으로 이루어집니다.
| 단계 | 평가 항목 | 핵심 질문 |
|---|---|---|
| 1단계 | 성장성 (매출 YoY) | 회사가 얼마나 빠르게 성장하고 있는가? |
| 2단계 | 수익성 (ROE) | 주주의 돈으로 얼마나 효율적으로 이익을 내는가? |
| 3단계 | 안정성 (부채비율) | 재무적으로 얼마나 안정적인가? |
| 4단계 | 영업 효율성 (영업이익 YoY) | 핵심 사업의 이익 창출력이 성장하는가? |
| 5단계 | 종합 이익률 (순이익 YoY) | 최종 이익이 성장하고 있는가? |
| 점수 | 성장률 (YoY) | 수익성 (ROE) | 안정성 (부채비율) |
|---|---|---|---|
| 5점 (매우 좋음) | 20% 이상 | 20% 이상 | 50% 미만 |
| 4점 (좋음) | 10% ~ 20% | 15% ~ 20% | 50% ~ 100% |
| 3점 (보통) | 5% ~ 10% | 10% ~ 15% | 100% ~ 150% |
| 2점 (주의) | 0% ~ 5% | 5% ~ 10% | 150% ~ 200% |
| 1점 (나쁨) | 0% 미만 | 5% 미만 | 200% 이상 |
| 총점 | 평가 등급 | 해석 |
|---|---|---|
| 21 ~ 25점 | 매우 긍정적 | 성장성, 수익성, 안정성 모든 면에서 매우 뛰어난 최상위 기업. |
| 16 ~ 20점 | 긍정적 | 펀더멘털이 튼튼하고 우수한 기업. 투자를 적극적으로 고려해볼 만함. |
| 11 ~ 15점 | 보통 | 양호하지만 특별한 강점은 없는 보통 수준의 기업. 추가 분석이 필요함. |
| 6 ~ 10점 | 주의 필요 | 일부 항목에서 위험 신호가 발견되는 기업. 투자에 신중해야 함. |
| 1 ~ 5점 | 부정적 | 재무 건전성에 심각한 문제가 있을 가능성이 높은 기업. |
※ 면책 조항: 이 모델은 교육 및 예시 목적으로 제작된 단순화된 평가 방법입니다. 실제 투자 결정은 훨씬 더 복합적인 분석을 통해 신중하게 내려져야 하며, 이 모델은 투자를 권유하거나 보장하지 않습니다.
이 프로젝트에서 사용된 주요 지표의 계산식은 다음과 같습니다. 모든 계산은 연간 보고서(10-K)를 기준으로 합니다.
-
YoY (전년 대비) 성장률 (%)
((현재 연도 값 - 이전 연도 값) / |이전 연도 값|) * 100 -
ROE (자기자본이익률, %)
(당기순이익 / 자본총계) * 100 (NetIncomeLoss / StockholdersEquity) * 100 -
ROA (총자산이익률, %)
(당기순이익 / 자산총계) * 100 (NetIncomeLoss / Assets) * 100 -
부채비율 (%)
(부채총계 / 자본총계) * 100 (Liabilities / StockholdersEquity) * 100
- React
- TypeScript
- React Query (@tanstack/react-query)
- 저장소 복제
git clone [your-repository-url]
cd [repository-name]
- 의존성 설치
npm install
- 로컬 개발용 프록시 설정 로컬 환경에서 CORS 오류를 방지하기 위해 src 폴더에 setupProxy.js 파일이 필요합니다.
// src/setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
'/api',
createProxyMiddleware({
target: 'https://data.sec.gov',
changeOrigin: true,
})
);
};- 개발 서버 실행
npm start브라우저에서 http://localhost:3000 주소로 접속합니다.
이 프로젝트는 Netlify를 통해 배포될 수 있도록 설정되어 있습니다. 프로덕션 환경에서의 API 요청은 프로젝트 루트의 netlify.toml 파일에 정의된 프록시 규칙을 통해 처리됩니다.
# netlify.toml
[[redirects]]
from = "/api/*"
to = "https://data.sec.gov/api/:splat"
status = 200이 프로젝트는 CLOUDTYPE을 통해 백앤드 배포하였습니다. -> git repo안에 SEC-VIEWER-BACKEND 에잇다