auto: 일일 백업 2026-09-23 02:00

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hyowons
2026-09-23 02:00:05 +09:00
parent 408a3e0d4a
commit 0157b24a55
122 changed files with 1751 additions and 1238 deletions
+11 -2
View File
@@ -1295,7 +1295,7 @@ def _build_owner_data(positions_by_acc: dict, balances: dict, journal_by_label:
nxt_inactive_set = set((prev_snap_all or {}).get('_nxt_inactive') or [])
for r in consolidated:
r['pred_close_krx'] = r.get('pred_close', 0)
if r.get('code') in nxt_inactive_set:
if r.get('code') in nxt_inactive_set or not _is_nxt_traded(r.get('code') or ''):
r['_nxt_inactive'] = True
# 개별 종목의 day_change/pred_close를 어제 NXT 종가 baseline으로 재계산.
# kt00018 NXT 응답의 pred_close_pric가 KRX 종가로 채워져 raw day_change가 NXT-vs-KRX 갭으로
@@ -1817,6 +1817,15 @@ def _fetch_all_data(entries: list[dict], only_owner: str | None = None) -> dict:
'price': qa.get('price', 0), 'change_pct': qa.get('change_pct', 0.0),
'change': qa.get('change', 0), 'volume': qa.get('volume', 0),
}
# NXT 미거래 종목은 통합(AL)과 KRX가 같은 시장값이어야 한다. 전날 NXT
# 스냅샷이 stale 하더라도 KRX 배치시세의 전일종가로 화면 기준을 즉시 교정한다.
if r.get('_nxt_inactive') and qk_valid:
krx_prev = (qk.get('price', 0) or 0) - (qk.get('change', 0) or 0)
if krx_prev > 0:
r['pred_close_snap'] = krx_prev
r['pred_close'] = krx_prev
r['day_change'] = qk.get('change', 0) or 0
r['day_change_pct'] = qk.get('change_pct', 0.0) or 0.0
# 단일 캔들 primary — 4값(open/high/low/price) 모두 있는 응답만 후보. 거래 없는 시간대 0값 응답 배제.
# 통합(AL) 우선 — 시간대에 따라 캔들이 뒤바뀌지 않고 하루 한 개로 유지된다.
# NXT 미거래 종목은 AL == KRX 라 결과가 같다. AL 이 불완전할 때만 KRX 로 폴백.
@@ -3052,7 +3061,7 @@ def _render_row(c: dict, source: str = 'watchlist') -> str:
if pc > 0:
pred_close_krx = pc
# NXT 미상장 종목은 baseline 무효화 → NXT 컬럼 `-` placeholder.
if c.get('_nxt_inactive'):
if c.get('_nxt_inactive') or not _is_nxt_traded(c.get('code') or ''):
pred_close_nxt = 0
else:
nxt_ref = c.get('_pred_close_nxt')