Files
stock_chart_site/backend/app/pipelines/scheduler.py
tkrmagid 239b104a2b docs(phase-1a): 예측-실제 매칭 정책을 "다음 거래일 장 종료 후"로 확정
사용자 확정: 예측 차트와 실제 차트 매칭은 다음 거래일 장이 끝나는 시점으로.

- 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>
2026-05-20 15:46:23 +09:00

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")