개인 투자용으로 만든 주식 스크리닝 도구입니다. 기술적 분석과 펀더멘털 분석을 간단하게 확인할 수 있어요.
구조 참고: 모노레포 루트 아래
apps/web이 Next.js 웹앱 소스입니다. 공용 스크립트는 루트package.json에서yarn dev|build|test로 호출하면 자동으로apps/web워크스페이스를 실행합니다.
- 통합 스크리너: 모든 필터를 한 페이지에서 사용 가능
- 티커 검색 필터: 검색 인풋에 티커를 입력하여 원하는 종목만 빠르게 필터링
- 대소문자 구분 없는 부분 일치 검색
- 실시간 필터링 (debounce + useDeferredValue 최적화)
- 기존 필터와 AND 조건으로 통합
- 카테고리별 필터박스: 필터를 이평선/성장성/수익성/가격으로 분류하여 관리
- 각 필터박스를 클릭하면 해당 카테고리의 필터만 팝업으로 표시
- 필터박스에 현재 적용된 필터 요약 표시
- 필터 자동 저장: 설정한 필터가 자동으로 localStorage에 저장되어 다음 접근 시 자동 적용
- 필터 변경 시 자동 저장 (500ms debounce)
- URL 파라미터가 없을 때 localStorage 기본값 자동 적용
- URL 파라미터가 있으면 URL 우선 적용
- 테이블 정렬 자동 저장: 테이블 정렬 상태가 자동으로 localStorage에 저장되어 새로고침 후에도 유지
- 정렬 변경 시 즉시 저장
- 페이지 로드 시 마지막 정렬 상태 자동 복원
- 이평선 필터:
- 정배열 필터: 이동평균선 정배열(MA20 > MA50 > MA200) 조건을 선택적으로 적용
- 비활성화 시: 모든 종목 표시 (Golden Cross 조건 무시)
- Golden Cross 필터: MA50 > MA200 조건을 선택적으로 적용
- 정배열 옵션:
- "전체 정배열": 현재 정배열 상태인 종목
- "최근 전환": 최근 N일 내에 정배열로 전환한 종목 (정배열 필터 활성화 시에만 사용 가능)
- 이평선 위 필터: 종가가 특정 이평선 위에 있는 종목만 필터링
- 20MA, 50MA, 100MA, 200MA 중복 선택 가능 (AND 조건)
- 예: 20MA + 50MA 선택 시 종가 > MA20 AND 종가 > MA50인 종목만 표시
- 정배열 필터: 이동평균선 정배열(MA20 > MA50 > MA200) 조건을 선택적으로 적용
- 가격 필터 (돌파매매): EOD(종가) 데이터 기준으로 어제 거래일의 가격 패턴을 분석
- 확정 돌파 전략: EOD 기준으로 어제 캔들이 최근 20일 고점을 돌파하면서 거래량이 20일 평균의 2배 이상이고, 윗꼬리가 전체 캔들 길이의 20% 이내인 종목만 필터링
- 완벽 재테스트 전략: 정배열(MA20 > MA50 > MA200) + 과거 3
10일 사이 신고가 돌파 이력이 있고, 어제 종가가 20일선 98105% 구간에서 지지를 받은 망치/양봉 패턴인 종목만 필터링 - 두 전략 모두 ETL에서
daily_breakout_signals테이블에 미리 계산한 신호를 사용하므로, 스크리너에서는 단순JOIN만 수행하여 성능 저하 없이 사용할 수 있음
- 노이즈 필터: 소외주, 잡주, 속임수가 많은 종목을 걸러내는 필터 그룹
- 거래량 필터: 평균 거래대금 > $10M OR 평균 거래량 > 500K (인기 없는 종목 제외)
- 변동성 압축 필터 (VCP): ATR(14) / 현재가 < 5% AND Bollinger Band 폭이 60일 평균의 80% 이하로 압축된 종목 (용수철처럼 눌린 종목)
- 캔들 몸통 필터: 몸통이 전체 캔들 길이의 60% 이상인 종목 (지저분한 꼬리 제외)
- 이평선 밀집 필터: MA20-MA50 간격이 3% 이내인 종목 (힘이 응축된 종목)
- 모든 필터는 ETL에서
daily_noise_signals테이블에 미리 계산하므로 성능 저하 없이 사용 가능
- 성장성 필터:
- 연속 성장 분기 수: 연속 2-8분기 매출/수익 성장 기업 선별
- 평균 성장률: 선택한 N분기 동안 평균 성장률이 X% 이상인 기업 선별
- 저평가 필터 (PEG < 1): 성장 대비 저평가인 종목 선별 (0 이상 1 미만, 음수 제외)
- 두 가지 필터를 조합하여 사용 가능 (AND 조건)
- 밸류에이션 지표: 테이블에 PER(Price-to-Earnings Ratio) 및 PEG(Price/Earnings to Growth Ratio) 컬럼 표시
- PER: 주가를 주당순이익(EPS)으로 나눈 값으로 종목의 밸류에이션 평가
- PEG: PER을 성장률로 나눈 값으로 성장성을 고려한 밸류에이션 평가
- 8분기 재무 차트: 최근 8분기 매출/EPS 트렌드 시각화
- 수익성 필터: 흑자/적자 기업 구분
- 최근 흑자 전환 필터: EPS기준 직전 분기부터 적자에서 흑자로 전환된 기업 구분
- RS 상대강도: 최근 12/6/3개월 수익률을 가중합(0.2/0.3/0.5)한 점수로 테이블에 표시 및 정렬 지원
- 섹터 컬럼: 섹터를 테이블에 노출(한글 라벨로 표시), 정렬 지원
- 종목 상세 정보: 스크리너에서 티커 클릭 시 상세 페이지로 이동
- 기본 정보: 회사명, 섹터, 산업, 거래소
- 기술적 지표: 현재가, RS Score, 정배열/골든크로스 상태
- 밸류에이션: P/E, PEG, P/S, P/B, EV/EBITDA (매일 업데이트)
- 분기 재무: 수익성, 재무 건전성, 배당 (분기별 업데이트)
- 분기별 실적 차트: 매출/EPS 추이 (최근 8분기, 0 기준 막대그래프)
- 주가 차트:
- 캔들스틱 차트 + 거래량
- 이동평균선 (SMA 20/50/100/200) - 클라이언트 계산
- RSI (14) - 30/70 기준선
- MACD (12, 26, 9) - 히스토그램 + Signal Line
- 호버 시 OHLC, 변동률, 거래량, MA 값 표시
- 관심종목 추가/제거, 외부 링크 (Seeking Alpha)
- AI 트레이딩 어드바이저:
- 플로팅 버튼으로 간편한 접근
- Master Trading Protocol v5.0 기반 AI 분석
- 드래그 가능한 모달로 차트와 함께 확인
- 구조화된 UI (신호등, 전략 카드, 경고/근거)
- 하루 캐싱으로 빠른 응답
- 수기 매매일지: 분할 매수/매도, 피라미딩, 트레일링 스탑 등 매매 내역 기록
- 신규 매매 생성 (진입가, 손절가, n차 목표가, 전략 태그)
- 분할 매수/매도 기록 (날짜, 가격, 수량, 메모)
- 자동 계산: 평단가, 보유수량, 손익금, 수익률, R-Multiple
- 수수료율 설정 (개인화, localStorage 저장)
- 자동 완료 처리: 모든 보유 수량 매도 시 자동으로 완료 처리
- 포지션 현황: 현재 보유 포지션 정보 표시
- 포지션 총합: 현재가 × 수량 (시가평가)
- 원금 + 미실현 손익 + 수익률 표시
- 포지션별 비중 표시
- 포지션 할당 파이 차트 및 수익 흐름(PnL) 그래프
- 진행중/완료 탭: URL 기반 상태 관리로 브라우저 뒤로가기 지원
- 진행중/완료 거래 개수 표시
- 완료된 거래 필터링: 전체/수익/손실
- 필터별 총 손익 표시
- 진행중 매매 테이블:
- 현재가 컬럼: 전일대비 변동률 표시 (
$123.45 (+2.3%)) - 실현손익 컬럼: 이미 실현한 손익 표시 (미실현손익 오른쪽)
- 현재가 컬럼: 전일대비 변동률 표시 (
- 가격 바 차트: 손절가 ~ 목표가 시각화
- 손절가, 평단가, 현재가, n차 목표가를 점으로 표시
- 현재가 위치 + 평단가 대비 손익 퍼센트 표시
- 호버 팝업: 현재가가 목표가보다 높으면 현재가를 레전드 가장 오른쪽에 배치
- 매매 복기: 종료 시 실수 태그 + 리뷰 노트 기록
- 통계 대시보드: 승률, 평균 R-Multiple, 실수 유형별 분석
- 수익 흐름(PnL) 차트: 완료된 매매들의 실현손익 누적 그래프 (1개월/3개월/전체)
- 관심종목 기능: 관심 종목을 저장하고 관리
- 스크리너에서 종목을 관심종목에 추가/제거
- 세션 기반 저장 (쿠키 사용)
- 관심종목 페이지에서 저장된 종목의 재무 데이터 확인
- 서버 사이드 렌더링으로 빠른 로딩
- 자동 알림 감지: ETL 실행 시 특정 기술적 조건을 만족하는 종목을 자동으로 감지
- 알림 조건: 정배열 상태에서 20일선 돌파 감지
- 정배열 조건: MA20 > MA50 > MA200
- 돌파 조건: 전일 종가 < MA20, 오늘 종가 > MA20
- 중복 방지: 같은 종목, 같은 날짜에 대해 하루 1회만 알림
- 알림 조건: 정배열 상태에서 20일선 돌파 감지
- 이메일 알림: 감지된 종목을 종합 이메일로 전송
- 종목별 상세 정보 (티커, 회사명, 섹터, 시가총액, 돌파율 등)
- 클릭 가능한 링크로 종목 상세 페이지 이동
- 모바일 푸시 알림: 모바일 앱으로 푸시 알림 전송
- 종합 알림 형식 (여러 종목 → 1개 알림)
- 앱에서 상세 정보 확인 가능
- 가격 알림 목록 페이지: 발생한 알림을 웹에서 확인
- 네비게이션 바의 "가격 알림" 버튼으로 접근
- 알림 타입별 필터링 (현재: 20일선 돌파 정배열)
- 최신 날짜부터 5거래일치 알림을 날짜별로 그룹화하여 표시
- 각 날짜별로 스크리너 테이블과 동일한 형식으로 종목 정보 표시
- 알림 발생 시점의 실제 데이터를 표시 (해당 날짜 기준)
- 자동 실행: GitHub Actions에서 일일 ETL 완료 후 자동으로 알림 감지 및 전송
- Next.js 15 + React 19 + TypeScript
- Tailwind CSS + Shadcn/ui (UI가 예쁘게 나오게)
- PostgreSQL + Drizzle ORM (데이터 저장)
- FMP API (주식 데이터 가져오기)
- Resend (이메일 알림 전송)
- Expo Push Notification Service (모바일 푸시 알림)
- Vercel (배포)
- 미국 주식 심볼 가져오기 (NASDAQ, NYSE, AMEX)
- 일일 주가 데이터 수집
- 분기별 재무 데이터 수집
- 이동평균선 계산
- RS 점수 계산 (12M/6M/3M 가중)
- 돌파매매 신호 계산 (
daily_breakout_signals테이블) - 노이즈 필터 신호 계산 (
daily_noise_signals테이블) - 비정상 종목들 (워런트, ETF 등) 제거
git clone https://github.com/your-username/screener.git
cd screener
yarn installapps/web/.env.local 파일 만들고:
FMP_API_KEY=your_fmp_api_key_here
DATABASE_URL=postgresql://username:password@localhost:5432/screener
DATA_API=https://financialmodelingprep.com/
# 가격 알림 (선택사항)
RESEND_API_KEY=re_xxxxx # 이메일 알림 (Resend)
NOTIFICATION_EMAIL_FROM=[email protected]
NOTIFICATION_EMAIL_TO=[email protected]
# 참고: 푸시 알림 토큰은 DB의 device_tokens 테이블에서 관리됩니다
# Expo Push Notification Service는 기본 서비스로 토큰 불필요yarn db:push
yarn etl:symbols
yarn etl:daily-prices
yarn etl:daily-mayarn dev
# lint 체크
yarn lint# 모든 테스트 실행
yarn test
# Watch 모드 (파일 변경 시 자동 실행)
yarn test:watch
# UI 모드 (브라우저에서 결과 확인)
yarn test:ui
# 테스트 + 빌드 모두 실행
yarn test:all자세한 내용은 docs/TESTING.md 참고
-
티커 검색 필터
- 필터 라인 오른쪽 끝에 검색 인풋이 표시됩니다
- 티커의 일부를 입력하면 해당 티커가 포함된 종목만 테이블에 표시됩니다
- 예: "NV" 입력 → NVDA, NVDL 등 "NV"가 포함된 종목만 표시
- 검색어를 지우면 모든 종목이 다시 표시됩니다
- 다른 필터와 함께 사용 시 AND 조건으로 동작합니다
-
필터박스 사용법
- 화면 상단에 이평선/성장성/수익성 필터박스가 표시됩니다
- 각 필터박스를 클릭하면 해당 카테고리의 필터만 팝업으로 표시됩니다
- 필터박스에 현재 적용된 필터 요약이 표시됩니다
- 필터 자동 저장: 필터를 적용하면 자동으로 localStorage에 저장되어 다음 접근 시 자동 적용됩니다
- URL 파라미터가 없을 때: localStorage에 저장된 필터가 자동 적용됩니다
- URL 파라미터가 있을 때: URL의 필터가 우선 적용됩니다 (공유 링크 등)
- 테이블 정렬 자동 저장: 테이블 헤더를 클릭하여 정렬을 변경하면 자동으로 저장되어 새로고침 후에도 유지됩니다
-
이평선 필터
- 정배열 필터: 체크박스로 활성화/비활성화 가능
- 활성화 시: MA20 > MA50 > MA100 > MA200 조건을 만족하는 종목만 표시
- 비활성화 시: 모든 종목 표시 (정배열 조건 무시)
- Golden Cross 필터: 체크박스로 활성화/비활성화 가능
- 활성화 시: MA50 > MA200 조건을 만족하는 종목만 표시
- 정배열 옵션 (정배열 필터 활성화 시):
- "전체 정배열": 현재 정배열 상태인 종목
- "최근 전환": 최근 N일 내에 정배열로 전환한 종목
- 기간 입력: 1-60일 (최근 전환 선택 시)
- 정배열 필터: 체크박스로 활성화/비활성화 가능
-
성장성 필터 (매출/수익)
- 연속 성장 분기 수 모드:
- 체크박스 활성화 후 분기 수 입력 (2-8분기)
- 예: "매출 4분기 연속 상승" → 최근 4분기 동안 매출이 계속 증가한 기업
- 평균 성장률 모드:
- 체크박스 활성화 후 성장률 % 입력 (0-1000%)
- 예: "매출 평균 성장률 30% 이상" → 최근 N분기 동안 평균 성장률이 30% 이상인 기업
- 저평가 필터 (PEG < 1):
- 체크박스 활성화 시 PEG가 0 이상 1 미만인 종목만 표시
- 성장 대비 저평가인 종목을 선별하는 데 유용
- 두 모드를 조합하여 사용 가능 (예: "4분기 연속 상승" + "평균 25% 이상" + "PEG < 1")
- 연속 성장 분기 수 모드:
-
수익성 필터
- 전체 / 흑자 / 적자 기업 구분
- 최근 흑자 전환: 가장 최근 분기 EPS가 양수이고 직전 분기 EPS가 0 이하인 기업만 포함 (EPS 데이터 2분기 미만이면 제외)
- 사용법: 수익성 필터 팝업에서 체크박스를 켠 뒤 닫기 → 다른 필터와 AND 조건으로 동작
-
밸류에이션 지표 (PER/PEG)
- 테이블에 PER과 PEG 컬럼이 표시됩니다
- PER: 주가를 주당순이익으로 나눈 값 (낮을수록 저평가)
- PEG: PER을 성장률로 나눈 값 (1 미만이면 성장 대비 저평가)
- 데이터가 없는 경우 "-"로 표시됩니다
-
재무 차트
- 각 종목의 최근 8분기 매출/EPS 트렌드 시각화
- 성장 패턴을 한눈에 확인 가능
- 데이터는 매일 업데이트 (수동:
yarn etl:daily-prices) - GitHub Actions 스케줄: 23:30 UTC(= KST 08:30) 단일 스케줄로 prices → MA/RS → ratios → breakout-signals → noise-signals → alerts 순차 실행
- 분기별 재무 데이터는
yarn etl:quarterly-financials실행 - RS 점수는 가격 데이터 기반으로
yarn etl:rs(최신일) 또는yarn etl:rs-backfill(최근 1년) 실행 - 일일 밸류에이션(PER/PEG 등)은
yarn etl:daily-ratios실행 (FMP TTM API 사용) - 돌파매매 신호:
yarn etl:breakout-signals실행 (확정 돌파/완벽 재테스트 신호 계산) - 노이즈 필터 신호:
yarn etl:noise-signals실행 (거래량/VCP/캔들몸통/이평선밀집 신호 계산) - 가격 알림 감지:
yarn etl:detect-alerts실행 (일일 가격/이동평균 ETL 완료 후 자동 실행)
yarn dev # 개발 서버
yarn build # 빌드
yarn test # 테스트 실행
yarn test:all # 테스트 + 빌드 모두 실행
yarn feature:checklist # 피쳐 개발 체크리스트 확인
yarn etl:daily-prices # 주가 업데이트
yarn etl:daily-ma # 이동평균선 계산
yarn etl:cleanup-invalid-symbols # 비정상 종목 정리
yarn etl:rs # RS(12M/6M/3M 가중) 계산
yarn etl:rs-backfill # RS 최근 1년치 백필
yarn etl:daily-ratios # 일일 밸류에이션 (PER/PEG 등)
yarn etl:breakout-signals # 돌파매매 신호 계산 (확정 돌파/완벽 재테스트)
yarn etl:noise-signals # 노이즈 필터 신호 계산 (거래량/VCP/캔들몸통/이평선밀집)
yarn etl:detect-alerts # 가격 알림 감지 및 전송
# 모바일(Expo) 개발
yarn dev:mobile # Expo dev 서버
yarn workspace mobile ios # iOS (Xcode 필요)
yarn workspace mobile android # Android 에뮬레이터/디바이스새로운 피쳐를 개발할 때는 다음 워크플로우를 따르세요:
- 브랜치 생성 →
git checkout -b feature/<name>(새 작업은 항상 별도 브랜치에서 시작) - 스펙/플랜/태스크 작성 →
.specify/templates/feature-template.md를 참고해.specify/specs/[feature-name]/spec.md에 작성 - 구현 순서 → 백엔드 → 프론트엔드 → 타입
- 셀프 리뷰 → 작성 코드를 "PR 리뷰어 관점"으로 검토
- 테스트 → 단위 → API → 컴포넌트 (
yarn test,yarn test:all) - 문서화 → README/spec/plan/tasks 동시 업데이트
- 빌드 테스트 →
yarn build(또는yarn test:all)
추가 가이드:
docs/FEATURE_DEVELOPMENT_WORKFLOW.md- 피쳐 개발 워크플로우 및 3단계 검증 프로세스docs/CODE_REVIEW_CHECKLIST.md- 코드 리뷰 체크리스트 (리팩토링 체크리스트 포함)docs/TESTING.md- 테스트 가이드docs/FRONTEND_PRACTICES.md- 프론트엔드 품질 원칙docs/AI_AGENT_GUIDE.md- AI 에이전트 가이드: 프로젝트 분석 & 비즈니스 이해
src/
├── app/ # Next.js 페이지들
│ ├── api/ # API 엔드포인트
│ │ └── alerts/ # 가격 알림 API
│ ├── alerts/ # 가격 알림 목록 페이지
│ └── screener/ # 스크리너 페이지들
├── components/ # 재사용 컴포넌트
│ └── alerts/ # 알림 관련 컴포넌트
├── db/ # 데이터베이스
├── etl/ # 데이터 처리 작업들
└── utils/ # 유틸리티