744 lines
26 KiB
Plaintext
744 lines
26 KiB
Plaintext
|
|
# 단타 자동매매 시스템 종합 기획서 v2.0
|
|||
|
|
|
|||
|
|
> 버전: v2.0 (AI 판단 레이어 통합)
|
|||
|
|
> 기준: 한국 주식 (코스피/코스닥) / KIS Open API / Synology NAS Docker
|
|||
|
|
> 핵심 변경: 규칙 기반 실행 + Claude AI 일일 시장 판단 레이어 추가
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 0. 설계 원칙 (절대 불변)
|
|||
|
|
|
|||
|
|
1. **감정 0** — 실행은 코드가 결정. 단, 판단은 AI가 보조
|
|||
|
|
2. **속도/판단 역할 분리** — AI는 느리지만 깊게(매일 1회), 실행은 빠르게(수식)
|
|||
|
|
3. **손절 우선** — AI가 긍정 판단해도 손절 룰은 무조건 우선
|
|||
|
|
4. **검증 후 실거래** — 백테스트 → 모의투자 3개월 → 소액 실거래
|
|||
|
|
5. **14:50 전량 청산** — 하드코딩, 어떤 상황에서도 예외 없음
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 시스템 전체 구조 (v2.0)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌──────────────────────────────────────────────────────────────┐
|
|||
|
|
│ Synology NAS (Docker) │
|
|||
|
|
│ │
|
|||
|
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
|||
|
|
│ │ [레이어 1] AI 판단 엔진 (08:00) │ │
|
|||
|
|
│ │ │ │
|
|||
|
|
│ │ 데이터 수집 │ │
|
|||
|
|
│ │ ├─ 전일 뉴스 (네이버 금융 크롤링) │ │
|
|||
|
|
│ │ ├─ KOSPI/KOSDAQ 지수 흐름 (KIS REST) │ │
|
|||
|
|
│ │ ├─ 외국인/기관 순매수 상위 (KIS 순위분석 API) │ │
|
|||
|
|
│ │ ├─ 거래량 급증 종목 (KIS 순위분석 API) │ │
|
|||
|
|
│ │ └─ 섹터별 등락률 (KIS 업종/기타 API) │ │
|
|||
|
|
│ │ ↓ │ │
|
|||
|
|
│ │ Claude API 호출 (하루 1회, 약 3,000 토큰) │ │
|
|||
|
|
│ │ ↓ │ │
|
|||
|
|
│ │ daily_context.json 생성 │ │
|
|||
|
|
│ └─────────────────────────────────────────────────────────┘ │
|
|||
|
|
│ ↓ 읽기만 함 │
|
|||
|
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
|||
|
|
│ │ [레이어 2] 규칙 기반 실행 엔진 (09:00~) │ │
|
|||
|
|
│ │ │ │
|
|||
|
|
│ │ asyncio Event Loop │ │
|
|||
|
|
│ │ ┌──────────┐ ┌──────────┐ ┌────────────┐ │ │
|
|||
|
|
│ │ │Universe │ │Strategy │ │ Risk │ │ │
|
|||
|
|
│ │ │Scanner │ │Engine │ │ Manager │ │ │
|
|||
|
|
│ │ └──────────┘ └──────────┘ └────────────┘ │ │
|
|||
|
|
│ │ ┌──────────┐ ┌──────────┐ ┌────────────┐ │ │
|
|||
|
|
│ │ │ Data │ │ Order │ │ Notifier │ │ │
|
|||
|
|
│ │ │Collector │ │Executor │ │(Telegram) │ │ │
|
|||
|
|
│ │ └──────────┘ └──────────┘ └────────────┘ │ │
|
|||
|
|
│ └─────────────────────────────────────────────────────────┘ │
|
|||
|
|
│ ↓ │
|
|||
|
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
|||
|
|
│ │ SQLite (체결/포지션/로그) │ Redis (실시간 시세 캐시) │ │
|
|||
|
|
│ └─────────────────────────────────────────────────────────┘ │
|
|||
|
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
|||
|
|
│ │ Streamlit Dashboard (포트 8501) │ │
|
|||
|
|
│ └─────────────────────────────────────────────────────────┘ │
|
|||
|
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
|||
|
|
│ │ kill-switch (별도 컨테이너 / 긴급 청산) │ │
|
|||
|
|
│ └─────────────────────────────────────────────────────────┘ │
|
|||
|
|
└──────────────────────────────────────────────────────────────┘
|
|||
|
|
│ │
|
|||
|
|
KIS WebSocket KIS REST API
|
|||
|
|
(실시간 시세/VI) (주문/잔고/순위/수급)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 핵심 변경: AI 판단 레이어 상세
|
|||
|
|
|
|||
|
|
### 2-1. 수집 데이터 소스
|
|||
|
|
|
|||
|
|
| 데이터 | 소스 | 방법 | 수집 시각 |
|
|||
|
|
|--------|------|------|---------|
|
|||
|
|
| 전일 종목 뉴스 헤드라인 | 네이버 금융 | HTTP 크롤링 | 07:30 |
|
|||
|
|
| KOSPI/KOSDAQ 전일 종가·등락률 | KIS REST | API | 07:40 |
|
|||
|
|
| 외국인 순매수 상위 30종목 | KIS 순위분석 API | API | 07:40 |
|
|||
|
|
| 기관 순매수 상위 30종목 | KIS 순위분석 API | API | 07:40 |
|
|||
|
|
| 거래량 급증 상위 30종목 | KIS 순위분석 API | API | 07:40 |
|
|||
|
|
| 업종별 등락률 | KIS 업종/기타 API | API | 07:40 |
|
|||
|
|
| 당일 경제 일정 (FOMC 등) | 네이버 금융 크롤링 | HTTP 크롤링 | 07:30 |
|
|||
|
|
|
|||
|
|
> KIS API만으로 수급·수치 데이터 대부분 커버 가능. 뉴스는 네이버 금융 크롤링으로 보완.
|
|||
|
|
|
|||
|
|
### 2-2. Claude API 프롬프트 구조
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
SYSTEM_PROMPT = """
|
|||
|
|
당신은 한국 주식 단타 전문 AI 분석가입니다.
|
|||
|
|
매일 장 시작 전, 제공된 데이터를 분석해 오늘 단타 매매 전략을 판단합니다.
|
|||
|
|
반드시 JSON 형식으로만 응답하며, 다른 텍스트는 포함하지 않습니다.
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
USER_PROMPT = f"""
|
|||
|
|
[전일 시장 요약]
|
|||
|
|
- KOSPI: {kospi_change}% ({kospi_close}pt)
|
|||
|
|
- KOSDAQ: {kosdaq_change}% ({kosdaq_close}pt)
|
|||
|
|
|
|||
|
|
[외국인 순매수 상위]
|
|||
|
|
{foreign_buy_top10}
|
|||
|
|
|
|||
|
|
[기관 순매수 상위]
|
|||
|
|
{institution_buy_top10}
|
|||
|
|
|
|||
|
|
[거래량 급증 상위]
|
|||
|
|
{volume_surge_top10}
|
|||
|
|
|
|||
|
|
[업종별 등락률]
|
|||
|
|
{sector_changes}
|
|||
|
|
|
|||
|
|
[주요 뉴스 헤드라인 (상위 20건)]
|
|||
|
|
{news_headlines}
|
|||
|
|
|
|||
|
|
[오늘 경제 일정]
|
|||
|
|
{economic_calendar}
|
|||
|
|
|
|||
|
|
위 데이터를 분석해 다음 JSON을 반환하세요:
|
|||
|
|
{{
|
|||
|
|
"trade_allowed": true/false,
|
|||
|
|
"market_sentiment": "강세/중립/약세",
|
|||
|
|
"sentiment_score": 0~100,
|
|||
|
|
"risk_level": "낮음/보통/높음",
|
|||
|
|
"hot_sectors": ["섹터1", "섹터2"],
|
|||
|
|
"avoid_sectors": ["섹터3"],
|
|||
|
|
"boosted_tickers": ["005930", "000660"],
|
|||
|
|
"blacklist_tickers": ["종목코드"],
|
|||
|
|
"position_size_multiplier": 0.5~1.5,
|
|||
|
|
"reason": "한 줄 판단 이유"
|
|||
|
|
}}
|
|||
|
|
"""
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2-3. daily_context.json 구조
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"date": "2026-05-13",
|
|||
|
|
"generated_at": "08:05:22",
|
|||
|
|
"trade_allowed": true,
|
|||
|
|
"market_sentiment": "중립",
|
|||
|
|
"sentiment_score": 62,
|
|||
|
|
"risk_level": "보통",
|
|||
|
|
"hot_sectors": ["반도체", "2차전지"],
|
|||
|
|
"avoid_sectors": ["금융", "건설"],
|
|||
|
|
"boosted_tickers": ["005930", "000660", "373220"],
|
|||
|
|
"blacklist_tickers": [],
|
|||
|
|
"position_size_multiplier": 1.0,
|
|||
|
|
"reason": "외국인 반도체 순매수 지속, KOSPI 박스권 상단 접근 중립 판단"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2-4. 실행 엔진에서의 활용
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 진입 조건에 AI 판단 필터 추가 (기존 조건 1~8 + 신규 9~11)
|
|||
|
|
진입 조건 (전부 충족 시):
|
|||
|
|
1. 현재가 >= 목표가 (변동성 돌파)
|
|||
|
|
2. 현재 시각 09:00 ~ 14:30
|
|||
|
|
3. KOSPI 등락률 > -1.0%
|
|||
|
|
4. 전일 거래대금 >= 100억
|
|||
|
|
5. 시가총액 1,000억 ~ 3조
|
|||
|
|
6. VI 미발동
|
|||
|
|
7. 보유 종목 수 < 2
|
|||
|
|
8. 일일 누적 손실 < -3%
|
|||
|
|
── AI 판단 필터 (신규) ──
|
|||
|
|
9. daily_context["trade_allowed"] == true
|
|||
|
|
10. 해당 종목 섹터가 avoid_sectors에 없음
|
|||
|
|
11. 해당 종목이 blacklist_tickers에 없음
|
|||
|
|
|
|||
|
|
# 포지션 사이즈 조정
|
|||
|
|
실제_투자비중 = 기본비중(20%) × position_size_multiplier
|
|||
|
|
# sentiment_score 높을수록 multiplier 증가 (0.5~1.5)
|
|||
|
|
|
|||
|
|
# boosted_tickers 우선 진입
|
|||
|
|
boosted 종목은 동일 신호 시 다른 종목보다 먼저 진입 처리
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. 기술 스택 (v2.0 확정)
|
|||
|
|
|
|||
|
|
| 항목 | 선택 | 이유 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| 언어 | Python 3.11 | KIS 예제 코드 모두 Python |
|
|||
|
|
| 비동기 | asyncio + aiohttp | rate limit 정밀 제어 |
|
|||
|
|
| DB | SQLite | NAS 메모리 절약, 백업 단순 |
|
|||
|
|
| 캐시 | Redis 7 (Docker) | 실시간 시세 캐시 |
|
|||
|
|
| 스케줄러 | APScheduler (AsyncIOScheduler) | 장 이벤트 트리거 |
|
|||
|
|
| AI 판단 | Claude claude-sonnet-4-20250514 | 뉴스/수급 분석 |
|
|||
|
|
| 뉴스 수집 | aiohttp + BeautifulSoup4 | 네이버 금융 크롤링 |
|
|||
|
|
| 알림 | python-telegram-bot | 텔레그램 단일 채널 |
|
|||
|
|
| 대시보드 | Streamlit | NAS 내부망 접근 |
|
|||
|
|
| 컨테이너 | Docker Compose | Synology Container Manager |
|
|||
|
|
| 백테스트 | vectorbt | 분봉 데이터 고속 처리 |
|
|||
|
|
| 데이터 수집 | pykrx + KIS REST | 과거 분봉 백필 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. 디렉토리 구조 (v2.0)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
/volume1/docker/stockbot/
|
|||
|
|
│
|
|||
|
|
├── docker-compose.yml
|
|||
|
|
├── .env
|
|||
|
|
│
|
|||
|
|
├── app/
|
|||
|
|
│ ├── main.py ← 진입점, asyncio 루프
|
|||
|
|
│ ├── config.py ← 전략 파라미터
|
|||
|
|
│ │
|
|||
|
|
│ ├── ai/ ← [신규] AI 판단 레이어
|
|||
|
|
│ │ ├── context_builder.py ← 데이터 수집 + Claude API 호출
|
|||
|
|
│ │ ├── news_crawler.py ← 네이버 금융 뉴스 크롤링
|
|||
|
|
│ │ └── prompts.py ← 프롬프트 템플릿 관리
|
|||
|
|
│ │
|
|||
|
|
│ ├── data/
|
|||
|
|
│ │ ├── collector.py ← KIS WebSocket 시세 수신
|
|||
|
|
│ │ ├── universe.py ← 종목 풀 갱신 (08:30)
|
|||
|
|
│ │ └── backfill.py ← 과거 분봉 백필
|
|||
|
|
│ │
|
|||
|
|
│ ├── strategy/
|
|||
|
|
│ │ ├── base.py ← 전략 추상 클래스
|
|||
|
|
│ │ └── volatility_breakout.py ← 변동성 돌파 전략 (AI 필터 포함)
|
|||
|
|
│ │
|
|||
|
|
│ ├── risk/
|
|||
|
|
│ │ └── manager.py ← 손절/일일한도/강제청산
|
|||
|
|
│ │
|
|||
|
|
│ ├── execution/
|
|||
|
|
│ │ ├── kis_client.py ← KIS REST/WebSocket 래퍼
|
|||
|
|
│ │ └── order_executor.py ← 주문 전송, 재시도
|
|||
|
|
│ │
|
|||
|
|
│ ├── monitor/
|
|||
|
|
│ │ ├── notifier.py ← 텔레그램 알림
|
|||
|
|
│ │ └── dashboard.py ← Streamlit 대시보드
|
|||
|
|
│ │
|
|||
|
|
│ └── db/
|
|||
|
|
│ ├── models.py ← SQLite 스키마
|
|||
|
|
│ └── repository.py ← DB 접근 레이어
|
|||
|
|
│
|
|||
|
|
├── kill_switch/
|
|||
|
|
│ └── kill.py
|
|||
|
|
│
|
|||
|
|
├── backtest/
|
|||
|
|
│ ├── run_backtest.py
|
|||
|
|
│ └── results/
|
|||
|
|
│
|
|||
|
|
├── data/
|
|||
|
|
│ ├── stockbot.db
|
|||
|
|
│ ├── universe_cache.json
|
|||
|
|
│ └── daily_context.json ← [신규] AI 판단 결과 파일
|
|||
|
|
│
|
|||
|
|
└── logs/
|
|||
|
|
├── trades.log
|
|||
|
|
└── ai_context.log ← [신규] AI 판단 이력 보관
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. 전략 (확정: 변동성 돌파 + AI 필터)
|
|||
|
|
|
|||
|
|
### 핵심 파라미터 (config.py)
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 변동성 돌파 파라미터
|
|||
|
|
STRATEGY_K = 0.5
|
|||
|
|
ENTRY_START = "09:00"
|
|||
|
|
ENTRY_END = "14:30"
|
|||
|
|
FORCE_EXIT = "14:50"
|
|||
|
|
TP1_PCT = 0.02
|
|||
|
|
TP2_PCT = 0.03
|
|||
|
|
SL_PCT = 0.015
|
|||
|
|
MAX_HOLD_MIN = 120
|
|||
|
|
|
|||
|
|
# AI 판단 파라미터 (신규)
|
|||
|
|
AI_CONTEXT_PATH = "/app/data/daily_context.json"
|
|||
|
|
AI_MIN_SCORE = 40 # sentiment_score 40 미만 시 trade_allowed=false 강제
|
|||
|
|
AI_BOOST_MULTI = 1.5 # boosted_tickers 진입 비중 배율
|
|||
|
|
AI_RISK_SL_MAP = { # risk_level별 손절 강화
|
|||
|
|
"낮음": 0.015,
|
|||
|
|
"보통": 0.015,
|
|||
|
|
"높음": 0.010 # 고위험 장세엔 손절 타이트하게
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 진입 로직 (AI 필터 통합)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
목표가 = 당일 시가 + (전일 고가 - 전일 저가) × K
|
|||
|
|
|
|||
|
|
진입 조건 (전부 충족):
|
|||
|
|
[기술적 조건]
|
|||
|
|
1. 현재가 >= 목표가
|
|||
|
|
2. 09:00 ~ 14:30
|
|||
|
|
3. KOSPI 등락률 > -1.0%
|
|||
|
|
4. 전일 거래대금 >= 100억
|
|||
|
|
5. 시가총액 1,000억 ~ 3조
|
|||
|
|
6. VI 미발동
|
|||
|
|
7. 보유 종목 수 < 2
|
|||
|
|
8. 일일 누적 손실 < -3%
|
|||
|
|
|
|||
|
|
[AI 판단 조건]
|
|||
|
|
9. trade_allowed == true
|
|||
|
|
10. 종목 섹터 not in avoid_sectors
|
|||
|
|
11. 종목 not in blacklist_tickers
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 청산 로직 (우선순위)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1순위: 14:50 강제 청산 (시장가)
|
|||
|
|
2순위: 손절 → 현재가 <= 매수가 × (1 - SL_PCT) [risk_level에 따라 조정]
|
|||
|
|
3순위: 1차 익절 → +TP1_PCT 도달 → 50% 지정가
|
|||
|
|
4순위: 2차 익절 → +TP2_PCT 도달 → 전량 지정가
|
|||
|
|
5순위: 시간 청산 → MAX_HOLD_MIN 경과 + 무수익
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. 종목 유니버스 (Universe)
|
|||
|
|
|
|||
|
|
매일 08:30 자동 갱신.
|
|||
|
|
|
|||
|
|
**1차 필터 (정적)**
|
|||
|
|
| 조건 | 기준 |
|
|||
|
|
|------|------|
|
|||
|
|
| 시장 | 코스피 + 코스닥 |
|
|||
|
|
| 시가총액 | 1,000억 ~ 3조 |
|
|||
|
|
| 상장 기간 | 6개월 이상 |
|
|||
|
|
| 제외 | 관리종목, 거래정지, 우선주, 스팩, ETF, ETN |
|
|||
|
|
|
|||
|
|
**2차 필터 (동적)**
|
|||
|
|
| 조건 | 기준 |
|
|||
|
|
|------|------|
|
|||
|
|
| 전일 거래대금 | 100억 이상 |
|
|||
|
|
| 5일 평균 거래대금 | 50억 이상 |
|
|||
|
|
| 전일 등락률 | -3% ~ +15% |
|
|||
|
|
| 60일 이평선 | 현재가 위 |
|
|||
|
|
|
|||
|
|
**AI 보정**
|
|||
|
|
- boosted_tickers → 우선 감시 목록 상단 배치
|
|||
|
|
- blacklist_tickers → 당일 유니버스에서 즉시 제거
|
|||
|
|
- avoid_sectors → 해당 섹터 전체 진입 금지
|
|||
|
|
|
|||
|
|
**최대 감시 종목: 30개** (WebSocket 안정성 기준)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. 리스크 관리
|
|||
|
|
|
|||
|
|
### 포지션 규칙
|
|||
|
|
| 항목 | 기본값 | AI 조정 |
|
|||
|
|
|------|--------|--------|
|
|||
|
|
| 1종목 최대 비중 | 총자산 × 20% | × position_size_multiplier |
|
|||
|
|
| 동시 보유 최대 | 2종목 | risk_level=높음 시 1종목 |
|
|||
|
|
| 손절 기준 | -1.5% | risk_level=높음 시 -1.0% |
|
|||
|
|
|
|||
|
|
### 손실 한도 (계층별)
|
|||
|
|
| 레벨 | 조건 | 동작 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| L1 | 1회 매매 -1.5% | 즉시 손절 |
|
|||
|
|
| L2 | 일일 누적 -3% | 당일 신규 진입 중단 |
|
|||
|
|
| L3 | 3연속 손절 | 당일 매매 중단 |
|
|||
|
|
| L4 | 주간 누적 -7% | 주말까지 중단 + 텔레그램 경고 |
|
|||
|
|
| L5 | 월간 누적 -15% | 전략 폐기 + 백테스트 재실행 |
|
|||
|
|
|
|||
|
|
### 안전장치
|
|||
|
|
- VI 발동 → 해당 종목 즉시 청산
|
|||
|
|
- 호가 스프레드 > 0.5% → 진입 금지
|
|||
|
|
- 매수 후 5분 미체결 → 주문 취소
|
|||
|
|
- WebSocket 끊김 → 보유 포지션 즉시 시장가 청산
|
|||
|
|
- API 오류 10건/분 → kill-switch 자동 실행
|
|||
|
|
- Claude API 오류 → daily_context 없을 시 보수적 기본값으로 fallback
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# Claude API 장애 시 fallback
|
|||
|
|
DEFAULT_CONTEXT = {
|
|||
|
|
"trade_allowed": True,
|
|||
|
|
"market_sentiment": "중립",
|
|||
|
|
"sentiment_score": 50,
|
|||
|
|
"risk_level": "보통",
|
|||
|
|
"hot_sectors": [],
|
|||
|
|
"avoid_sectors": [],
|
|||
|
|
"boosted_tickers": [],
|
|||
|
|
"blacklist_tickers": [],
|
|||
|
|
"position_size_multiplier": 0.8, # 보수적으로 축소
|
|||
|
|
"reason": "AI 판단 실패 - 기본값 적용"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. KIS API 활용 전체 목록 (v2.0)
|
|||
|
|
|
|||
|
|
### 기존 (실행 레이어)
|
|||
|
|
| API | 용도 | 방식 |
|
|||
|
|
|-----|------|------|
|
|||
|
|
| H0STCNT0 | 실시간 체결가 | WebSocket |
|
|||
|
|
| H0STASP0 | 실시간 호가 | WebSocket |
|
|||
|
|
| H0STVI0 | VI 발동/해제 | WebSocket |
|
|||
|
|
| TTTC0802U | 주식 매수 주문 | REST POST |
|
|||
|
|
| TTTC0801U | 주식 매도 주문 | REST POST |
|
|||
|
|
| TTTC8001R | 잔고 조회 | REST GET |
|
|||
|
|
|
|||
|
|
### 신규 (AI 판단 레이어)
|
|||
|
|
| API | 용도 | 수집 시각 |
|
|||
|
|
|-----|------|---------|
|
|||
|
|
| FHKST01010100 | 종목 현재가 (KOSPI/KOSDAQ 지수) | 07:40 |
|
|||
|
|
| FHKST03010100 | 업종별 등락률 | 07:40 |
|
|||
|
|
| FHPST01710000 | 거래량 순위 상위 30 | 07:40 |
|
|||
|
|
| FHPST01700000 | 등락률 순위 상위 30 | 07:40 |
|
|||
|
|
| FHKST04430000 | 외국인/기관 순매수 가집계 | 07:40 |
|
|||
|
|
|
|||
|
|
> 위 API 호출은 모두 장 시작 전 단 1회 → rate limit 부담 없음
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9. 스케줄 타임라인 (v2.0)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
07:30 │ [AI] 네이버 금융 뉴스 크롤링 (전일 헤드라인 수집)
|
|||
|
|
07:40 │ [AI] KIS REST API → 수급/순위/업종 데이터 수집
|
|||
|
|
08:00 │ [AI] Claude API 호출 → daily_context.json 생성
|
|||
|
|
│ 텔레그램 알림: "[AI분석] 오늘 시장: 중립 / 반도체 주목"
|
|||
|
|
08:30 │ Universe 갱신 + AI 블랙리스트 적용
|
|||
|
|
08:50 │ WebSocket 연결, 30종목 구독
|
|||
|
|
│ 목표가 계산 (변동성 돌파)
|
|||
|
|
09:00 │ ─────────── 진입 허용 시작 ───────────
|
|||
|
|
│ 1초 단위 asyncio 루프 시작
|
|||
|
|
11:30 │ 신규 진입 중단 (점심)
|
|||
|
|
13:00 │ 신규 진입 재개
|
|||
|
|
14:30 │ 신규 진입 마감
|
|||
|
|
14:50 │ ─────────── 강제 청산 ───────────────
|
|||
|
|
15:00 │ WebSocket 종료
|
|||
|
|
15:10 │ 당일 결산 로그
|
|||
|
|
15:20 │ 텔레그램 일일 결산 알림
|
|||
|
|
15:30 │ 대기
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 10. DB 스키마 (SQLite, v2.0)
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 기존 체결 내역
|
|||
|
|
CREATE TABLE trades (
|
|||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|||
|
|
date TEXT NOT NULL,
|
|||
|
|
ticker TEXT NOT NULL,
|
|||
|
|
entry_time TEXT NOT NULL,
|
|||
|
|
exit_time TEXT,
|
|||
|
|
entry_price REAL NOT NULL,
|
|||
|
|
exit_price REAL,
|
|||
|
|
quantity INTEGER NOT NULL,
|
|||
|
|
side TEXT NOT NULL,
|
|||
|
|
exit_reason TEXT,
|
|||
|
|
pnl REAL,
|
|||
|
|
fee REAL,
|
|||
|
|
slippage REAL,
|
|||
|
|
strategy TEXT DEFAULT 'VB',
|
|||
|
|
ai_boosted INTEGER DEFAULT 0 -- [신규] AI boosted 여부
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- 기존 일일 요약
|
|||
|
|
CREATE TABLE daily_summary (
|
|||
|
|
date TEXT PRIMARY KEY,
|
|||
|
|
total_trades INTEGER,
|
|||
|
|
win_trades INTEGER,
|
|||
|
|
lose_trades INTEGER,
|
|||
|
|
gross_pnl REAL,
|
|||
|
|
total_fee REAL,
|
|||
|
|
net_pnl REAL,
|
|||
|
|
max_drawdown REAL,
|
|||
|
|
trading_stopped INTEGER DEFAULT 0
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- 포지션 (장중 현황)
|
|||
|
|
CREATE TABLE positions (
|
|||
|
|
ticker TEXT PRIMARY KEY,
|
|||
|
|
entry_time TEXT,
|
|||
|
|
entry_price REAL,
|
|||
|
|
quantity INTEGER,
|
|||
|
|
tp1_done INTEGER DEFAULT 0,
|
|||
|
|
target_price REAL,
|
|||
|
|
stop_price REAL
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- [신규] 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, -- JSON 배열
|
|||
|
|
avoid_sectors TEXT, -- JSON 배열
|
|||
|
|
boosted_tickers TEXT, -- JSON 배열
|
|||
|
|
blacklist_tickers TEXT, -- JSON 배열
|
|||
|
|
position_size_mult REAL,
|
|||
|
|
reason TEXT,
|
|||
|
|
claude_tokens_used INTEGER,
|
|||
|
|
api_call_success INTEGER DEFAULT 1
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 11. 알림 설계 (텔레그램, v2.0)
|
|||
|
|
|
|||
|
|
| 이벤트 | 메시지 형식 |
|
|||
|
|
|--------|-----------|
|
|||
|
|
| AI 분석 완료 | `[AI분석] 시장: 중립(62점) / 주목: 반도체,2차전지 / 회피: 금융` |
|
|||
|
|
| AI 진입 차단 | `[AI차단] 삼성전자 진입 차단 - 금융 섹터 회피` |
|
|||
|
|
| 매수 (일반) | `[매수] 삼성전자 74,000원 / 목표 75,480 / 손절 72,890` |
|
|||
|
|
| 매수 (AI부스트) | `[매수★] 하이닉스 185,000원 / AI 추천 종목` |
|
|||
|
|
| 1차 익절 | `[익절1] 삼성전자 +2.1% / 잔여 50%` |
|
|||
|
|
| 손절 | `[손절] 삼성전자 -1.5% / 즉시 청산` |
|
|||
|
|
| 강제 청산 | `[14:50 강제청산] 전 포지션 청산 완료` |
|
|||
|
|
| L2 발동 | `[경고] 일일 손실 -3% 도달. 오늘 매매 중단.` |
|
|||
|
|
| 일일 결산 | `[결산] 매매 5회 / 승 3 패 2 / 순손익 +1.2% / AI 정확도: 3/5` |
|
|||
|
|
| 장애 | `[긴급] WebSocket 끊김. kill-switch 실행.` |
|
|||
|
|
| AI 실패 | `[경고] AI 판단 실패. 기본값 적용 (비중 80%).` |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 12. 비용 분석 (월간)
|
|||
|
|
|
|||
|
|
### Claude API 토큰 사용량 추정
|
|||
|
|
| 작업 | 빈도 | 토큰/회 | 월간 토큰 |
|
|||
|
|
|------|------|---------|---------|
|
|||
|
|
| 일일 시장 판단 | 1회/일 × 22거래일 | ~3,000 | ~66,000 |
|
|||
|
|
| fallback 재시도 | 0~2회/월 | ~3,000 | ~6,000 |
|
|||
|
|
| **합계** | | | **~72,000 토큰/월** |
|
|||
|
|
|
|||
|
|
**월 비용 (Claude Sonnet 4): 약 $2~3 (한화 약 3,000~4,000원)**
|
|||
|
|
|
|||
|
|
### 전체 운영 비용
|
|||
|
|
| 항목 | 월 비용 |
|
|||
|
|
|------|--------|
|
|||
|
|
| KIS API | 무료 |
|
|||
|
|
| Claude API | ~$3 |
|
|||
|
|
| 네이버 크롤링 | 무료 |
|
|||
|
|
| Synology NAS 전기세 | 기존 운영 중이면 추가 없음 |
|
|||
|
|
| **합계** | **~$3/월** |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 13. 백테스트 계획 (v2.0)
|
|||
|
|
|
|||
|
|
### AI 판단 레이어 검증 방법
|
|||
|
|
AI 판단은 백테스트에 직접 포함 불가 (과거 뉴스 재현 어려움).
|
|||
|
|
따라서 2단계로 분리 검증:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1단계: 규칙 기반 백테스트 (기존)
|
|||
|
|
- 변동성 돌파 전략 단독 성과 측정
|
|||
|
|
- K값 최적화, 수수료/슬리피지 반영
|
|||
|
|
|
|||
|
|
2단계: AI 필터 사후 분석 (모의투자 후)
|
|||
|
|
- 3개월 모의투자 후 daily_context.json 이력 vs 실제 결과 대조
|
|||
|
|
- AI가 "avoid" 판단한 날 손실률 vs "trade_allowed" 날 수익률 비교
|
|||
|
|
- AI 판단 정확도 계산 → 임계값 재조정
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 합격 기준 (out-of-sample)
|
|||
|
|
| 지표 | 통과 기준 | 목표 |
|
|||
|
|
|------|----------|------|
|
|||
|
|
| 샤프지수 | > 1.0 | > 1.5 |
|
|||
|
|
| MDD | < 15% | < 10% |
|
|||
|
|
| 승률 | > 45% | > 55% |
|
|||
|
|
| 손익비 | > 1.3 | > 1.8 |
|
|||
|
|
| AI 차단 정확도 | > 55% | > 65% |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 14. 인프라 (docker-compose.yml)
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
version: "3.9"
|
|||
|
|
|
|||
|
|
services:
|
|||
|
|
redis:
|
|||
|
|
image: redis:7-alpine
|
|||
|
|
container_name: stockbot-redis
|
|||
|
|
restart: unless-stopped
|
|||
|
|
volumes:
|
|||
|
|
- ./data/redis:/data
|
|||
|
|
|
|||
|
|
stockbot:
|
|||
|
|
build: ./app
|
|||
|
|
container_name: stockbot-main
|
|||
|
|
restart: unless-stopped
|
|||
|
|
depends_on:
|
|||
|
|
- redis
|
|||
|
|
env_file: .env
|
|||
|
|
volumes:
|
|||
|
|
- ./data:/app/data
|
|||
|
|
- ./logs:/app/logs
|
|||
|
|
environment:
|
|||
|
|
- TZ=Asia/Seoul
|
|||
|
|
logging:
|
|||
|
|
driver: "json-file"
|
|||
|
|
options:
|
|||
|
|
max-size: "10m"
|
|||
|
|
max-file: "5"
|
|||
|
|
|
|||
|
|
kill-switch:
|
|||
|
|
build: ./kill_switch
|
|||
|
|
container_name: stockbot-killswitch
|
|||
|
|
restart: "no"
|
|||
|
|
env_file: .env
|
|||
|
|
profiles: ["emergency"]
|
|||
|
|
|
|||
|
|
dashboard:
|
|||
|
|
build: ./monitor
|
|||
|
|
container_name: stockbot-dashboard
|
|||
|
|
restart: unless-stopped
|
|||
|
|
ports:
|
|||
|
|
- "8501:8501"
|
|||
|
|
volumes:
|
|||
|
|
- ./data:/app/data
|
|||
|
|
environment:
|
|||
|
|
- TZ=Asia/Seoul
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### .env 구조 (v2.0)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
# KIS API
|
|||
|
|
KIS_APP_KEY=...
|
|||
|
|
KIS_APP_SECRET=...
|
|||
|
|
KIS_ACCOUNT_NO=...
|
|||
|
|
KIS_MOCK=true
|
|||
|
|
|
|||
|
|
# Claude API (신규)
|
|||
|
|
ANTHROPIC_API_KEY=...
|
|||
|
|
CLAUDE_MODEL=claude-sonnet-4-20250514
|
|||
|
|
|
|||
|
|
# 텔레그램
|
|||
|
|
TELEGRAM_TOKEN=...
|
|||
|
|
TELEGRAM_CHAT_ID=...
|
|||
|
|
|
|||
|
|
# Redis
|
|||
|
|
REDIS_HOST=stockbot-redis
|
|||
|
|
REDIS_PORT=6379
|
|||
|
|
|
|||
|
|
# 운영 모드
|
|||
|
|
DRY_RUN=true
|
|||
|
|
LOG_LEVEL=INFO
|
|||
|
|
AI_ENABLED=true # false 시 AI 레이어 비활성화, 기본값 사용
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 15. 개발 로드맵 (v2.0)
|
|||
|
|
|
|||
|
|
### Phase 1 — 데이터 기반 구축 (2주)
|
|||
|
|
- [ ] KIS Open API 신청 + 모의투자 계좌
|
|||
|
|
- [ ] pykrx 분봉 데이터 백필 (2021~2024)
|
|||
|
|
- [ ] SQLite 스키마 (v2.0 포함)
|
|||
|
|
- [ ] Universe 스캐너 구현
|
|||
|
|
- [ ] Docker Compose NAS 기동 확인
|
|||
|
|
|
|||
|
|
### Phase 2 — 백테스트 (3주)
|
|||
|
|
- [ ] vectorbt 변동성 돌파 백테스트
|
|||
|
|
- [ ] 수수료/슬리피지 반영
|
|||
|
|
- [ ] K값 그리드 서치 + out-of-sample 검증
|
|||
|
|
|
|||
|
|
### Phase 3 — KIS 연동 + dry-run (2주)
|
|||
|
|
- [ ] KIS REST/WebSocket 클라이언트
|
|||
|
|
- [ ] OrderExecutor (시장가/지정가/IOC)
|
|||
|
|
- [ ] DRY_RUN=true 신호 발생 확인
|
|||
|
|
|
|||
|
|
### Phase 4 — AI 레이어 구현 (2주) ← 신규
|
|||
|
|
- [ ] 네이버 금융 뉴스 크롤러 구현
|
|||
|
|
- [ ] KIS 순위/수급 API 수집 모듈
|
|||
|
|
- [ ] Claude API 연동 + 프롬프트 튜닝
|
|||
|
|
- [ ] daily_context.json 생성 파이프라인
|
|||
|
|
- [ ] fallback 로직 구현
|
|||
|
|
- [ ] ai_context_log DB 저장
|
|||
|
|
|
|||
|
|
### Phase 5 — 리스크 + 알림 + 대시보드 (2주)
|
|||
|
|
- [ ] RiskManager L1~L5 구현
|
|||
|
|
- [ ] kill-switch 컨테이너
|
|||
|
|
- [ ] 텔레그램 Notifier (AI 메시지 포함)
|
|||
|
|
- [ ] Streamlit 대시보드 (AI 판단 현황 패널 추가)
|
|||
|
|
|
|||
|
|
### Phase 6 — 모의투자 실운영 (최소 3개월)
|
|||
|
|
- [ ] KIS_MOCK=true, DRY_RUN=false
|
|||
|
|
- [ ] 매일 결산 로그 + AI 정확도 추적
|
|||
|
|
- [ ] 3개월 후 AI 필터 임계값 재조정
|
|||
|
|
- [ ] 샤프 > 1.0, MDD < 15% 달성 시 Phase 7
|
|||
|
|
|
|||
|
|
### Phase 7 — 소액 실거래 (무기한)
|
|||
|
|
- [ ] KIS_MOCK=false
|
|||
|
|
- [ ] 총자산 5% 한도로 시작
|
|||
|
|
- [ ] 1개월 단위 성과 검토
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 16. 보안 체크리스트
|
|||
|
|
|
|||
|
|
- [ ] .env → .gitignore 등록
|
|||
|
|
- [ ] KIS/Anthropic API 키 → GitHub 절대 금지
|
|||
|
|
- [ ] ANTHROPIC_API_KEY 월 1회 암호화 백업
|
|||
|
|
- [ ] Synology 방화벽: 8501 내부망만 허용
|
|||
|
|
- [ ] 텔레그램 봇: chat_id 화이트리스트
|
|||
|
|
- [ ] 주문 로그 SQLite + logs/ 이중 보관
|
|||
|
|
- [ ] AI 판단 이력 ai_context_log 영구 보관
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 17. 절대 금지 (하드코딩)
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
BLACKLIST_REASONS = [
|
|||
|
|
"신규상장 6개월 미만", "관리종목", "투자경고",
|
|||
|
|
"거래정지", "우선주", "스팩", "ETF/ETN",
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
TRADING_BLACKOUT = [
|
|||
|
|
("11:30", "13:00"), # 점심
|
|||
|
|
("14:50", "15:30"), # 마감
|
|||
|
|
("08:00", "09:00"), # 동시호가
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
HARD_EXIT_TIME = "14:50" # 절대 변경 불가
|
|||
|
|
|
|||
|
|
# AI가 trade_allowed=false 반환해도 이미 보유 중인 포지션 청산은 진행
|
|||
|
|
# AI는 신규 진입만 차단, 청산 로직에는 관여하지 않음
|
|||
|
|
AI_SCOPE = "ENTRY_ONLY" # 절대 변경 불가
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 18. 면책 조항
|
|||
|
|
|
|||
|
|
> 본 기획서는 시스템 설계 문서이며, 투자 수익을 보장하지 않는다.
|
|||
|
|
> AI 판단 레이어는 보조 필터일 뿐, 수익을 보장하지 않는다.
|
|||
|
|
> 단타는 개인투자자의 90% 이상이 손실을 보는 영역이다.
|
|||
|
|
> 반드시 모의투자 3개월 이상 검증 후 실거래 전환할 것.
|