refactor: enhance Optuna backtesting framework, optimize orderbook filtering, and update database management utilities.

This commit is contained in:
Your Name
2026-08-12 10:19:19 +09:00
parent cb7e5037a0
commit c6bd62a25f
218 changed files with 31613 additions and 759 deletions

View File

@@ -542,6 +542,7 @@ def resolve_momentum_sell_for_bar(
is_eod: bool = False,
ticks_by_code: Optional[Dict[str, Dict[str, List[Dict[str, Any]]]]] = None,
code: str = "",
orderbook_by_code: Optional[Dict[str, Any]] = None,
) -> Optional[Tuple[str, float, str, float, str]]:
"""
한 분봉 청산 — 틱 우선 → (옵션) OHLC intrabar → last-price 벽시계.
@@ -551,15 +552,37 @@ def resolve_momentum_sell_for_bar(
exit_source: ws_ticks | ohlc_bar | wallclock_last
"""
from kis_trader.engine.momentum_engine import check_sell_signal_momentum_backtest_bar
from kis_trader.engine.momentum_hts_logic import (
collect_exit_ob_or_history,
need_ob_or_history,
_ob_or_ma_window_for_history,
)
ct = str(bar.get("candle_time") or "")
entry_time = str(position.get("entry_time") or "")
if momentum_backtest_use_tick_exit(params) and ticks_by_code and code:
# 수익구간·손절호가 OR 히스토리 (둘 중 ON일 때만 DB 스냅 수집 · 기본 OFF → no-op)
p = params
if need_ob_or_history(p) and code and orderbook_by_code:
ors = collect_exit_ob_or_history(
orderbook_by_code,
code,
entry_time=entry_time,
asof_time=ct,
ma_window=_ob_or_ma_window_for_history(p),
)
position["_ob_or_history"] = ors
p = dict(params)
p["_ob_or_history"] = list(ors)
else:
p = dict(params)
p["_ob_or_history"] = list(position.get("_ob_or_history") or [])
if momentum_backtest_use_tick_exit(p) and ticks_by_code and code:
minute_ticks = collect_minute_ticks(ticks_by_code, code, ct)
if minute_ticks:
tick_res = try_momentum_sell_on_ticks(
position, minute_ticks, params,
position, minute_ticks, p,
is_eod=is_eod, entry_time=entry_time,
)
if tick_res:
@@ -588,10 +611,10 @@ def resolve_momentum_sell_for_bar(
# 절대규칙: 틱 청산 ON 이면 OHLC 봉 폴백으로 숫자 변조 금지
# (FALLBACK_OHLC 체크 ON 이어도 무시. 벽시계 last-price 는 OHLC intrabar 가 아님)
if (
not momentum_backtest_use_tick_exit(params)
and momentum_backtest_tick_fallback_ohlc(params)
not momentum_backtest_use_tick_exit(p)
and momentum_backtest_tick_fallback_ohlc(p)
):
res = check_sell_signal_momentum_backtest_bar(position, bar, params, is_eod=is_eod)
res = check_sell_signal_momentum_backtest_bar(position, bar, p, is_eod=is_eod)
if res:
reason, exit_price = res
try:
@@ -602,7 +625,7 @@ def resolve_momentum_sell_for_bar(
hold_min = 0.0
return reason, float(exit_price), ct, hold_min, "ohlc_bar"
if not momentum_backtest_wallclock_last_price(params):
if not momentum_backtest_wallclock_last_price(p):
return None
last_px = resolve_momentum_wallclock_last_px(
@@ -612,7 +635,7 @@ def resolve_momentum_sell_for_bar(
return None
update_momentum_bt_last_px(position, last_px, ct)
wall_res = try_momentum_sell_wallclock_last(
position, last_px, ct, params, is_eod=is_eod,
position, last_px, ct, p, is_eod=is_eod,
)
if not wall_res:
return None