fix(정합성·뱃지): 틱 로더 recv_ts 전달 · _lag_sec 폴백 · use_rust 결과JSON 기록

Q1) 쓰레기 스킵 22.8% 여전한 이유 → 로더가 recv_ts 를 tick dict 에 안 넣음
- breakout_tick_loader._ingest_tick_rows: recv_ts 문자열 필드 추가
  (bar_is_garbage 가 wall-clock 정합 판정에 사용)
- feed_fallback.bar_is_garbage: _lag_sec 사전계산 필드 최우선 사용
  Rust Parquet 로더는 recv_ts 없이 _lag_sec 만 실어옴 → 이 폴백으로 커버
- 우선순위: _lag_sec > recv_ts > 봉끝(레거시)

Q2) 자동 등록 잡 (mode_refine phase1/phase2) 뱃지  뜨는 이유
- register_result_json_as_job 이 원본 JSON 의 use_rust 를 읽는데 없어서 None
- optuna_web_jobs: inherit_use_rust 인자 신설 → 부모 실행 잡 값 상속
- _spawn_job_reaper: register 호출 시 부모 use_rust 전달
- optuna_common.annotate_optuna_period_daily_avg: 결과 JSON 저장 훅에
  use_rust=bool(BACKTEST_USE_RUST=='1') 자동 삽입
  → 4전략(tail/momentum/breakout/scalp) 모두 커버 (근본)

우선순위: 원본 JSON use_rust > 부모 잡 상속 > None()

실매 스모크: logs/test_live_execution_validation_20260906_194154.log → 최종: 통과
웹 재시작 200. 다음 옵투나 실행부터 반영.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Your Name
2026-09-06 19:42:17 +09:00
parent b5d7c5d848
commit 94daf529f0
4 changed files with 49 additions and 13 deletions

View File

@@ -188,6 +188,15 @@ def _ingest_tick_rows(
if len(tt) < 12:
continue
minute_key = tt[:12]
# recv_ts: bar_is_garbage 가 wall-clock 정합 판정에 사용 (docs/정합성.md §9)
# 문자열로 보존 (feed_fallback 이 파싱). None 이면 봉끝 폴백.
_recv_raw = r.get("recv_ts")
_recv_str = ""
if _recv_raw is not None:
try:
_recv_str = _recv_raw.strftime("%Y-%m-%d %H:%M:%S") if hasattr(_recv_raw, "strftime") else str(_recv_raw)
except Exception:
_recv_str = str(_recv_raw)
tick = {
"code": code,
"tick_time": tt,
@@ -195,6 +204,7 @@ def _ingest_tick_rows(
"volume": int(r.get("volume") or 0),
"source": r.get("source") or "",
"_lag_sec": kw_lag,
"recv_ts": _recv_str, # 2026-09-06: wall-clock 정합용 (docs/정합성.md §9)
}
bucket = out[code].setdefault(minute_key, [])
bucket.append(tick)