Thanks to visit codestin.com
Credit goes to github.com

Skip to content

sossost/stock-screener

Repository files navigation

📈 Stock Screener

개인 투자용으로 만든 주식 스크리닝 도구입니다. 기술적 분석과 펀더멘털 분석을 간단하게 확인할 수 있어요.

구조 참고: 모노레포 루트 아래 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인 종목만 표시
    • 가격 필터 (돌파매매): EOD(종가) 데이터 기준으로 어제 거래일의 가격 패턴을 분석
      • 확정 돌파 전략: EOD 기준으로 어제 캔들이 최근 20일 고점을 돌파하면서 거래량이 20일 평균의 2배 이상이고, 윗꼬리가 전체 캔들 길이의 20% 이내인 종목만 필터링
      • 완벽 재테스트 전략: 정배열(MA20 > MA50 > MA200) + 과거 310일 사이 신고가 돌파 이력이 있고, 어제 종가가 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 (신호등, 전략 카드, 경고/근거)
      • 하루 캐싱으로 빠른 응답

📝 매매일지 (Trading Journal)

  • 수기 매매일지: 분할 매수/매도, 피라미딩, 트레일링 스탑 등 매매 내역 기록
    • 신규 매매 생성 (진입가, 손절가, n차 목표가, 전략 태그)
    • 분할 매수/매도 기록 (날짜, 가격, 수량, 메모)
    • 자동 계산: 평단가, 보유수량, 손익금, 수익률, R-Multiple
    • 수수료율 설정 (개인화, localStorage 저장)
    • 자동 완료 처리: 모든 보유 수량 매도 시 자동으로 완료 처리
  • 포지션 현황: 현재 보유 포지션 정보 표시
    • 포지션 총합: 현재가 × 수량 (시가평가)
    • 원금 + 미실현 손익 + 수익률 표시
    • 포지션별 비중 표시
    • 포지션 할당 파이 차트 및 수익 흐름(PnL) 그래프
  • 진행중/완료 탭: URL 기반 상태 관리로 브라우저 뒤로가기 지원
    • 진행중/완료 거래 개수 표시
    • 완료된 거래 필터링: 전체/수익/손실
    • 필터별 총 손익 표시
  • 진행중 매매 테이블:
    • 현재가 컬럼: 전일대비 변동률 표시 ($123.45 (+2.3%))
    • 실현손익 컬럼: 이미 실현한 손익 표시 (미실현손익 오른쪽)
  • 가격 바 차트: 손절가 ~ 목표가 시각화
    • 손절가, 평단가, 현재가, n차 목표가를 점으로 표시
    • 현재가 위치 + 평단가 대비 손익 퍼센트 표시
    • 호버 팝업: 현재가가 목표가보다 높으면 현재가를 레전드 가장 오른쪽에 배치
  • 매매 복기: 종료 시 실수 태그 + 리뷰 노트 기록
  • 통계 대시보드: 승률, 평균 R-Multiple, 실수 유형별 분석
    • 수익 흐름(PnL) 차트: 완료된 매매들의 실현손익 누적 그래프 (1개월/3개월/전체)

💼 관심종목 (Watchlist)

  • 관심종목 기능: 관심 종목을 저장하고 관리
    • 스크리너에서 종목을 관심종목에 추가/제거
    • 세션 기반 저장 (쿠키 사용)
    • 관심종목 페이지에서 저장된 종목의 재무 데이터 확인
    • 서버 사이드 렌더링으로 빠른 로딩

