# StockBot v3.0 — Claude Code 운영 가이드 > 최종 수정: 2026-05-15 > 인프라: 로컬 Windows → Synology NAS Docker 이전 예정 > 현재 모드: 모의투자 (KIS_MOCK=true, DRY_RUN=true) --- ## 프로젝트 개요 | 항목 | 내용 | |------|------| | 목표 | KIS API 기반 한국 주식 단타 자동매매 | | 전략 | 변동성 돌파 (K=0.5) | | 언어 | Python 3.11 | | DB | SQLite (data/stockbot.db) | | 알림 | Discord Webhook (거래 알림 + 코드 변경 알림 채널 분리) | | AI | Claude Code headless (`claude -p "/커맨드" --dangerously-skip-permissions`) | | 코드 관리 | Gitea (NAS) — 파일 수정 후 확인 없이 자동 commit + push | --- ## Claude Code 권한 및 자동화 설정 - 모든 Bash/파일 작업 **영구 승인** (`.claude/settings.json` `bypassPermissions`) - 글로벌 설정 `~/.claude/settings.json`에도 `dangerouslySkipPermissions: true` 적용 - **파일 수정 완료 후 즉시 `git add + commit + push origin master` 자동 실행** (확인 불필요) - 인코딩: `PYTHONUTF8=1`, `PYTHONIOENCODING=utf-8` 환경변수 설정 --- ## 핵심 설계 원칙 (절대 불변) 1. **14:50 강제 청산** — 하드코딩, 예외 없음 2. **손절 우선** — AI 판단과 무관하게 손절 룰 항상 우선순위 1위 3. **AI 역할 분리** — Claude Code는 장 전 분석 + 장 후 피드백만, 실시간 매매 개입 불가 4. **검증 순서** — 모의투자 3개월 → 조건 충족 → 실거래 --- ## 하루 자동화 흐름 ``` 07:55 StockBot_Bot → run_bot.ps1 → claude /start-bot → 봇 백그라운드 시작 08:15 StockBot_Morning → run_morning.ps1 → claude /morning → 뉴스+수급 분석 → daily_context.json 08:30 봇이 daily_context.json 로드 → 유니버스 30종목 확정 09:00 매매 루프 시작 (변동성 돌파 신호 + AI 필터) 14:50 강제 전량 청산 (절대 불변) 15:10 일일 결산 → Discord 전송 15:30 StockBot_Evening → run_evening.ps1 → claude /evening → 결과 분석 + 리포트 저장 ``` ### 스케줄러 스크립트 주의사항 (scripts/run_*.ps1) - 경로: `$PROJECT = Split-Path -Parent $PSScriptRoot` (한글 경로 인코딩 문제 방지) - Claude 실행: `$CLAUDE = "C:\Users\whdwo\AppData\Roaming\npm\claude.cmd"` (전체 경로 필수) - 인코딩: `New-Object System.Text.UTF8Encoding $false` + UTF-8 BOM으로 저장 - 로그: `logs/bot_start.log`, `logs/morning.log`, `logs/evening.log` --- ## Claude Code 역할 상세 ### 장 전 분석 — `/morning` 슬래시 커맨드 ``` 1. python app/ai/morning.py --print (뉴스 크롤링 + KIS 수급 수집) 2. Claude가 데이터 분석 → 시장 분위기/섹터/boosted_tickers 판단 3. app/ai/daily_context.json 저장 4. Discord로 분석 요약 전송 ``` ### 장 후 피드백 — `/evening` 슬래시 커맨드 ``` 1. python app/ai/evening.py --print (오늘 매매 내역 조회) 2. 승률/손익/이상패턴 분석 3. app/config.py 파라미터 조정 (문제 명확할 때만) 4. reports/daily/날짜.md 저장 5. 실전 전환 조건 5가지 체크 6. Discord로 요약 전송 ``` ### 봇 시작 — `/start-bot` 슬래시 커맨드 ``` 1. 이미 실행 중인지 확인 (중복 방지) 2. app/main.py를 DETACHED_PROCESS로 백그라운드 시작 3. Discord "[모의투자] 자동매매 봇 시작" 알림 ``` --- ## Discord 알림 구조 | 채널 | 내용 | 발신 | |------|------|------| | 거래 알림 | 매수/매도/손절/결산 | `app/monitor/notifier.py` | | 코드 변경 | 커밋 내용 + Push 완료 여부 | `.claude/discord_notify.py` (Stop 훅) | - 코드 변경 알림: **커밋이 있을 때만** 발송 (스케줄러 태스크 등 노이즈 없음) - Discord 요청 시 반드시 `User-Agent: DiscordBot (stockbot, 1.0)` 헤더 포함 (Cloudflare 차단 방지) --- ## 파일 구조 ``` stockbot_v3/ ├── CLAUDE.md ├── .env ← API 키 (Git 절대 제외) ├── .claude/ │ ├── settings.json ← 권한·훅·환경변수 설정 │ ├── discord_notify.py ← Stop 훅: 코드 변경 Discord 전송 │ └── session_start_sha.txt ← 세션 시작 시 HEAD SHA 저장 ├── app/ │ ├── main.py ← 메인 매매 루프 (승인 필요) │ ├── config.py ← 전략 파라미터 (수정 가능) │ ├── ai/ │ │ ├── morning.py ← 장 전 데이터 수집 │ │ └── evening.py ← 장 후 데이터 수집 │ ├── strategy/ │ │ └── volatility_breakout.py ← 전략 로직 (수정 가능) │ ├── execution/ │ │ ├── kis_client.py ← KIS API 래퍼 (승인 필요) │ │ └── order_executor.py ← 주문 실행 (승인 필요) │ ├── risk/ │ │ └── manager.py ← 리스크 관리 (수정 가능) │ ├── monitor/ │ │ └── notifier.py ← Discord Webhook │ └── db/ │ ├── models.py ← SQLite 스키마 (승인 필요) │ └── repository.py ← DB 접근 (승인 필요) ├── scripts/ │ ├── run_bot.ps1 ← 스케줄러용 봇 시작 │ ├── run_morning.ps1 ← 스케줄러용 morning │ ├── run_evening.ps1 ← 스케줄러용 evening │ └── setup_scheduler.ps1 ← 스케줄러 전체 재등록 ├── reports/ │ ├── daily/ ← 매일 자동 생성 │ └── live_ready/ ← 실전 전환 조건 충족 시 생성 ├── data/ │ ├── stockbot.db │ ├── daily_context.json ← 매일 /morning이 갱신, 봇이 08:30에 로드 │ ├── news/ │ └── market/ └── logs/ ├── stockbot.log ← 봇 메인 로그 (UTF-8) ├── trades.log ├── bot_start.log ← /start-bot 실행 로그 ├── morning.log ← /morning 실행 로그 └── evening.log ← /evening 실행 로그 ``` --- ## 수정 범위 ### 자유롭게 수정 가능 - `app/config.py` — 전략 파라미터 (TP1_PCT, TP2_PCT, SL_PCT, STRATEGY_K 등) - `app/strategy/volatility_breakout.py` — 전략 로직 - `app/risk/manager.py` — 리스크 기준값 (L1~L5) - `app/ai/daily_context.json` — 매일 장 전 생성 - `reports/` — 리포트 생성/저장 ### 승인 필요 (사용자 확인 후 수정) - `app/main.py` — 구조 변경, 스케줄 변경 - `app/execution/` — 주문 로직 변경 - `app/db/` — 스키마 변경 ### 절대 금지 - `FORCE_EXIT = "14:50"` 변경 - 손절을 익절보다 후순위로 변경 - `.env` 파일 직접 수정 (KIS_MOCK, DRY_RUN 포함) - `.env` Git 커밋 --- ## Git 규칙 - branch: `master` / remote: `origin` (Gitea NAS) - 파일 수정 후 **자동으로** `git add -A && git commit && git push origin master` - 커밋 메시지: `[날짜] 변경내용 요약` - `.env`는 절대 커밋 금지 --- ## 리스크 관리 (L1~L5) | 레벨 | 조건 | 동작 | Discord | |------|------|------|---------| | L1 | 1회 -1.5% | 즉시 손절 | [손절] | | L2 | 일일 -3% | 당일 신규 진입 중단 | [경고] | | L3 | 3연속 손절 | 당일 매매 중단 | [경고] | | L4 | 주간 -7% | 주말까지 중단 | [경고] | | L5 | 월간 -15% | 전략 폐기 + 재검토 | [긴급] | --- ## 실전 전환 조건 (claude_evening 자동 체크) | 조건 | 기준 | |------|------| | 누적 운영 | 30거래일 이상 | | 승률 | 최근 30일 > 48% | | MDD | 최근 30일 < -10% | | 샤프지수 | 최근 30일 > 1.0 | | L3 발동 | 월 2회 이하 | 전부 충족 시 → `reports/live_ready/날짜_READY.md` 생성 + Discord 🚀 알림 전환 방법: `.env`에서 `KIS_MOCK=false`, `DRY_RUN=false` 로 변경 --- ## 운영 모드 | KIS_MOCK | DRY_RUN | 동작 | |----------|---------|------| | true | true | 신호 확인만 ← **현재** | | true | false | 모의투자 실주문 | | false | false | 실거래 | --- ## 다음 단계 - [ ] WebSocket 전환 — REST 폴링 → KIS WebSocket 실시간 시세 - [ ] NAS Docker 이전 (개발 완료 후 `git push` → NAS `git pull` → `docker-compose up -d`)