fix: ML 게이트 스케일 불일치 + 운영 실측 반영 (문서 정정 3건)
## ML 게이트 이중 블렌딩 (플래그 OFF 로 출고) market_analyzer.py:603-608 이 이미 rule30/ML70 으로 블렌딩한 뒤 0~15 로 축소 저장하는데, trade_executor 가 그 값을 정규화 없이 **또** 블렌딩했다. weighted_score = score_val(0~15) * 0.3 + ml_score(0~100) * 0.7 ≥ 60 룰 기여가 최대 4.5 로 임계 60 의 7.5% — 문서상 "룰 30%" 가 지켜지지 않았다. _ml_gate_score_v2() 신설 + ML_SCORE_NORMALIZE_ENABLED(기본 False). OFF 시 7,373 조합 비트 동일 검증. RULE_SCORE_MAX=15 신설(하드코딩 제거). 운영 실측으로 확인된 것: ML-BUY 분기는 어느 설정으로도 발화 불가. OFF: ml_score ≥ 85.7 필요 / 실측 ml_score 최대 50 ON : score ≥ 9 필요 / 실측 score 역대 최대 6 (801건) 즉 ML 게이트는 HOLD 차단(브레이크)으로만 기능해 왔다. 임계값 재보정이 필요하며 §8.1-5 에 따라 백테스트가 선행돼야 한다. ## 문서 정정 (잘못된 전제 제거) 1. "NAS 다운 → 백테스트 불가" 는 사실이 아니다. NAS 는 가동 중이고 autostock-postgres 도 떠 있다. DB 가 127.0.0.1:15433 바인딩이라 외부 직결만 안 되는 것이며, NAS 내부에서 접근 가능하다. **백테스트 재실행 가능.** 2. docs/BATCH_GUIDE.md 의 cron 서술 정정 — 운영 NAS 에 crontab 이 없고 앱 내부 스케줄러(main.py:269 → schedulers.py:74, 10분 간격)가 배치를 돌린다. setup-cron.sh 를 쓰면 오히려 중복 실행된다. 3. market_schedule.py 에 휴장일 판정이 없다 — 2026-09-24~25 거래·분석 0건은 추석 연휴이며 장애가 아니다. ## §8.4.1 운영 실측 신설 - daytrading 257건 vs swing 53건 (DT 가 거래 건수 주력). DT 포지션 0 은 15:20 EOD 전량 청산이 설계대로 동작한 결과 - strategy_configs 가 옛 값으로 운영되던 상태(RSI 30 / SL -6%)를 2026-09-28 배포(alembic 0011→0012)로 해소 - 룰 점수는 0~15 스케일(market_analyzer.py:608 에서 축소 저장), 실측 -1~6 - 9/23 에 active_trades 유령 행 129개(day_trade 120 + swing 9)를 수동 정리한 백업이 남아 있다 — 전략명 없이 close 해 엉뚱한 행이 닫히던 문제의 증거 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -13,7 +13,19 @@
|
||||
|
||||
## 무엇이 언제 도는가
|
||||
|
||||
`setup-cron.sh` 가 등록하는 cron 잡은 **3개**다(모두 평일, `docker exec autostock-backend` 경유).
|
||||
> ⚠️ **2026-09-28 정정**: 아래 cron 방식은 `setup-cron.sh` 가 제공하는 **선택적** 경로다.
|
||||
> **운영 NAS 에는 crontab 이 등록되어 있지 않고**(root·사용자 모두 비어 있음), 실제로는
|
||||
> **앱 내부 스케줄러가 배치를 돌린다.** 이전 판(2026-09-27)이 cron 을 주 메커니즘으로
|
||||
> 기술한 것은 스크립트만 읽고 실제 운영 상태를 확인하지 않은 오류였다.
|
||||
|
||||
**실제 동작 (기본)**: 앱 기동 시 `main.py:269` 가 `batch_analysis_scheduler()` 태스크를 띄우고,
|
||||
`services/schedulers.py:74` 가 **10분 간격**으로 `stock_analysis` 를 갱신한다. cron 등록 없이도
|
||||
분석 데이터가 쌓이며, 실측으로 평일 200종목 전후가 매일 저장된다.
|
||||
|
||||
로그는 컨테이너 로그로 나간다: `docker logs autostock-backend | grep -i batch`
|
||||
|
||||
**선택: cron 등록** — `setup-cron.sh` 를 실행하면 아래 3개 잡이 등록된다(모두 평일, `docker exec` 경유).
|
||||
앱 내부 스케줄러와 **중복 실행**되므로, 쓸 거라면 어느 쪽을 정본으로 할지 먼저 정하라.
|
||||
|
||||
| 시각 | 스크립트 | 로그 |
|
||||
|------|----------|------|
|
||||
@@ -21,7 +33,12 @@
|
||||
| 08:50 | `batch_daily_analysis.py` | `logs/batch_analysis.log` |
|
||||
| 09:00~15:00 매 10분 | `batch_intraday_analysis.py` | `logs/batch_intraday.log` |
|
||||
|
||||
토큰 프리페치가 06:00에 먼저 도는 이유: KIS 토큰 발급은 1분에 1회 제한이라, 08:50 배치가 토큰 발급부터 시작하면 실패 시 재시도 여유가 없다.
|
||||
토큰 프리페치가 06:00 에 먼저 도는 이유: KIS 토큰 발급은 1분에 1회 제한이라, 08:50 배치가
|
||||
토큰 발급부터 시작하면 실패 시 재시도 여유가 없다.
|
||||
|
||||
⚠️ **공휴일 인식이 없다.** `core/market_schedule.py` 는 요일·시간만 판정하고 휴장일 목록이 없다.
|
||||
2026-09-24~25(추석 연휴)에 `stock_analysis` 행과 거래가 0건인 것은 **정상**이며 장애가 아니다.
|
||||
휴장일에 분석이 도는 것을 막고 싶으면 휴장일 판정을 추가해야 한다.
|
||||
|
||||
## 수동 실행
|
||||
|
||||
|
||||
Reference in New Issue
Block a user