🔔 가격 알림 시스템 (Price Alerts)

  • 자동 알림 감지: ETL 실행 시 특정 기술적 조건을 만족하는 종목을 자동으로 감지
    • 알림 조건: 정배열 상태에서 20일선 돌파 감지
      • 정배열 조건: MA20 > MA50 > MA200
      • 돌파 조건: 전일 종가 < MA20, 오늘 종가 > MA20
    • 중복 방지: 같은 종목, 같은 날짜에 대해 하루 1회만 알림
  • 이메일 알림: 감지된 종목을 종합 이메일로 전송
    • 종목별 상세 정보 (티커, 회사명, 섹터, 시가총액, 돌파율 등)
    • 클릭 가능한 링크로 종목 상세 페이지 이동
  • 모바일 푸시 알림: 모바일 앱으로 푸시 알림 전송
    • 종합 알림 형식 (여러 종목 → 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 (배포)

📊 데이터는 어떻게?

  1. 미국 주식 심볼 가져오기 (NASDAQ, NYSE, AMEX)
  2. 일일 주가 데이터 수집
  3. 분기별 재무 데이터 수집
  4. 이동평균선 계산
  5. RS 점수 계산 (12M/6M/3M 가중)
  6. 돌파매매 신호 계산 (daily_breakout_signals 테이블)
  7. 노이즈 필터 신호 계산 (daily_noise_signals 테이블)
  8. 비정상 종목들 (워런트, ETF 등) 제거

🚀 어떻게 실행하나요?

1. 클론하고 설치

git clone https://github.com/your-username/screener.git
cd screener
yarn install

2. 환경변수 설정

apps/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는 기본 서비스로 토큰 불필요

3. 데이터베이스 설정

yarn db:push
yarn etl:symbols
yarn etl:daily-prices
yarn etl:daily-ma

4. 실행

yarn dev
# lint 체크
yarn lint

🧪 테스트

# 모든 테스트 실행
yarn test

# Watch 모드 (파일 변경 시 자동 실행)
yarn test:watch

# UI 모드 (브라우저에서 결과 확인)
yarn test:ui

# 테스트 + 빌드 모두 실행
yarn test:all

자세한 내용은 docs/TESTING.md 참고

📝 사용법

주식 스크리너 사용법

  1. 티커 검색 필터

    • 필터 라인 오른쪽 끝에 검색 인풋이 표시됩니다
    • 티커의 일부를 입력하면 해당 티커가 포함된 종목만 테이블에 표시됩니다
    • 예: "NV" 입력 → NVDA, NVDL 등 "NV"가 포함된 종목만 표시
    • 검색어를 지우면 모든 종목이 다시 표시됩니다
    • 다른 필터와 함께 사용 시 AND 조건으로 동작합니다
  2. 필터박스 사용법

    • 화면 상단에 이평선/성장성/수익성 필터박스가 표시됩니다
    • 각 필터박스를 클릭하면 해당 카테고리의 필터만 팝업으로 표시됩니다
    • 필터박스에 현재 적용된 필터 요약이 표시됩니다
  • 필터 자동 저장: 필터를 적용하면 자동으로 localStorage에 저장되어 다음 접근 시 자동 적용됩니다
    • URL 파라미터가 없을 때: localStorage에 저장된 필터가 자동 적용됩니다
    • URL 파라미터가 있을 때: URL의 필터가 우선 적용됩니다 (공유 링크 등)
  • 테이블 정렬 자동 저장: 테이블 헤더를 클릭하여 정렬을 변경하면 자동으로 저장되어 새로고침 후에도 유지됩니다
  1. 이평선 필터

    • 정배열 필터: 체크박스로 활성화/비활성화 가능
      • 활성화 시: MA20 > MA50 > MA100 > MA200 조건을 만족하는 종목만 표시
      • 비활성화 시: 모든 종목 표시 (정배열 조건 무시)
    • Golden Cross 필터: 체크박스로 활성화/비활성화 가능
      • 활성화 시: MA50 > MA200 조건을 만족하는 종목만 표시
    • 정배열 옵션 (정배열 필터 활성화 시):
      • "전체 정배열": 현재 정배열 상태인 종목
      • "최근 전환": 최근 N일 내에 정배열로 전환한 종목
      • 기간 입력: 1-60일 (최근 전환 선택 시)
  2. 성장성 필터 (매출/수익)

    • 연속 성장 분기 수 모드:
      • 체크박스 활성화 후 분기 수 입력 (2-8분기)
      • 예: "매출 4분기 연속 상승" → 최근 4분기 동안 매출이 계속 증가한 기업
    • 평균 성장률 모드:
      • 체크박스 활성화 후 성장률 % 입력 (0-1000%)
      • 예: "매출 평균 성장률 30% 이상" → 최근 N분기 동안 평균 성장률이 30% 이상인 기업
    • 저평가 필터 (PEG < 1):
      • 체크박스 활성화 시 PEG가 0 이상 1 미만인 종목만 표시
      • 성장 대비 저평가인 종목을 선별하는 데 유용
    • 두 모드를 조합하여 사용 가능 (예: "4분기 연속 상승" + "평균 25% 이상" + "PEG < 1")
  3. 수익성 필터

    • 전체 / 흑자 / 적자 기업 구분
    • 최근 흑자 전환: 가장 최근 분기 EPS가 양수이고 직전 분기 EPS가 0 이하인 기업만 포함 (EPS 데이터 2분기 미만이면 제외)
    • 사용법: 수익성 필터 팝업에서 체크박스를 켠 뒤 닫기 → 다른 필터와 AND 조건으로 동작
  4. 밸류에이션 지표 (PER/PEG)

    • 테이블에 PER과 PEG 컬럼이 표시됩니다
    • PER: 주가를 주당순이익으로 나눈 값 (낮을수록 저평가)
    • PEG: PER을 성장률로 나눈 값 (1 미만이면 성장 대비 저평가)
    • 데이터가 없는 경우 "-"로 표시됩니다
  5. 재무 차트

    • 각 종목의 최근 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 에뮬레이터/디바이스

🚀 새로운 피쳐 개발하기

새로운 피쳐를 개발할 때는 다음 워크플로우를 따르세요:

  1. 브랜치 생성git checkout -b feature/<name> (새 작업은 항상 별도 브랜치에서 시작)
  2. 스펙/플랜/태스크 작성.specify/templates/feature-template.md를 참고해 .specify/specs/[feature-name]/spec.md에 작성
  3. 구현 순서 → 백엔드 → 프론트엔드 → 타입
  4. 셀프 리뷰 → 작성 코드를 "PR 리뷰어 관점"으로 검토
  5. 테스트 → 단위 → API → 컴포넌트 (yarn test, yarn test:all)
  6. 문서화 → README/spec/plan/tasks 동시 업데이트
  7. 빌드 테스트yarn build (또는 yarn test:all)

추가 가이드:

📁 폴더 구조

src/
├── app/                    # Next.js 페이지들
│   ├── api/               # API 엔드포인트
│   │   └── alerts/        # 가격 알림 API
│   ├── alerts/            # 가격 알림 목록 페이지
│   └── screener/          # 스크리너 페이지들
├── components/            # 재사용 컴포넌트
│   └── alerts/            # 알림 관련 컴포넌트
├── db/                   # 데이터베이스
├── etl/                  # 데이터 처리 작업들
└── utils/               # 유틸리티

About

미국주식 스크리너

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published