9.8 KiB
StockBot v3.0 종합기획서
최종 수정: 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. 핵심 원칙
- 진입과 청산은 코드가 결정하고, AI는 시장 리뷰와 제안만 담당한다.
- 손절은 AI 판단과 무관하게 항상 우선한다.
FORCE_EXIT = "14:50"은 절대 변경하지 않는다.- 실거래 전환은 모의투자/드라이런 검증 후 수동 승인한다.
- 전략 파라미터 변경은 근거를 남기고 승인 후 반영한다.
.env는 Git에 올리지 않는다.
1. 현재 구현 상태
| 항목 | 현재 상태 |
|---|---|
| 운영 방식 | 로컬 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. 현재 전략 파라미터
현재 기준 파일: app/config.py
STRATEGY_K = 0.5
ENTRY_START = "09:15"
ENTRY_END = "14:30"
FORCE_EXIT = "14:50"
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_CONTEXT_PATH = "data/daily_context.json"
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 | 유지 |
3. 리스크 관리
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 |
익절 시 연속 손절 카운트는 한 단계만 회복한다.
4. AI 역할
AI는 두 종류로 나뉜다.
4.1 일일 AI 컨텍스트
data/daily_context.json은 실제 진입 필터에 사용된다.
적용 항목:
trade_allowed=false면 신규 진입 차단blacklist_tickers는 진입 차단avoid_sectors는 섹터 회피boosted_tickers는 포지션 배율 가산position_size_multiplier는 수량 계산에 반영
4.2 ML 모델
models/scalping_model.joblib이 있으면 진입 시점의 점수를 계산하고 저장한다.
현재 동작:
entry_snapshots.ai_win_score저장entry_snapshots.ai_stop_loss_score저장entry_snapshots.ai_model_version저장- 로그에
AI_SCORE출력 - 매매 차단이나 수량 조절에는 사용하지 않음
즉, ML은 현재 관찰 모드다.
5. 하루 자동화 흐름
| 시간 | 작업 | 설명 |
|---|---|---|
| 08:15 | StockBot_Morning |
/morning, 뉴스/시장 분석, daily_context.json 생성 |
| 08:30 | 봇 컨텍스트 로드 | AI 컨텍스트 로드, 유니버스 갱신 |
| 08:50 | 목표가 계산 | 전일 고저와 당일 시가 기반 |
| 09:00 | 매매 루프 시작 | 실제 신규 진입은 ENTRY_START=09:20 이후 |
| 09:00-15:05 | StockBot_Watchdog |
5분마다 봇 생존 감시, 15:10 결산 직후 재시작 금지 |
| 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 |
학습 데이터 수집 및 모델 학습 |
6. 작업 스케줄러
등록 스크립트: scripts/setup_scheduler.ps1
| 작업명 | 시간 | 스크립트 |
|---|---|---|
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:05, 5분마다 | scripts/run_watchdog.ps1 |
모든 실행 스크립트는 프로젝트 내부 .venv의 Python을 우선 사용한다.
08:50 이후 재시작 시 봇은 목표가를 즉시 재계산하며, KIS 시가가 0이면 목표가 계산에서 제외한다.
7. 데이터와 학습
주요 테이블
| 테이블 | 목적 |
|---|---|
trades |
매매 이력 |
daily_summary |
일일 결산 |
positions |
보유 포지션 복구 |
ai_context_log |
일일 AI 컨텍스트 기록 |
entry_snapshots |
진입 시점 특징과 AI/ML 점수 |
post_entry_snapshots |
진입 후 60/180/300/600초 샘플 |
학습 파이프라인
| 스크립트 | 목적 |
|---|---|
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.joblibmodels/scalping_model.metrics.json
8. 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. 복구 설치
포맷 후 복구용 실행 파일:
Restore_StockBot.bat
복구 절차:
stockbot_v3전체 폴더를 압축해 보관한다.- 포맷 후 압축을 푼다.
Restore_StockBot.bat를 관리자 권한으로 실행한다.
복구 스크립트가 수행하는 작업:
- Git 설치 확인/설치
- Node.js 설치 확인/설치
- Python 3.11 설치 확인/설치
.venv생성vendor/wheels기반 Python 라이브러리 설치- wheelhouse가 없거나
-OnlinePip사용 시 온라인 pip 설치 - Claude CLI/Codex CLI 설치 시도
- 스케줄러 재등록
- 기본 Python 의존성 import 확인
반드시 별도 보관해야 할 민감 파일:
.envdata/stockbot.db- 필요한 경우
models/
.env는 Git에 올리지 않는다.
10. 현재 운영 리스크
- KIS minute-bar endpoint는 실응답 로그 검증이 더 필요하다.
- KIS REST 요청 제한 초과와 타임아웃이 장초반에 발생할 수 있다.
- WebSocket/Redis 기반 실시간 구조는 아직 미완성이다.
- 실거래 전환 전에는 체결, 부분체결, 미체결, 취소/정정, 재시작 복구 로직이 더 필요하다.
- 초반 09:20 이후에도 손실 집중이 반복되는지 추가 검증이 필요하다.
AI_RISK_SL_MAP의 한글 키 인코딩은 점검이 필요하다. 정상 risk level과 매핑되지 않으면 리스크별 SL 조정이 무력화될 수 있다.- 기존 로그와 일부 문서는 인코딩 깨짐이 남아 있어 장기적으로 정리해야 한다.
11. 최근 제안과 상태
파일: reports/proposals/2026-05-27_strategy_proposal.md
| 제안 | 상태 |
|---|---|
ENTRY_START 09:05 -> 09:15 |
승인 및 적용 |
ENTRY_START 09:15 -> 09:20 |
승인 및 적용 |
| 장초반 포지션 축소 | 보류 |
| 시간대별 SL 강화 | 보류 |
ENTRY_START=09:20 변경 후 최소 5거래 이상 관찰한 뒤 다음 조정을 판단한다.
12. 실거래 전환 조건
전부 충족해야 한다.
| 조건 | 기준 |
|---|---|
| 누적 운영 | 30거래일 이상 |
| 승률 | 최근 30일 > 48% |
| MDD | 최근 30일 < -10% |
| 샤프지수 | 최근 30일 > 1.0 |
| L3-B 최소배율 도달 | 월 2회 이하 |
전환 방법:
KIS_MOCK=false
DRY_RUN=false
단, 현재는 실거래 승인 상태가 아니다.
13. 다음 개발 과제
우선순위:
AI_RISK_SL_MAP인코딩/키 매핑 점검- KIS API rate-limit 완화
- KIS minute-bar 실응답 검증
- 장초반 09:20 이후 손익 데이터 축적
- WebSocket 시세 구조 도입
- 실거래용 주문 복구/부분체결/미체결 처리 강화
- NAS Docker 이전
14. 절대 금지
FORCE_EXIT = "14:50"변경 금지- 손절 우선순위 하향 금지
.envGit 커밋 금지- AI/ML 모델이 검증 없이 실시간 청산을 방해하는 구조 금지
- 실거래 모드 임의 전환 금지