72 lines
2.8 KiB
Markdown
72 lines
2.8 KiB
Markdown
|
|
# claude_midday — 장중 분석
|
||
|
|
|
||
|
|
11:20 스케줄러가 자동 실행. 오전 결과 분석 후 점심 세션 파라미터 결정 → midday_context.json 저장.
|
||
|
|
|
||
|
|
## 실행 순서
|
||
|
|
|
||
|
|
### 1. 데이터 수집
|
||
|
|
```bash
|
||
|
|
python app/ai/midday.py --print
|
||
|
|
```
|
||
|
|
수집 항목:
|
||
|
|
- **오전 거래 결과**: 체결 내역, 승/패, 연속 손절 수, 순손익
|
||
|
|
- **현재 포지션**: 보유 중인 종목 및 현재 손익
|
||
|
|
- **시장 스냅샷**: 거래량 순위(현재), 업종별 등락률
|
||
|
|
- **아침 컨텍스트**: daily_context.json (오전 예측 비교용)
|
||
|
|
|
||
|
|
### 2. 분석
|
||
|
|
|
||
|
|
오전 daily_context 예측과 실제 결과를 비교해 점심 세션 파라미터를 결정한다.
|
||
|
|
|
||
|
|
**비교 포인트:**
|
||
|
|
- 오전 예측 hot_sectors ↔ 실제 업종 등락률 — 예측이 맞았는가?
|
||
|
|
- 거래량 순위 변화 — 새로 뜨는 종목 / 사라진 종목
|
||
|
|
- 오전 거래 결과 — 전략이 작동했는가, 연속 손절 상태인가?
|
||
|
|
|
||
|
|
**판단 항목:**
|
||
|
|
- **lunch_trade_allowed**: false이면 점심 세션 진입 없음
|
||
|
|
- sentiment_score < 40이거나, 연속 손절 3회 이상이면 false 권장
|
||
|
|
- **position_size_multiplier**: B안 연속 손절 배율 × 시장 판단
|
||
|
|
- 연속 손절 0회: 1.0 / 1회: 0.7 / 2회: 0.5 / 3회+: 0.3
|
||
|
|
- 시장이 오전 예측보다 좋으면 상향, 나쁘면 하향
|
||
|
|
- **hot_sectors**: 오전 대비 업데이트 (실제 강한 업종)
|
||
|
|
- **avoid_sectors**: 오전 대비 업데이트 (실제 약한 업종)
|
||
|
|
- **strategy_note**: 전략 조정이 필요하면 메모 (없으면 빈 문자열)
|
||
|
|
- **reason**: 50자 이내 장중 요약
|
||
|
|
|
||
|
|
### 3. midday_context.json 저장
|
||
|
|
분석 결과를 `data/midday_context.json`에 저장한다. 형식:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"date": "YYYY-MM-DD",
|
||
|
|
"generated_at": "HH:MM:SS",
|
||
|
|
"lunch_trade_allowed": true,
|
||
|
|
"position_size_multiplier": 0.8,
|
||
|
|
"hot_sectors": ["반도체"],
|
||
|
|
"avoid_sectors": ["건설업"],
|
||
|
|
"strategy_note": "",
|
||
|
|
"reason": "50자 이내 요약"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
파일이 저장되는 즉시 봇이 감지해 점심 세션을 시작한다.
|
||
|
|
|
||
|
|
### 4. Discord 알림 전송
|
||
|
|
```bash
|
||
|
|
python -c "
|
||
|
|
import asyncio, json, os, sys
|
||
|
|
sys.path.insert(0, '.')
|
||
|
|
from app.main import load_env; load_env()
|
||
|
|
from app.monitor.notifier import send
|
||
|
|
ctx = json.load(open('data/midday_context.json', encoding='utf-8'))
|
||
|
|
hot = ', '.join(ctx.get('hot_sectors', [])) or '없음'
|
||
|
|
avoid = ', '.join(ctx.get('avoid_sectors', [])) or '없음'
|
||
|
|
flag = '✅ 점심진입허용' if ctx.get('lunch_trade_allowed', True) else '🚫 점심진입중단'
|
||
|
|
msg = f'[장중분석] {ctx[\"date\"]} {ctx.get(\"generated_at\",\"\")}\n{flag} | 포지션배율: x{ctx.get(\"position_size_multiplier\",1.0)}\n주목: {hot} | 회피: {avoid}\n📝 {ctx.get(\"reason\",\"\")}'
|
||
|
|
asyncio.run(send(msg))
|
||
|
|
print('Discord 전송 완료')
|
||
|
|
"
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. 완료
|
||
|
|
분석 요약을 한 줄로 출력하고 종료한다.
|