e33dffb0e143945f3d1f04e792abf3ce2bf0435f
/hot/validate: 키움 거래량급증(ka10023) 종목을 ETF/파생·초소형(작전)·영업적자· 분식의심(Beneish≥50)·음수점수로 걸러 '검증통과'만 추림. 평일 09:35 통과분 1회 보고. 현재 핫 30개 중 77%가 ETF/파생 노이즈로 확인. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Trading AI
워렌 버핏 스타일 가치투자 관점의 한국 주식 AI 분석 파이프라인. 뉴스·공시·재무·기술적 지표·미증시 동조 시그널을 통합해 종목별 종합 점수와 매수/매도 추천을 산출하고 텔레그램으로 전달한다.
파이프라인
[뉴스 RSS/네이버] → 형태소(바른) → 임베딩(bge-m3) → 중복제거(Qdrant) → 분석(EXAONE)
↓
[DART 공시/재무] → 재무비율(ROE·OPM·DR·FCF) → ┐
[네이버 주가] → 기술지표(MA/RSI/MACD/볼밴) → ┤
[미국 ETF/페어] → 섹터·페어 회귀 시그널 → ┼→ 종합 스코어링 → 추천 → 텔레그램
[ECOS 매크로] → USD/KRW·국고채10년 → ┤ (10공식 앙상블)
[그래프 신경망] → GAT 다음날 수익률 예측 → ┘
서비스 구성 (Docker Compose)
| 서비스 | 포트 | 역할 |
|---|---|---|
news-collector |
8787 | 뉴스 수집 + 형태소/임베딩/중복제거/EXAONE 분석 |
bareunaapi |
5757 | 한국어 형태소분석 FastAPI 래퍼 |
bareun |
5656/9902 | 바른 NLP gRPC 서버 |
dart-collector |
8888 | DART 공시/재무제표 수집 |
score-engine |
8686 | 종합 점수 계산 + 텔레그램 브리핑 |
ta-engine |
8484 | 기술적분석 (MA/RSI/MACD/볼밴/스토캐스틱) |
aux-signal |
8282 | 컨센서스·기관/외국인 수급·ECOS 매크로 |
us-market |
8383 | 미증시 섹터 ETF·페어 회귀 시그널 |
graph-engine |
9090 | GAT 그래프 신경망 (graph_score) |
kis-api |
8585 | 네이버모바일 주가 + 매매시그널 |
dashboard-api |
8989 | 대시보드 REST API + HTML |
telegram-bot |
- | /buy /sell /stock /deep /market 명령 처리 |
ollama |
11434 | EXAONE 3.5 7.8B 추론 + bge-m3 임베딩 |
n8n / worker |
5678 | 워크플로우 자동화 |
postgres |
5432 | 메인 DB |
redis |
6379 | 캐시·중복제거 |
qdrant |
6333 | 뉴스 벡터 유사도 필터 |
점수 산출
종합점수 = 펀더멘털통합 × 0.24
+ 뉴스(catalyst 가중) × 0.18
+ 기술 × 0.15
+ DART 공시 × 0.10
+ 외국인 수급 × 0.14
+ 공매도 × 0.06
+ 가격 모멘텀 × 0.03
+ DCF 안전마진 × 0.10
+ 시장 레짐 보정 (±5~10)
+ 앙상블 보팅 (±18) ← 10공식 매수/매도 합 × 학습 가중치
10공식 앙상블 보팅 (각 공식이 독립 신호 발신, 백테스트 회귀로 가중치 학습):
| 공식 | 출처 | 매수 신호 조건 |
|---|---|---|
| 매직포뮬러 | Greenblatt | ROC + EY ≥ 20 |
| F-Score | Piotroski 2000 | 7신호 ≥ 6 |
| 알트만 Z | Altman 1968 | Z ≥ 2.6 |
| PEG | Lynch GARP | PER / 이익성장률 ≤ 1.5 |
| 12-1 모멘텀 | AQR (Carhart) | (P_-21 / P_-252) − 1 ≥ 10% |
| Beneish M | Beneish 1999 | 의심도 < 50 + CFO/NI > 1 |
| GP/A | Novy-Marx 2013 | 영업이익/총자산 ≥ 15% |
| G-Score | Mohanram 2005 | 5신호 vs 섹터 중앙값 ≥ 4 |
| Amihud | Amihud 2002 | 비유동성 ≥ 100 (소형 알파) |
| BAB(베타) | Frazzini-Pedersen | β < 0.7 (저베타 알파) |
버핏 가치투자 필터 (is_value_investable):
- 영업이익 > 0
- ROE ≥ 10%
- 부채비율 ≤ 200%
- PER ≤ 60
- 시총 ≥ 100억
dart_corps.is_active = true(상장폐지 제외)
추천 등급 (점수 + 다수 공식 동의 강제):
- 강력매수: ≥ 70 AND 매수 보팅 ≥ 3
- 매수관심: ≥ 40 AND 매수 보팅 ≥ 1 AND 매도 보팅 < 2
- 매도관심: ≤ −30 OR 매도 보팅 ≥ 3
- 강력매도: ≤ −60 OR 매도 보팅 ≥ 4
- 그 외 관망
빠른 시작
사전 요구사항
- Ubuntu 22.04, Docker / Docker Compose
- GPU 2장 (GPU0: EXAONE 추론용 ≥12GB / GPU1: bge-m3 임베딩용 ≥8GB)
- NAS NFS 마운트 (
/mnt/nas) — PostgreSQL 데이터 영속화용
환경변수
.env 파일 생성 (예시):
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_DB=trading_ai
POSTGRES_USER=kyu
POSTGRES_PASSWORD=...
REDIS_PASSWORD=...
REDIS_MAX_MEMORY=2gb
DART_API_KEY=...
ECOS_API_KEY=...
FINNHUB_API_KEY=...
TELEGRAM_BOT_TOKEN=...
TELEGRAM_CHAT_ID=...
OLLAMA_NUM_PARALLEL=4
QDRANT_COLLECTION=news_vectors
QDRANT_VECTOR_SIZE=1024
실행
docker compose up -d
docker compose ps # 전체 상태
docker logs trading-score-engine -f # 로그 추적
초기 데이터 로딩
# DART 기업목록 수집
curl -X POST http://localhost:8888/collect/corps
# 다년치 사업보고서 백필 (F-Score·PEG용, years≥2 필수)
curl -X POST 'http://localhost:8888/collect/financials?count=3000&years=10&annual_only=true'
# 섹터 정보 채우기
curl -X POST http://localhost:8888/collect/sectors
# 점수 수동 재계산
curl -X POST http://localhost:8686/score/calculate
# 백테스트 기반 공식 가중치 학습
curl -X POST 'http://localhost:8686/learn-weights?days=90'
주요 API
추천 / 랭킹
# 오늘의 추천 종목
docker exec trading-postgres psql -U kyu -d trading_ai -c "
SELECT s.stock_code, d.corp_name, s.total_score, s.recommendation,
s.magic_score, s.f_score, s.buy_votes, s.sell_votes
FROM stock_scores s JOIN dart_corps d ON d.stock_code=s.stock_code
WHERE d.is_active=true AND s.score_date=CURRENT_DATE
ORDER BY s.total_score DESC LIMIT 10;"
# REST
curl http://localhost:8686/recommendations
curl http://localhost:8686/stock/005930 # 삼성전자
curl http://localhost:8686/backtest # 추천 성과 백테스트
curl http://localhost:8484/technical/005930 # 기술분석
curl http://localhost:8989/api/summary # 대시보드 요약
학습 / 예측
curl -X POST 'http://localhost:8686/learn-weights?days=90'
curl http://localhost:8686/learn-weights
curl -X POST http://localhost:8686/learn-pricing
curl http://localhost:8686/predict-price/005930
데이터베이스 핵심 테이블
| 테이블 | 설명 |
|---|---|
news_analysis |
분석된 뉴스 (sentiment / intensity / catalyst) |
news_raw |
수집/분석 분리용 임시 저장소 |
dart_corps |
DART 기업목록 (is_active=true 필터 필수) |
dart_financials |
재무제표 + 비율 (ROE / OPM / DR / FCF) |
stock_scores |
일별 종합 점수 + 10공식 신호 + 가중치 |
stock_technical |
기술지표 + 매매신호 |
weight_config |
공식별 학습 가중치 (자동 갱신) |
pricing_model |
30일 수익률 회귀/RF 모델 메타 |
상세 스키마는 CLAUDE.md 참고.
디렉토리 구조
trading/
├── CLAUDE.md # 프로젝트 상세 가이드 (Claude Code용)
├── docker-compose.yml # 전체 서비스 정의
├── init-db.sql # 초기 스키마
├── news-collector/ # 뉴스 수집·분석
├── bareunaapi/ # 형태소분석 래퍼
├── dart-collector/ # DART 공시·재무
├── score-engine/ # 종합 스코어링
├── ta-engine/ # 기술적 분석
├── aux-signal/ # 컨센서스·수급·매크로
├── us-market/ # 미증시 동조 시그널
├── graph-engine/ # GAT 그래프 신경망
├── kis-api/ # 주가 수집
├── dashboard-api/ # 대시보드 REST
├── telegram-bot/ # 텔레그램 봇
└── scripts/ # 설치/상태 스크립트
주의사항
- 모든 추천 쿼리에
WHERE d.is_active=true필수 (상장폐지 제외). - NAS fstab은 반드시 한 줄,
nfsvers=3옵션 필수. - Ollama 단일 컨테이너가 GPU0·GPU1을 동시 사용.
runtime: nvidia필요. .env/pg_backup//models/등 민감 자산은.gitignore처리됨.
라이선스
내부 프로젝트.
Description
Languages
Python
80.5%
HTML
16.3%
JavaScript
1.4%
Shell
1.4%
Dockerfile
0.4%