2026-05-18 12:57:46 +09:00
|
|
|
# claude_morning — 장 전 분석
|
|
|
|
|
|
|
|
|
|
오늘 날짜 기준으로 장 전 분석을 수행하고 `data/daily_context.json`을 생성한다.
|
2026-05-19 08:35:19 +09:00
|
|
|
07:30에 스케줄러가 자동 실행. 완료 후 /start-bot으로 봇 시작.
|
2026-05-18 12:57:46 +09:00
|
|
|
|
|
|
|
|
## 실행 순서
|
|
|
|
|
|
|
|
|
|
### 1. 데이터 수집
|
|
|
|
|
```bash
|
|
|
|
|
python app/ai/morning.py --print
|
|
|
|
|
```
|
2026-05-19 08:35:19 +09:00
|
|
|
위 명령을 실행해 다음 데이터를 수집한다:
|
|
|
|
|
- **RSS 뉴스**: 한경증권·한경경제·파이낸셜뉴스·매경증권 4개 언론사 (~80건)
|
|
|
|
|
- **KIS 수급**: 거래량 상위 30종목, 외국인/기관 순매수 상위 10종목, 업종 동향
|
|
|
|
|
- **종목별 뉴스**: 네이버 검색 API로 거래량 상위 20종목 각 5건
|
2026-05-18 12:57:46 +09:00
|
|
|
|
|
|
|
|
### 2. 분석
|
|
|
|
|
수집된 데이터를 바탕으로 다음 항목을 판단한다:
|
|
|
|
|
- **시장 분위기**: 강세 / 중립 / 약세
|
|
|
|
|
- **감성 점수**: 0~100 (50=중립, 70이상=강세, 30이하=약세)
|
|
|
|
|
- **리스크 레벨**: 낮음 / 보통 / 높음
|
|
|
|
|
- **주목 섹터**: 수급·뉴스 모두 긍정적인 섹터
|
|
|
|
|
- **회피 섹터**: 악재·수급 부진 섹터
|
|
|
|
|
- **boosted_tickers**: 거래량 상위 + 외국인 순매수 겹치는 종목코드
|
2026-05-19 08:35:19 +09:00
|
|
|
- **blacklist_tickers**: 종목별 뉴스에서 악재(횡령·소송·거래정지 등) 감지된 종목코드
|
2026-05-18 12:57:46 +09:00
|
|
|
- **position_size_multiplier**: 0.5(약세) ~ 1.0(중립) ~ 1.5(강세)
|
|
|
|
|
- **trade_allowed**: sentiment_score < 40이면 false
|
|
|
|
|
|
|
|
|
|
### 3. daily_context.json 저장
|
|
|
|
|
분석 결과를 `data/daily_context.json`에 저장한다. 형식:
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"date": "YYYY-MM-DD",
|
|
|
|
|
"generated_at": "HH:MM:SS",
|
|
|
|
|
"trade_allowed": true,
|
|
|
|
|
"market_sentiment": "중립",
|
|
|
|
|
"sentiment_score": 62,
|
|
|
|
|
"risk_level": "보통",
|
|
|
|
|
"hot_sectors": ["반도체", "2차전지"],
|
|
|
|
|
"avoid_sectors": ["금융", "건설"],
|
|
|
|
|
"boosted_tickers": ["005930", "000660"],
|
|
|
|
|
"blacklist_tickers": [],
|
|
|
|
|
"position_size_multiplier": 1.0,
|
|
|
|
|
"reason": "50자 이내 시장 요약"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 4. Discord 알림 전송
|
|
|
|
|
아래 Python 코드를 실행해 분석 결과를 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/daily_context.json', encoding='utf-8'))
|
|
|
|
|
hot = ', '.join(ctx.get('hot_sectors', [])) or '없음'
|
|
|
|
|
avoid = ', '.join(ctx.get('avoid_sectors', [])) or '없음'
|
|
|
|
|
boosted = ', '.join(ctx.get('boosted_tickers', [])) or '없음'
|
|
|
|
|
flag = '✅ 거래허용' if ctx.get('trade_allowed', True) else '🚫 거래중단'
|
|
|
|
|
msg = f'[장전분석] {ctx[\"date\"]} {ctx.get(\"generated_at\",\"\")}\n시장: {ctx[\"market_sentiment\"]}({ctx[\"sentiment_score\"]}점) | 리스크: {ctx[\"risk_level\"]} | {flag}\n주목 섹터: {hot}\n회피 섹터: {avoid}\n관심 종목: {boosted}\n비중 배율: x{ctx.get(\"position_size_multiplier\",1.0)}\n📝 {ctx.get(\"reason\",\"\")}'
|
|
|
|
|
asyncio.run(send(msg))
|
|
|
|
|
print('Discord 전송 완료')
|
|
|
|
|
"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 5. 완료
|
|
|
|
|
분석 요약을 한 줄로 출력하고 종료한다.
|