사용자 확정: 예측 차트와 실제 차트 매칭은 다음 거래일 장이 끝나는 시점으로. - README.md: 매칭 배치 시각을 KRX 정규장 마감(15:30) 후 종가 확정 시점 (16:00 ~ 16:30 KST 사이) 으로 명시. 주말/공휴일은 다음 거래일로 이월. - scheduler.py docstring: Phase 4 슬롯을 "16:30 KST 평일 prediction_outcomes 매칭 배치" 로 구체화. 추론은 on-demand 만 사용한다는 점도 명시. 코드 동작 변화 없음(스케줄러는 아직 daily_batch 1개 잡만 등록). Phase 4 진입 시 이 정책대로 매칭 잡을 추가. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
"""APScheduler 기반 백그라운드 잡.
|
|
|
|
- 16:00 KST 평일: daily_batch (시드 10종목 EOD/뉴스/공시/거시 갱신)
|
|
- (Phase 4) 16:30 KST 평일: prediction_outcomes 매칭 배치.
|
|
user_triggered=TRUE 예측 중 target_date == 당일 거래일 인 행을,
|
|
KRX 정규장 마감(15:30) 후 확정된 종가/방향과 매칭해 적재.
|
|
주말/공휴일이 끼면 다음 거래일로 자연 이월(거래일이 아니면 매칭할 종가가 없으니 스킵).
|
|
- (Phase 4) 02:00 KST 일요일: 최근 30일 hit rate 기반 앙상블 가중치 보정,
|
|
임계 미만 모델은 LGBM 재학습.
|
|
|
|
예측 추론(inference) 자체는 사용자가 "예상차트 보기" 누른 시점에 on-demand 로만 돌고,
|
|
스케줄러에서는 돌리지 않음.
|
|
|
|
FastAPI 기동 시점에 lifespan 으로 start, 종료 시 shutdown.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from apscheduler.schedulers.background import BackgroundScheduler
|
|
from apscheduler.triggers.cron import CronTrigger
|
|
from pytz import timezone
|
|
|
|
from app.pipelines.daily_batch import run_daily_batch
|
|
|
|
logger = logging.getLogger(__name__)
|
|
KST = timezone("Asia/Seoul")
|
|
|
|
_scheduler: BackgroundScheduler | None = None
|
|
|
|
|
|
def start_scheduler() -> BackgroundScheduler:
|
|
global _scheduler
|
|
if _scheduler:
|
|
return _scheduler
|
|
_scheduler = BackgroundScheduler(timezone=KST)
|
|
_scheduler.add_job(
|
|
run_daily_batch,
|
|
CronTrigger(hour=16, minute=0, timezone=KST),
|
|
id="daily_batch_16",
|
|
replace_existing=True,
|
|
max_instances=1,
|
|
)
|
|
_scheduler.start()
|
|
logger.info("scheduler started (daily_batch @ 16:00 KST)")
|
|
return _scheduler
|
|
|
|
|
|
def shutdown_scheduler() -> None:
|
|
global _scheduler
|
|
if _scheduler:
|
|
_scheduler.shutdown(wait=False)
|
|
_scheduler = None
|
|
logger.info("scheduler stopped")
|