Files
kyu 70de874ae1 Add README.md
프로젝트 개요·파이프라인·서비스 표·점수 산출 공식·빠른 시작·API 예시·
DB 핵심 테이블·디렉토리 구조 정리.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 21:53:56 +09:00

233 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```
### 실행
```bash
docker compose up -d
docker compose ps # 전체 상태
docker logs trading-score-engine -f # 로그 추적
```
### 초기 데이터 로딩
```bash
# 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
### 추천 / 랭킹
```bash
# 오늘의 추천 종목
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 # 대시보드 요약
```
### 학습 / 예측
```bash
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` 처리됨.
---
## 라이선스
내부 프로젝트.