diff --git a/종합기획서_단타자동매매_v3.md b/종합기획서_단타자동매매_v3.md index 63d0227..c19ec20 100644 --- a/종합기획서_단타자동매매_v3.md +++ b/종합기획서_단타자동매매_v3.md @@ -1,427 +1,301 @@ -# 단타 자동매매 시스템 종합 기획서 v3.0 +# StockBot v3.0 종합기획서 -> 버전: v3.0 (최종 확정) -> 최종 수정: 2026-05-14 -> 인프라: Synology NAS (Container Manager) -> 언어: Python 3.11 -> API: KIS Open API (한국투자증권) -> 알림: Discord Webhook -> AI: Claude Code headless (Docker 컨테이너, 자동 스케줄) +> 최종 수정: 2026-05-27 +> 현재 인프라: 로컬 Windows 작업 스케줄러 +> 이전 예정 인프라: Synology NAS Docker +> 현재 운영 모드: 모의투자 / DRY_RUN 중심 +> 언어: Python 3.11 +> API: KIS Open API +> DB: SQLite +> 알림: Discord Webhook +> AI: Claude/Codex headless 자동 분석 --- -## 0. 핵심 설계 원칙 (절대 불변) +## 0. 핵심 원칙 -1. **감정 0** — 진입/청산은 코드가 결정, AI는 보조 -2. **손절 우선** — AI 긍정 판단과 무관하게 손절 룰 항상 우선 -3. **14:50 강제 청산** — 하드코딩, 어떤 상황에서도 예외 없음 -4. **검증 순서 필수** — 모의투자 3개월 → 실전 전환 조건 충족 → 실거래 -5. **AI 역할 분리** — Claude Code: 장 전 분석 + 장 후 개선 (동일 방식, 시간만 다름) +1. 진입과 청산은 코드가 결정하고, AI는 시장 리뷰와 제안만 담당한다. +2. 손절은 AI 판단과 무관하게 항상 우선한다. +3. `FORCE_EXIT = "14:50"`은 절대 변경하지 않는다. +4. 실거래 전환은 모의투자/드라이런 검증 후 수동 승인한다. +5. 전략 파라미터 변경은 근거를 남기고 승인 후 반영한다. +6. `.env`는 Git에 올리지 않는다. --- -## 1. 확정 사항 요약 +## 1. 현재 구현 상태 -| 항목 | 확정값 | 비고 | -|------|--------|------| -| 증권사 | KIS 한국투자증권 | REST + WebSocket, 모의투자 지원 | -| 인프라 | Synology NAS Docker | Container Manager, 24시간 운영 | -| 언어 | Python 3.11 | KIS 예제 모두 Python | -| DB | SQLite | 단일 파일, 백업 단순 | -| 캐시 | Redis (Docker) | 실시간 시세 캐시 | -| 알림 | Discord Webhook | 단방향, aiohttp POST 5줄 | -| 감시 종목 | 최대 30개 | KIS WebSocket 안정성 기준 | -| 전략 | 변동성 돌파 (K=0.5) | 단순·검증됨 | -| AI 엔진 | Claude Code headless | Docker 컨테이너로 NAS에서 자동 실행 | -| 월 운영비 | Claude Code 구독 요금만 | API 키 별도 불필요 | -| 코드 관리 | Gitea (NAS) | 자동 커밋/리포트 저장 | +| 항목 | 현재 상태 | +|------|-----------| +| 운영 방식 | 로컬 Windows 작업 스케줄러 | +| 봇 실행 | `app/main.py` | +| 전략 | 변동성 돌파 `K=0.5` | +| 시세 수집 | KIS REST 폴링 중심 | +| WebSocket | 차기 과제 | +| Redis | 차기/NAS Docker 과제 | +| DB | `data/stockbot.db` SQLite | +| 학습 데이터 | `entry_snapshots`, `post_entry_snapshots` | +| ML 모델 | 관찰 모드, 진입 차단/수량 조절에는 미사용 | +| 복구 설치 | `Restore_StockBot.bat` | --- -## 2. 하루 전체 흐름 +## 2. 현재 전략 파라미터 -``` -08:30 ┌─────────────────────────────────────────────────┐ - │ [컨테이너 1] Claude Code - 장 전 분석 │ - │ │ - │ claude -p " │ - │ 오늘 날짜 기준 뉴스, 수급, 지수 데이터 수집 │ - │ 오늘 단타 전략 판단 (섹터/종목/리스크) │ - │ → daily_context.json 저장 │ - │ " │ - │ │ - │ Discord 전송: │ - │ "[AI분석] 시장:중립 / 반도체 주목 / 금융 회피" │ - └─────────────────────────────────────────────────┘ - ↓ daily_context.json 생성 -08:50 유니버스 30종목 확정 + 목표가 계산 - ↓ -09:00 ┌─────────────────────────────────────────────────┐ - │ [컨테이너 2] 매매 프로그램 시작 │ - │ │ - │ KIS WebSocket → 실시간 시세 수신 │ - │ 변동성 돌파 신호 발생 │ - │ → AI 필터 (daily_context.json 참조) │ - │ → 조건 충족 시 매수 실행 │ - │ │ - │ 청산 우선순위: │ - │ 1순위: 14:50 강제 청산 (절대 불변) │ - │ 2순위: 손절 -1.5% │ - │ 3순위: 1차 익절 +2% (50% 매도) │ - │ 4순위: 2차 익절 +3% (전량) │ - │ 5순위: 120분 경과 시 청산 │ - │ │ - │ Discord 실시간 전송: │ - │ [매수] [손절] [익절1] [익절2] [경고] │ - └─────────────────────────────────────────────────┘ - ↓ -14:50 강제 전량 청산 - ↓ -15:10 ┌─────────────────────────────────────────────────┐ - │ [결산] 오늘 결과 저장 │ - │ │ - │ SQLite → 매매내역 / 손익 / 승률 저장 │ - │ │ - │ Discord 전송: │ - │ "[결산] 매매5회 / 승3패2 / 순손익 +1.2%" │ - └─────────────────────────────────────────────────┘ - ↓ -15:30 ┌─────────────────────────────────────────────────┐ - │ [컨테이너 3] Claude Code - 장 후 피드백 │ - │ │ - │ claude -p " │ - │ 오늘 매매 결과 분석 │ - │ 이상 패턴 감지 (연속손절/비정상수익 등) │ - │ 문제 있으면 app/config.py 수정 │ - │ reports/daily/날짜.md 저장 │ - │ 실전 전환 조건 체크 │ - │ " │ - │ │ - │ Discord 전송: │ - │ "[분석] 오늘 평가 + 수정사항 요약" │ - │ (실전 조건 충족 시) "[🚀실전전환권고]" │ - └─────────────────────────────────────────────────┘ - ↓ -Gitea 수정된 코드 + 리포트 자동 커밋 -``` - ---- - -## 3. 시스템 구성도 - -``` -Synology NAS (Container Manager) -│ -├── [컨테이너] stockbot-main ← 매매 프로그램 (09:00~15:00 상시) -├── [컨테이너] stockbot-redis ← 실시간 시세 캐시 -├── [컨테이너] stockbot-dashboard ← Streamlit 모니터링 (포트 8501) -├── [컨테이너] claude-morning ← 08:30 장 전 분석 (실행 후 종료) -├── [컨테이너] claude-evening ← 15:30 장 후 피드백 (실행 후 종료) -└── [컨테이너] stockbot-killswitch ← 긴급 청산 (수동 트리거) - -외부 연결 -├── KIS WebSocket ← 실시간 체결/호가/VI -├── KIS REST API ← 주문/잔고/수급/순위 -├── 네이버 금융 ← 뉴스 크롤링 -├── Discord Webhook ← 단방향 알림 -└── Gitea (NAS) ← 코드 관리 / 리포트 저장 -``` - ---- - -## 4. 폴더 구조 - -``` -/volume1/docker/stockbot/ -│ -├── .env ← API 키 (Git 절대 제외) -├── .env.example ← 키 입력 가이드 -├── docker-compose.yml -├── README.md -├── test_connection.py ← KIS 연결 테스트 -│ -├── app/ ← 매매 프로그램 -│ ├── main.py ← asyncio 메인 루프 -│ ├── config.py ← 전략 파라미터 -│ ├── Dockerfile -│ ├── requirements.txt -│ │ -│ ├── ai/ ← Claude Code가 읽고 쓰는 영역 -│ │ └── daily_context.json ← 장 전 분석 결과 (매일 갱신) -│ │ -│ ├── data/ -│ │ ├── universe.py ← 종목 풀 (30개) -│ │ └── collector.py ← WebSocket 시세 수신 -│ │ -│ ├── strategy/ -│ │ ├── base.py -│ │ └── volatility_breakout.py ← 변동성 돌파 + AI 필터 -│ │ -│ ├── risk/ -│ │ └── manager.py ← L1~L5 손실 한도 -│ │ -│ ├── execution/ -│ │ ├── kis_client.py ← KIS REST/WebSocket 래퍼 -│ │ └── order_executor.py ← 주문 전송 -│ │ -│ ├── monitor/ -│ │ ├── notifier.py ← Discord Webhook -│ │ └── dashboard.py ← Streamlit -│ │ -│ └── db/ -│ ├── models.py ← SQLite 스키마 -│ └── repository.py ← DB 접근 -│ -├── claude_morning/ ← 장 전 분석 컨테이너 -│ ├── Dockerfile -│ └── run.sh ← claude -p "..." 실행 스크립트 -│ -├── claude_evening/ ← 장 후 피드백 컨테이너 -│ ├── Dockerfile -│ └── run.sh -│ -├── kill_switch/ -│ └── kill.py ← 긴급 전량 청산 -│ -├── reports/ -│ ├── daily/ ← 매일 자동 생성 (날짜.md) -│ ├── weekly/ ← 매주 자동 생성 -│ └── live_ready/ ← 실전 전환 조건 충족 시 생성 -│ -├── data/ -│ ├── stockbot.db ← SQLite -│ └── universe_cache.json -│ -└── logs/ - ├── trades.log ← 영구 보관 (세금 신고용) - └── claude.log ← AI 판단 이력 -``` - ---- - -## 5. 전략 파라미터 (config.py) +현재 기준 파일: `app/config.py` ```python -# 변동성 돌파 -STRATEGY_K = 0.5 # 변동성 계수 -ENTRY_START = "09:00" +STRATEGY_K = 0.5 +ENTRY_START = "09:15" ENTRY_END = "14:30" -FORCE_EXIT = "14:50" # 절대 변경 불가 -TP1_PCT = 0.02 # 1차 익절 +2% → 50% 매도 -TP2_PCT = 0.03 # 2차 익절 +3% → 전량 -SL_PCT = 0.015 # 손절 -1.5% -MAX_HOLD_MIN = 120 # 최대 보유 120분 +FORCE_EXIT = "14:50" -# 리스크 -POS_SIZE_PCT = 0.20 # 1종목 최대 20% -MAX_POSITIONS = 2 # 동시 최대 2종목 -DAILY_SL_PCT = 0.03 # 일일 손실 한도 -3% -CONSEC_LOSS = 3 # 연속 손절 횟수 한도 +TP1_PCT = 0.020 +TP1_RATIO = 0.70 +TP2_PCT = 0.025 +SL_PCT = 0.020 +MAX_HOLD_MIN = 120 + +TICKER_REENTRY_COOLDOWN_MIN = 60 + +POS_SIZE_PCT = 0.20 +MAX_POSITIONS = 2 +DAILY_SL_PCT = 0.03 +CONSEC_LOSS = 3 + +ENTRY_LIMIT_ENFORCE = False +MAX_DAILY_ENTRIES = 30 +MAX_HOURLY_STOP_LOSS = 4 +ENTRY_PAUSE_WINDOWS = ( + ("11:00", "11:20"), + ("14:00", "15:30"), +) -# AI 필터 AI_CONTEXT_PATH = "data/daily_context.json" -AI_MIN_SCORE = 40 # 감성점수 40 미만 → 거래 중단 +AI_MIN_SCORE = 40 +AI_BOOST_MULTI = 1.5 ``` +### 원 기획 대비 변경된 전략 + +| 항목 | 원 기획 | 현재 구현 | 상태 | +|------|---------|-----------|------| +| 진입 시작 | 09:00 | 09:15 | 2026-05-27 승인 적용 | +| TP1 | +2%, 50% 매도 | +2%, 70% 매도 | 변경됨 | +| TP2 | +3% 전량 | +2.5% 전량 | 변경됨 | +| SL | -1.5% | -2.0% | 변경됨 | +| L3 | 3연속 손절 시 당일 중단 | L3-B 포지션 축소 | 변경됨 | +| 동일 종목 재진입 | 없음 | 60분 쿨다운 | 추가됨 | +| 신규 진입 차단 | 14:30 | 14:00 이후 차단 | 구현상 강화 | +| 강제청산 | 14:50 | 14:50 | 유지 | + --- -## 6. 리스크 관리 (L1~L5) +## 3. 리스크 관리 -| 레벨 | 조건 | 동작 | Discord | -|------|------|------|---------| -| L1 | 1회 -1.5% | 즉시 손절 | [손절] | -| L2 | 일일 -3% | 당일 신규 진입 중단 | [경고] | -| L3 | 3연속 손절 | 당일 매매 중단 | [경고] | -| L4 | 주간 -7% | 주말까지 중단 | [경고] | -| L5 | 월간 -15% | 전략 폐기 + Claude Code 재검토 | [긴급] | +### L1-L5 + +| 레벨 | 조건 | 현재 동작 | +|------|------|-----------| +| L1 | 개별 포지션 손절 | 즉시 손절 | +| L2 | 일일 손실 -3% | 신규 매매 중단 | +| L3-B | 연속 손절 | 포지션 크기 단계 축소 | +| L4 | 주간 손실 -7% | 중단 | +| L5 | 월간 손실 -15% | 전략 폐기 및 재검토 | + +### L3-B 포지션 배율 + +| 연속 손절 | 포지션 배율 | +|-----------|-------------| +| 0회 | 1.0 | +| 1회 | 0.7 | +| 2회 | 0.5 | +| 3회 이상 | 0.3 | + +익절 시 연속 손절 카운트는 한 단계만 회복한다. --- -## 7. Claude Code 컨테이너 구성 +## 4. AI 역할 -### 장 전 분석 (08:30) +AI는 두 종류로 나뉜다. -```dockerfile -# claude_morning/Dockerfile -FROM node:20-slim -RUN npm install -g @anthropic-ai/claude-code -WORKDIR /app -COPY run.sh . -CMD ["bash", "run.sh"] -``` +### 4.1 일일 AI 컨텍스트 -```bash -# claude_morning/run.sh -claude --bare -p " -오늘($(date '+%Y-%m-%d')) 장 시작 전 분석을 수행해. +`data/daily_context.json`은 실제 진입 필터에 사용된다. -1. data/news/ 폴더에서 오늘 수집된 뉴스 파일 읽기 -2. data/market/ 폴더에서 수급/지수 데이터 읽기 +적용 항목: -분석 항목: -- 시장 분위기 (강세/중립/약세) -- 감성 점수 (0~100) -- 리스크 레벨 (낮음/보통/높음) -- 주목할 섹터 -- 회피할 섹터 -- 추천 종목 (boosted) -- 제외 종목 (blacklist) -- 포지션 사이즈 배율 (0.5~1.5) +- `trade_allowed=false`면 신규 진입 차단 +- `blacklist_tickers`는 진입 차단 +- `avoid_sectors`는 섹터 회피 +- `boosted_tickers`는 포지션 배율 가산 +- `position_size_multiplier`는 수량 계산에 반영 -결과를 data/daily_context.json 으로 저장. -Discord Webhook으로 분석 요약 전송. -FORCE_EXIT=14:50 은 절대 수정 불가. -" \ ---allowedTools "Read,Write,Bash" \ ---dangerously-skip-permissions \ ---max-turns 10 -``` +### 4.2 ML 모델 -### 장 후 피드백 (15:30) +`models/scalping_model.joblib`이 있으면 진입 시점의 점수를 계산하고 저장한다. -```bash -# claude_evening/run.sh -TODAY=$(date '+%Y-%m-%d') +현재 동작: -claude --bare -p " -오늘($TODAY) 매매 결과를 분석하고 개선해. +- `entry_snapshots.ai_win_score` 저장 +- `entry_snapshots.ai_stop_loss_score` 저장 +- `entry_snapshots.ai_model_version` 저장 +- 로그에 `AI_SCORE` 출력 +- 매매 차단이나 수량 조절에는 사용하지 않음 -1. data/stockbot.db 에서 오늘 매매 내역 조회 (sqlite3) -2. logs/trades.log 에서 오늘 로그 확인 -3. reports/daily/ 의 최근 30일 리포트 참조 - -분석 항목: -- 오늘 승률/손익/이상패턴 -- 연속 손절 여부 -- 파라미터 조정 필요 여부 - -코드 수정: -- 문제 명확할 때만 app/config.py 수정 -- FORCE_EXIT=14:50 절대 변경 불가 - -실전 전환 조건 체크 (모두 충족 시 live_ready 파일 생성): -- 30거래일 이상 운영 -- 최근 30일 승률 > 48% -- 최근 30일 MDD < -10% -- 최근 30일 샤프지수 > 1.0 -- L3 발동 월 2회 이하 - -결과를 reports/daily/${TODAY}.md 저장. -Discord로 요약 전송. -실전 조건 충족 시 '[🚀실전전환권고]' 메시지 전송. -" \ ---allowedTools "Read,Write,Bash" \ ---dangerously-skip-permissions \ ---max-turns 20 -``` +즉, ML은 현재 관찰 모드다. --- -## 8. Discord 알림 목록 +## 5. 하루 자동화 흐름 -| 시각 | 이벤트 | 메시지 형식 | -|------|--------|-----------| -| 08:30 | AI 분석 완료 | `[AI분석] 시장:중립(62점) / 주목:반도체 / 회피:금융` | -| 09:00~ | 매수 | `[매수] 삼성전자 74,000원 / 목표 75,480 / 손절 72,890` | -| 09:00~ | 매수 (AI추천) | `[매수★] 하이닉스 185,000원 / AI 추천 종목` | -| 09:00~ | 1차 익절 | `[익절1] 삼성전자 +2.1% / 잔여 50%` | -| 09:00~ | 2차 익절 | `[익절2] 삼성전자 +3.0% / 전량 청산` | -| 09:00~ | 손절 | `[손절] 삼성전자 -1.5% / 즉시 청산` | -| 14:50 | 강제 청산 | `[14:50 강제청산] 전 포지션 청산 완료` | -| 15:00~ | L2~L4 발동 | `[경고-L2] 일일 손실 -3% 도달. 오늘 매매 중단.` | -| 15:10 | 일일 결산 | `[결산] 매매5회 / 승3패2 / 순손익 +1.2%` | -| 15:30 | AI 피드백 | `[분석] 오늘 평가 요약 + 수정사항` | -| 조건충족 | 실전 전환 | `[🚀실전전환권고] 30일 검증 완료. 실거래 전환 검토.` | -| 수시 | 긴급 | `[긴급] WebSocket 끊김. kill-switch 실행.` | +| 시간 | 작업 | 설명 | +|------|------|------| +| 08:15 | `StockBot_Morning` | `/morning`, 뉴스/시장 분석, `daily_context.json` 생성 | +| 08:30 | 봇 컨텍스트 로드 | AI 컨텍스트 로드, 유니버스 갱신 | +| 08:50 | 목표가 계산 | 전일 고저와 당일 시가 기반 | +| 09:00 | 매매 루프 시작 | 실제 신규 진입은 `ENTRY_START=09:15` 이후 | +| 09:00-15:10 | `StockBot_Watchdog` | 5분마다 봇 생존 감시 | +| 11:00 | 점심 컨텍스트 대기 | `midday_context.json` 전까지 신규 진입 중지 | +| 11:20 | `StockBot_Midday` | `/midday`, 점심 세션 조건 생성 | +| 14:00 | 신규 진입 중단 | 보유 포지션 청산 체크는 계속 | +| 14:50 | 강제 전량 청산 | 절대 불변 | +| 15:10 | 일일 결산 | DB 저장 및 Discord 알림 | +| 15:30 | `StockBot_Evening` | `/evening`, 분석 및 제안서/리포트 생성 | +| 16:00 | `StockBot_Training` | 학습 데이터 수집 및 모델 학습 | --- -## 9. .env 구조 +## 6. 작업 스케줄러 -``` -# KIS 실거래 -KIS_APP_KEY=... -KIS_APP_SECRET=... -KIS_ACCOUNT_NO=... +등록 스크립트: `scripts/setup_scheduler.ps1` -# KIS 모의투자 -KIS_MOCK_APP_KEY=... -KIS_MOCK_APP_SECRET=... -KIS_MOCK_ACCOUNT_NO=... +| 작업명 | 시간 | 스크립트 | +|--------|------|----------| +| `StockBot_Morning` | 08:15 | `scripts/run_morning.ps1` | +| `StockBot_Midday` | 11:20 | `scripts/run_midday.ps1` | +| `StockBot_Evening` | 15:30 | `scripts/run_evening.ps1` | +| `StockBot_Training` | 16:00 | `scripts/run_training_pipeline.ps1` | +| `StockBot_Watchdog` | 09:00-15:10, 5분마다 | `scripts/run_watchdog.ps1` | -# 운영 모드 -KIS_MOCK=true # true=모의투자 / false=실거래 -DRY_RUN=true # true=신호만 확인 / false=실제 주문 - -# Discord -DISCORD_WEBHOOK_URL=... - -# Redis -REDIS_HOST=stockbot-redis -REDIS_PORT=6379 - -# 기타 -LOG_LEVEL=INFO -DB_PATH=data/stockbot.db -``` +모든 실행 스크립트는 프로젝트 내부 `.venv`의 Python을 우선 사용한다. --- -## 10. SQLite 스키마 +## 7. 데이터와 학습 -```sql --- 체결 내역 -CREATE TABLE trades ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - date TEXT NOT NULL, - ticker TEXT NOT NULL, - name TEXT, - entry_time TEXT NOT NULL, - exit_time TEXT, - entry_price REAL NOT NULL, - exit_price REAL, - quantity INTEGER NOT NULL, - side TEXT NOT NULL, -- BUY / SELL - exit_reason TEXT, -- TP1/TP2/SL/FORCE/TIME - pnl REAL, - fee REAL, - ai_boosted INTEGER DEFAULT 0 -); +### 주요 테이블 --- 일일 요약 -CREATE TABLE daily_summary ( - date TEXT PRIMARY KEY, - total_trades INTEGER DEFAULT 0, - win_trades INTEGER DEFAULT 0, - lose_trades INTEGER DEFAULT 0, - net_pnl REAL DEFAULT 0, - max_drawdown REAL DEFAULT 0, - trading_stopped INTEGER DEFAULT 0 -); +| 테이블 | 목적 | +|--------|------| +| `trades` | 매매 이력 | +| `daily_summary` | 일일 결산 | +| `positions` | 보유 포지션 복구 | +| `ai_context_log` | 일일 AI 컨텍스트 기록 | +| `entry_snapshots` | 진입 시점 특징과 AI/ML 점수 | +| `post_entry_snapshots` | 진입 후 60/180/300/600초 샘플 | --- AI 판단 이력 -CREATE TABLE ai_context_log ( - date TEXT PRIMARY KEY, - generated_at TEXT, - trade_allowed INTEGER, - market_sentiment TEXT, - sentiment_score INTEGER, - risk_level TEXT, - hot_sectors TEXT, - avoid_sectors TEXT, - boosted_tickers TEXT, - blacklist_tickers TEXT, - position_size_mult REAL, - reason TEXT -); -``` +### 학습 파이프라인 + +| 스크립트 | 목적 | +|----------|------| +| `scripts/collect_daily_features.py` | 일별 시장 특징 수집 | +| `scripts/collect_minute_data.py` | KIS 분봉 데이터 수집 | +| `scripts/export_training_dataset.py` | 실제 봇 거래 데이터셋 export | +| `scripts/build_external_training_dataset.py` | 외부 분봉 기반 사전학습 데이터셋 생성 | +| `scripts/train_ai_model.py` | 모델 학습 | + +출력: + +- `models/scalping_model.joblib` +- `models/scalping_model.metrics.json` --- -## 11. 실전 전환 조건 +## 8. Discord 알림 -모의투자 시작 후 매일 Claude Code가 자동 체크. -아래 5가지 **전부** 충족 시 `reports/live_ready/날짜_READY.md` 생성 + Discord 🚀 알림. +| 이벤트 | 알림 | +|--------|------| +| Morning 분석 | 시장 분위기, 섹터, boosted/blacklist | +| 매수 | 종목, 수량, 가격, AI boosted 여부 | +| TP1 | 1차 익절 | +| TP2 | 2차 익절 | +| SL | 손절 | +| Force exit | 14:50 강제청산 | +| Daily summary | 15:10 결산 | +| Evening 분석 | 일일 분석과 제안 | +| Risk | L2/L4/L5 경고 | + +Discord 요청에는 `User-Agent: DiscordBot (stockbot, 1.0)` 헤더를 포함한다. + +--- + +## 9. 복구 설치 + +포맷 후 복구용 실행 파일: + +```text +Restore_StockBot.bat +``` + +복구 절차: + +1. `stockbot_v3` 전체 폴더를 압축해 보관한다. +2. 포맷 후 압축을 푼다. +3. `Restore_StockBot.bat`를 관리자 권한으로 실행한다. + +복구 스크립트가 수행하는 작업: + +- Git 설치 확인/설치 +- Node.js 설치 확인/설치 +- Python 3.11 설치 확인/설치 +- `.venv` 생성 +- `vendor/wheels` 기반 Python 라이브러리 설치 +- wheelhouse가 없거나 `-OnlinePip` 사용 시 온라인 pip 설치 +- Claude CLI/Codex CLI 설치 시도 +- 스케줄러 재등록 +- 기본 Python 의존성 import 확인 + +반드시 별도 보관해야 할 민감 파일: + +- `.env` +- `data/stockbot.db` +- 필요한 경우 `models/` + +`.env`는 Git에 올리지 않는다. + +--- + +## 10. 현재 운영 리스크 + +1. KIS minute-bar endpoint는 실응답 로그 검증이 더 필요하다. +2. KIS REST 요청 제한 초과와 타임아웃이 장초반에 발생할 수 있다. +3. WebSocket/Redis 기반 실시간 구조는 아직 미완성이다. +4. 실거래 전환 전에는 체결, 부분체결, 미체결, 취소/정정, 재시작 복구 로직이 더 필요하다. +5. 초반 09:15 이후에도 손실 집중이 반복되는지 추가 검증이 필요하다. +6. `AI_RISK_SL_MAP`의 한글 키 인코딩은 점검이 필요하다. 정상 risk level과 매핑되지 않으면 리스크별 SL 조정이 무력화될 수 있다. +7. 기존 로그와 일부 문서는 인코딩 깨짐이 남아 있어 장기적으로 정리해야 한다. + +--- + +## 11. 최근 제안과 상태 + +파일: `reports/proposals/2026-05-27_strategy_proposal.md` + +| 제안 | 상태 | +|------|------| +| `ENTRY_START` 09:05 -> 09:15 | 승인 및 적용 | +| 장초반 포지션 축소 | 보류 | +| 시간대별 SL 강화 | 보류 | + +`ENTRY_START=09:15` 변경 후 최소 5거래 이상 관찰한 뒤 다음 조정을 판단한다. + +--- + +## 12. 실거래 전환 조건 + +전부 충족해야 한다. | 조건 | 기준 | |------|------| @@ -429,80 +303,37 @@ CREATE TABLE ai_context_log ( | 승률 | 최근 30일 > 48% | | MDD | 최근 30일 < -10% | | 샤프지수 | 최근 30일 > 1.0 | -| L3 발동 | 월 2회 이하 | +| L3-B 최소배율 도달 | 월 2회 이하 | -전환 시: `.env`에서 `KIS_MOCK=false`, `DRY_RUN=false` 로 변경. +전환 방법: ---- - -## 12. 운영 모드 조합 - -| KIS_MOCK | DRY_RUN | 동작 | -|----------|---------|------| -| true | true | 신호만 확인 (주문 없음) ← 처음 테스트 | -| true | false | 모의투자 실제 주문 ← 3개월 검증 | -| false | false | 실거래 ← 조건 충족 후 | - ---- - -## 13. 개발 로드맵 - -### Phase 1 — 연결 테스트 (1주) -- [ ] .env 설정 (KIS 모의투자 키 4개) -- [ ] test_connection.py 실행 → KIS 연결 확인 -- [ ] Discord Webhook 테스트 -- [ ] DRY_RUN=true로 신호 발생 확인 - -### Phase 2 — 모의투자 시작 -- [ ] KIS_MOCK=true, DRY_RUN=false -- [ ] 매일 자동 실행 확인 (08:30 / 09:00 / 15:30) -- [ ] Discord 알림 정상 수신 확인 -- [ ] 매일 reports/daily/ 리포트 자동 생성 확인 - -### Phase 3 — 3개월 검증 -- [ ] 30거래일 이상 운영 -- [ ] Claude Code 자동 피드백 / 코드 개선 축적 -- [ ] 실전 전환 조건 5가지 체크 - -### Phase 4 — 실거래 (조건 충족 후) -- [ ] KIS_MOCK=false -- [ ] 총자산 100만원으로 시작 -- [ ] 1개월 단위 성과 검토 → 점진적 증액 - ---- - -## 14. 보안 체크리스트 - -- [ ] .env → .gitignore 등록 (최우선) -- [ ] KIS API 키 → Gitea 절대 커밋 금지 -- [ ] DISCORD_WEBHOOK_URL 외부 노출 금지 -- [ ] NAS 방화벽: 포트 8501 내부망만 허용 -- [ ] 매매 로그 SQLite + logs/ 이중 보관 - ---- - -## 15. 절대 금지 - -```python -HARD_EXIT_TIME = "14:50" # 절대 변경 불가 -AI_SCOPE = "ENTRY_ONLY" # AI는 신규 진입 차단만, 청산 불관여 - -BLACKLIST = [ - "신규상장 6개월 미만", "관리종목", "투자경고", - "거래정지", "우선주", "스팩", "ETF/ETN", -] - -TRADING_BLACKOUT = [ - ("08:00", "09:00"), # 동시호가 - ("11:30", "13:00"), # 점심 - ("14:50", "15:30"), # 마감 -] +```text +KIS_MOCK=false +DRY_RUN=false ``` +단, 현재는 실거래 승인 상태가 아니다. + --- -## 16. 면책 +## 13. 다음 개발 과제 -> 본 기획서는 시스템 설계 문서이며 투자 수익을 보장하지 않는다. -> 단타는 개인투자자의 90% 이상이 손실을 보는 영역이다. -> 반드시 모의투자 3개월 이상 검증 후 실거래 전환할 것. +우선순위: + +1. `AI_RISK_SL_MAP` 인코딩/키 매핑 점검 +2. KIS API rate-limit 완화 +3. KIS minute-bar 실응답 검증 +4. 장초반 09:15 이후 손익 데이터 축적 +5. WebSocket 시세 구조 도입 +6. 실거래용 주문 복구/부분체결/미체결 처리 강화 +7. NAS Docker 이전 + +--- + +## 14. 절대 금지 + +- `FORCE_EXIT = "14:50"` 변경 금지 +- 손절 우선순위 하향 금지 +- `.env` Git 커밋 금지 +- AI/ML 모델이 검증 없이 실시간 청산을 방해하는 구조 금지 +- 실거래 모드 임의 전환 금지