docs: Refactor CLAUDE.md to concise hierarchical format (1.1, 1.2...)

This commit is contained in:
2026-02-24 12:32:58 +09:00
parent 8b27b9cbb0
commit 7143fbda9c

186
CLAUDE.md
View File

@@ -1,145 +1,135 @@
# Auto Stock Trading System — Claude 컨텍스트 가이드 # Auto Stock Trading System — Claude Context Guide
> 이 문서는 Claude AI가 자동매매 시스템의 전략과 규칙을 깊이 이해하고, > **Core Directive**: This document defines the strategies, rules, and architecture for the system. All code modifications and analysis must strictly adhere to these guidelines.
> 코드 수정·전략 분석·백테스트 요청 시 올바른 판단을 내리기 위한 컨텍스트 문서다.
> 모든 코드 변경은 이 문서를 기준으로 이루어져야 한다.
--- ---
## 1. 프로젝트 개요 ## 1. Project Overview
이 시스템은 한국·미국 주식을 대상으로 동작하는 풀스택 자동매매 플랫폼이다. 한국투자증권(KIS) REST/WebSocket API와 연동하여 모의·실전 환경을 `.env` 설정 하나로 전환할 수 있다. AI 판단 레이어로는 Claude 3.5 Sonnet과 Gemini 2.0 Flash를 지원하며, 이 역시 `.env`의 `AI_PROVIDER` 값으로 즉시 교체된다. ### 1.1 Tech Stack
- **Backend**: Python 3.11, FastAPI, SQLAlchemy (Async), PostgreSQL, Redis
- **Frontend**: React, TypeScript, Vite, Recharts
- **Infrastructure**: Docker Compose, Nginx
- **AI Layer**: Claude 3.5 Sonnet / Gemini 2.0 Flash (Switch via `.env`)
- **Integration**: KIS REST/WebSocket API, MCP Server (stdio)
백엔드는 Python 3.11 + FastAPI + SQLAlchemy(async) + PostgreSQL + Redis 조합으로 구성되어 있고, 프론트엔드는 React + TypeScript + Vite + Recharts로 만들어진 실시간 대시보드다. Claude CLI와의 연동은 별도의 MCP 서버(stdio 방식)가 담당하며, 전체 인프라는 Docker Compose + Nginx로 묶어서 운영한다. ### 1.2 Environment (`.env`)
- **AI_PROVIDER**: `gemini` or `claude`
개발 환경 포트 배정은 다음과 같다. FastAPI 백엔드는 8000번, MCP 서버는 8001번, Vite 프론트엔드는 5173번, PostgreSQL은 Docker 내부 5432·외부 55432번, Redis는 6379번을 사용한다. - **KIS_MODE**: `virtual` or `real`
- **TOKEN_SAVE_MODE**: `true` (Compresses JSON, limits chart data to 30 days)
--- ---
## 2. 디렉터리 구조 ## 2. Directory Structure
프로젝트 루트 아래에는 `backend/`, `frontend/`, `mcp-server/`, `docker/`, `docs/`, `tests/`, `scripts/` 디렉터리가 존재한다. ### 2.1 Backend (`backend/app/`)
- **API**: `api/endpoints/` (Market data, Portfolio, Trades)
- **Core**: `market_data.py`, `portfolio.py`, `trades.py`
백엔드의 핵심 로직은 `backend/app/` 안에 집약되어 있다. API 엔드포인트는 `api/endpoints/` 아래에 기능별로 분리되어 있으며, 주요 파일로는 시세 조회(`market_data.py`), 포트폴리오 관리 및 ATR 기반 청산(`portfolio.py`), 주문·체결 처리(`trades.py`), 규칙 기반 추천과 자동매매(`recommendations.py`), 매매 규칙 CRUD(`trading_rules.py`), 리스크 관리(`risk_management.py`), ML 앙상블 엔드포인트(`ml_ensemble.py`), 모니터링(`monitoring.py`)이 있다. ### 2.2 Services (`backend/app/services/`)
- **Strategies**: `mean_reversion_strategy.py` (v2), `short_term_strategy.py`, `kosdaq_scanner.py`
- **Analysis**: `feature_engineering.py`, `ml_ensemble.py`, `tensorflow_predictor.py`
- **Risk & Utils**: `risk_management.py`, `loss_tracker.py`, `mdd_manager.py`
- **Architecture**: `db_worker.py` (Async DB Writer)
전략 로직은 `services/` 아래에 모여 있다. RSI+볼린저 평균회귀 전략은 `mean_reversion_strategy.py`(v2)가 담당하고, 코스닥 전종목 스캐너는 `kosdaq_scanner.py`, 15분봉 단기 전략은 `short_term_strategy.py`가 각각 구현한다. 그 외에 MDD 관리(`mdd_manager.py`), 연속 손실 추적(`loss_tracker.py`), 피처 엔지니어링(`feature_engineering.py`), ML 앙상블(`ml_ensemble.py`), TensorFlow 예측(`tensorflow_predictor.py`), **DB 락을 방지하는 전용 비동기 워커(`db_worker.py`)**도 같은 디렉터리에 위치한다. ### 2.3 MCP (`mcp-server/`)
- `stdio_server.py`, `auto_trade_claude.py`, `trade_monitor.py`
MCP 서버는 `mcp-server/` 아래에서 독립적으로 동작한다. `stdio_server.py`가 Claude CLI와의 stdin/stdout 통신을 처리하고, `auto_trade_claude.py`와 `trade_monitor.py`가 실제 매매 판단과 모니터링을 수행한다.
--- ---
## 3. 환경 설정 (.env) ## 3. Architecture Principles (Critical)
`.env` 파일은 절대 커밋하지 않는다. API 키와 비밀 정보가 포함되어 있기 때문이다. 대신 `.env.example`을 참고하여 로컬에서 직접 생성해야 한다. ### 3.1 Separation of Concerns
- **Real-time Layer**: Handles API callbacks, Websocket broadcasts, and memory caching. **Zero DB I/O allowed.**
- **Persistence Layer**: Handles DB INSERT/UPDATE operations via background workers.
주요 환경변수는 다음과 같다. `AI_PROVIDER`는 `gemini` 또는 `claude`로 설정하여 AI 판단 엔진을 전환한다. `TOKEN_SAVE_MODE=true`로 설정하면 Claude API 토큰 소비를 줄이기 위해 뉴스 수를 3개로 제한하고, 차트 데이터를 30일치만 전송하며, JSON을 압축 포맷으로 직렬화한다. `KIS_MODE`는 `virtual`(모의)과 `real`(실전)을 지원한다. ### 3.2 Async DB Worker Rule
- **Direct DB Access Ban**: Never call `AsyncSessionLocal()` or `commit()` inside API callbacks or real-time schedulers.
코스닥 스캐너와 단기 전략에 관련된 설정도 있다. `SCANNER_MARKET`은 `KOSDAQ`, `KOSPI`, `ALL` 중 하나를 선택하고, `SCANNER_INTERVAL`은 스캔 주기를 분 단위로 설정한다. `SHORT_TERM_CAPITAL_RATIO`는 단기 전략에 배분할 자본 비율로, 최대 0.25(25%)를 넘어서는 안 된다. - **Queue Usage**: All data persistence (Trade history, Analysis results) must be sent to `db_task_queue` in `db_worker.py`.
- **Worker**: The background worker processes the queue and handles safe DB transactions sequentially.
--- ---
## 4. 코딩 규칙 및 아키텍처 원칙 (핵심) ## 4. Coding Guidelines
코드 수정 시 가장 중요한 원칙은 기존 함수·클래스의 시그니처를 변경하지 않는 것이다. 새로운 전략이나 기능을 추가할 때는 반드시 별도의 파일이나 클래스로 분리하고, 파일명에 `_v2`, `_v3` 같은 버전 접미사를 붙인다. ### 4.1 Stability
- **No Breaking Changes**: Never alter existing function/class signatures.
- **Versioning**: Use `_v2`, `_v3` suffixes for new strategy implementations.
`json.dumps`는 직접 사용하지 않는다. 코드베이스 전체에서 `_dumps()` 헬퍼 함수(`core/json_helpers.py`)를 통해 JSON을 직렬화해야 한다. 이 헬퍼는 `TOKEN_SAVE_MODE`가 활성화된 경우 자동으로 compact 포맷을 적용하여 Claude API 호출 시 토큰 소비를 줄여준다. ### 4.2 Optimization
- **JSON Handling**: Always use `core.json_helpers._dumps()` instead of `json.dumps`.
**[아키텍처 원칙: DB I/O와 실시간 API 처리 분리]** - **Prompt Engineering**: Minimize tokens, use compact formats.
DB 병목, 트랜잭션 충돌, 매매일지 누락을 방지하기 위해 **"실시간 처리/API 응답"과 "DB 영속화"를 철저히 분리**한다.
- 체결 콜백 등 실시간 스레드에서 직접 `AsyncSessionLocal()`을 열어 INSERT/UPDATE 하지 않는다.
- 데이터 삽입/갱신 작업은 `app.services.db_worker`의 `db_task_queue`에 던져서 백그라운드 워커가 순차적으로 처리하게 한다.
- 메인 스케줄러(`auto_trade_scheduler`)는 무거운 DB 조회를 최소화하고 메모리 캐시를 우선 참조해야 한다.
AI 프롬프트는 간결하게 작성한다. 필수 필드만 명시하고, JSON 예시는 최소화해야 한다. 변경 단위는 작게 유지하는 것을 원칙으로 하며, 큰 기능 변경보다 작고 검증 가능한 단위로 나누어 커밋한다.
--- ---
## 5. 포지션 및 리스크 규칙 ## 5. Risk Management Rules
### 포지션 크기 ### 5.1 Position Sizing
- **Max Allocation**: 3-4% of total capital per stock.
- **Max Count**: 20-25 stocks max.
- **Leverage**: Max 20% of total capital for Inverse/Leveraged ETFs.
종목당 최대 투자 비중은 전체 자본의 3~4%로 제한한다. 동시에 보유할 수 있는 종목 수는 기본 최대 20종목이며, 전략에 따라 최대 25종목까지 허용한다. 레버리지·인버스 ETF는 전체 자본의 20% 이내로만 보유해야 한다. ### 5.2 Stop Loss (SL) & Take Profit (TP)
- **SL Base**: -6% (Stable), -10% (Volatile).
- **SL ATR**: `Entry Price - (2.5 * ATR)`. (Priority over base SL)
- **TP**: Sell 50% at +2R profit.
- **Trailing Stop**: `High - (1.5 * ATR)` for remaining 50%.
### 손절 및 청산 ### 5.3 MDD Control
- **MDD -10%**: Stop new entries. Reduce position sizes by 30%. **Stop Short-term Strategy.**
- **MDD -20%**: Force reduce all positions by 50%. Liquidate leveraged assets first.
기본 손절 기준은 시장 유형에 따라 다르다. ETF·대형주 같은 저변동 종목은 -6%에서 손절하고, 테마주·코스닥 고변동 종목은 -10%에서 손절한다. 단, ATR 기반 손절이 우선 적용된다. 손절가는 `진입가 - 2.5 × ATR`로 계산하며, 변동성이 커지면 손절폭이 자동으로 확대된다. ### 5.4 Filters
- **Price**: > 5,000 KRW (Korea), > $4 (US). (Exceptions: ETFs, REITs)
익절과 트레일링 스탑은 다음과 같이 운용한다. 수익이 2R(2배 ATR) 이상 발생하면 포지션의 절반을 익절하고, 나머지는 `최고가 - 1.5 × ATR`의 트레일링 스탑으로 보호한다. - **Correlation**: Max 3 stocks per sector. Reject entry if correlation > 0.7 with portfolio.
### 포트폴리오 MDD 관리
MDD가 -10%를 돌파하면 신규 진입을 일시 중단하고, 기존 포지션 크기를 30% 축소한다. 이때 단기 전략(15분봉)은 즉시 중단하고 일봉 전략만 유지한다. MDD가 -20%를 돌파하는 극단적 상황에서는 전체 포지션을 50% 강제 축소하며, 레버리지·인버스 포지션을 우선 청산한다.
### 가격 필터 (저가주 제한)
국내 종목은 5,000원 이하의 매수를 금지한다. 단, ETF·리츠·우량 대형 공모주는 화이트리스트로 예외 허용한다. 미국 종목은 4달러 이하의 매수를 금지하며, ETF·리츠는 마찬가지로 예외를 허용할 수 있다.
### 섹터 상관관계 필터
동일 섹터 내 보유 종목은 최대 3개로 제한한다. 기존 보유 종목과의 상관계수가 0.7 이상인 종목은 신규 진입을 차단한다. 상관관계 행렬은 매주 업데이트하여 Redis에 캐싱한다.
--- ---
## 6. RSI + 볼린저 평균회귀 전략 v2 ## 6. Strategy A: RSI + Bollinger Mean Reversion v2
### 시장 Regime 판단 ### 6.1 Market Regime (Daily)
- **BULL**: KOSPI200 > MA200 AND MA200 Slope > 0.
- **BEAR**: KOSPI200 < MA200 AND MA200 Slope < 0.
- **SIDEWAYS**: ADX < 20 OR Slope ≈ 0. **(Ignore all signals)**
이 전략의 출발점은 코스피200 지수의 200일 이동평균선(MA200)을 이용한 시장 상태 분류다. 현재 지수가 MA200 위에 있고 MA200의 기울기가 양수(상승)이면 상승장(BULL)으로 판단한다. 반대로 지수가 MA200 아래에 있고 기울기가 음수면 하락장(BEAR)이다. ADX가 20 미만이거나 MA200 기울기가 0에 가까운 횡보 상태는 SIDEWAYS로 분류하며, 이 구간에서는 평균회귀 신호가 발생해도 완전히 무시한다. 시장 상태 판별은 매일 장 마감 후 업데이트한다. ### 6.2 Entry Conditions
- **Bull Market**: RSI(14) < 25, Price within BB Lower (-3% to +1.5%), Vol > 20MA.
- **Bear Market**: RSI(14) < 30, Price < BB Lower, Vol > 1.5x 20MA, Reversal candle required.
- **Pre-emptive**: Daily RSI < 40 AND 60m RSI < 30 AND Breakout MA5.
### 매수 조건 ### 6.3 Exit Conditions
- **Partial**: RSI > 50 OR Price > BB Mid OR Profit > 2*ATR.
상승장에서는 RSI(14)가 25 이하이고, 종가가 볼린저 밴드 하단의 -3%에서 +1.5% 구간 안에 있으며, 거래량이 20일 평균 이상일 때 매수 신호가 발생한다. 캔들이 양봉이거나 전일 저가 대비 0.5% 이상 반등한 경우를 추가로 확인한다. 분할 매수는 50%-50% 2회로 진행한다. - **Full**: RSI > 65 OR Price > BB Upper (99%) OR Trailing Stop.
하락장에서는 더 엄격한 조건이 적용된다. RSI(14)가 30 이하이고, 종가가 볼린저 하단 이하이며, 거래량이 20일 평균의 1.5배 이상 급증해야 한다. 여기에 더해 전일 종가보다 높거나 60분봉 전 고가를 돌파하는 되돌림 캔들까지 확인한 후에야 진입한다. 분할 매수는 3회로 나누며, 2일 연속 과매도 상태라면 2회로 축소한다.
복합 타임프레임 선취매도 선택적으로 사용할 수 있다. 일봉 RSI가 40 이하인 관심 종목 중 60분봉 RSI가 30 이하로 떨어지면서 동시에 5일선을 상향 돌파할 때 전체 자본의 10% 이내에서 선취매한다.
### 청산 조건
1차 익절은 RSI(14)가 50 이상으로 회복되거나 종가가 볼린저 중앙선을 상회하거나 수익이 2 × ATR_pct 이상일 때 발동한다. 상승장에서는 40%를 익절하고, 하락장에서는 60% 익절한다.
2차 익절(전량 청산)은 `최고가 - 1.5 × ATR` 트레일링 스탑에 걸리거나, RSI가 65 이상으로 과열되거나, 종가가 볼린저 상단의 99% 이상에 도달할 때 이루어진다.
### 시장 상태별 자본 배분
상승장에서는 이 전략에 최대 70%까지 자본을 배분하여 공격적으로 운용한다. 횡보장에서는 진입 자체를 금지한다. 하락장에서는 최대 30%로 보수적으로 운용하며 자본 보호를 최우선으로 삼는다.
--- ---
## 7. 공격적 전략 — 월 5% 목표 ## 7. Strategy B: Aggressive Growth
이 시스템의 장기 목표는 1천만 원에서 1억 원으로의 성장이다. 순수 복리(월 5%)로 계산하면 48개월(4년)이 걸리지만, 현실에서는 MDD 발생과 신호 부재를 감안하여 7~8년을 목표로 설정한다. 몬테카를로 1,000회 시뮬레이션 기준 10년 내 1억 달성 확률은 82.5%다. ### 7.1 Kosdaq Scanner (Swing)
- **Scope**: All Kosdaq (~1600).
- **Filter**: Price > 5,000 KRW, Top 20% Volume.
- **Score**: `0.5*RSI + 0.3*BB + 0.2*Vol`. Pick Top 20.
- **Allocation**: 25% of Capital.
단일 종목 대기 방식으로는 연 2~4회 신호밖에 얻지 못한다. 이를 보완하기 위해 코스닥 전종목 스캐너(`kosdaq_scanner.py`)와 15분봉 단기 전략(`short_term_strategy.py`)을 병행하여 신호 빈도를 월 10~30회 수준으로 끌어올린다. ### 7.2 Short-term Strategy (15m)
- **Target**: Stocks with Daily RSI < 40.
### 코스닥 전종목 스캐너 - **Entry**: 15m RSI < 30, Price near BB Lower, MA5 Breakout, Vol > 1.3x.
- **Exit**: 15m RSI > 55 OR Profit > 1.5 * ATR(15m).
`KosdaqScanner` 클래스는 장 마감 후 코스닥 전종목(약 1,600종목)을 스캔한다. 가격 5,000원 이상 + 거래대금 상위 20% 필터를 통과한 종목에 대해 `score = RSI점수×0.5 + BB점수×0.3 + 거래량점수×0.2` 공식으로 복합 점수를 산출하고 상위 20종목을 선별한다. 전체 자본의 25%를 이 전략에 배분하며, 월 5~10회 신호를 기대한다. - **Allocation**: Max 25% of Capital. **Disable if MDD < -10%.**
### 15분봉 단기 전략
`ShortTermStrategy` 클래스는 일봉 RSI가 40 이하인 관심 종목에 한해 15분봉 신호를 탐색한다. 15분봉 RSI가 30 이하이고, 종가가 볼린저 하단 근처이며, MA5를 상향 돌파하고, 거래량이 평균의 1.3배 이상일 때 진입한다. 청산은 15분봉 RSI가 55 이상으로 회복되거나 수익률이 1.5 × ATR_15m_pct에 도달할 때 이루어진다. 전체 자본의 25%를 배분하며, 수수료 0.3% + 슬리피지 0.2%를 포함한 백테스트가 반드시 선행되어야 한다. MDD -10% 돌파 시 이 전략은 즉시 중단한다.
### 멀티 전략 자본 배분
세 전략을 동시 운용할 때의 배분 기준은 다음과 같다. RSI+볼린저 일봉 전략(v2)에 50%, 코스닥 스캐너에 25%, 15분봉 단기 전략에 25%를 배분하여 합산 월 4~7%의 수익을 목표로 한다. MDD -10% 구간에서는 단기 전략 배분을 즉시 0%로 환원하고 일봉 전략만 유지한다.
--- ---
## 8. Claude에게 요청 시 주의사항 ## 8. Instructions for Claude
코드를 수정하거나 추가할 때는 반드시 다음 원칙을 지켜야 한다. ### 8.1 Critical Checkpoints
1. **Architecture**: Ensure all DB writes use `db_worker.py`.
2. **Safety**: Always apply Risk Rules (Section 5) to every trade.
3. **Regime**: Do NOT suggest entries in SIDEWAYS regime.
4. **Testing**: No real trading without Backtest + Walk-forward validation.
첫째, 기존 코드의 함수·클래스 시그니처는 절대 변경하지 않는다. 새 기능은 항상 `_v2`, `_v3` 접미사가 붙은 별도 파일이나 클래스로 추가한다. ### 8.2 Response Format
둘째, 백테스트를 거치지 않은 코드를 실전 환경에 즉시 적용해서는 안 된다. 워크포워드 테스트를 포함한 충분한 검증이 선행되어야 한다. - Use `_dumps()` for JSON.
셋째, `json.dumps`를 직접 사용하는 코드는 작성하지 않는다. 반드시 `_dumps()` 헬퍼를 경유해야 한다. - Create new files for new features.
넷째, 포지션 크기·손절가·MDD 규칙·가격 필터 등 리스크 규칙은 어떤 전략에도 예외 없이 기본 적용된다. - Do not modify existing signatures.
다섯째, SIDEWAYS 구간에서 발생한 평균회귀 신호는 코드 레벨에서 무시 처리해야 하며, 사용자에게 진입을 유도하는 응답을 해서는 안 된다.
여섯째, 15분봉 단기 전략의 자본 배분은 전체의 25%를 절대 초과할 수 없다.
일곱째, MDD -10% 돌파 시 단기 전략을 즉시 중단하는 로직이 호출 측에 존재하는지 항상 확인한다.
여덟째, 코스닥 스캐너가 종목을 선별할 때 가격 5,000원 이상 + 거래대금 상위 20% 필터가 반드시 적용되어야 한다.
아홉째, **실시간 처리 로직 내부에서는 DB 세션을 열어 직접 데이터를 넣거나 갱신하지 말 것. 모든 영속성 작업은 전용 비동기 큐(`db_worker.py`)를 통해 우회 처리한다.**
---
*Last updated: 2026-02-24* *Last updated: 2026-02-24*