chore: 작업 중 발생한 부수적 변경 사항 및 누락된 파일 전체 커밋

- 프론트엔드 UI 업데이트 (backtest.html, backtest.js) 엔진 라디오 버튼 통합 관련 반영
- Rust 플러그인(kis_rust_core) 및 컴파일 소스코드 추가
- CLI 백테스트 스크립트 수정 및 최신화
- 기타 스크래치 테스트 스크립트, 로그 요약 마크다운(.md) 등 누락 파일 일괄 반영
- 추가적으로 아직 발견되지 않은 엣지 케이스나 렌더링 오류가 포함되어 있을 가능성이 있음
This commit is contained in:
Your Name
2026-09-06 17:04:50 +09:00
parent 4dbb1387a1
commit e1ac8d119b
181 changed files with 8371 additions and 503 deletions

View File

@@ -21,7 +21,7 @@ from kis_trader.backtest.backtest_portfolio_common import (
summarize_trades,
)
from kis_trader.backtest.breakout_tick_loader import (
load_breakout_ticks_by_code,
load_common_ticks_by_code,
tick_coverage_stats,
)
from kis_trader.engine import scalping_engine as se
@@ -288,8 +288,9 @@ def run_scalping_backtest_web_aligned(
)
_tick_tbl = "ls_ws_ticks"
else:
loaded_ticks, tick_rows = load_breakout_ticks_by_code(
loaded_ticks, tick_rows = load_common_ticks_by_code(
db, start_key, end_key, set(candles_by_code.keys()),
use_spill_fallback=(str(engine_params.get("backtest_use_spill_fallback", True)).lower() in ("1", "true", "t", "y", "yes", "on")),
)
_tick_tbl = "ws_ticks"
tick_meta = tick_coverage_stats(candles_by_code, loaded_ticks)
@@ -304,7 +305,12 @@ def run_scalping_backtest_web_aligned(
_tick_tbl,
)
elif loaded_ticks:
tick_meta = tick_coverage_stats(candles_by_code, loaded_ticks)
if "_tick_meta_cached" in engine_params:
tick_meta = dict(engine_params["_tick_meta_cached"])
else:
tick_meta = tick_coverage_stats(candles_by_code, loaded_ticks)
engine_params["_tick_meta_cached"] = tick_meta
tick_meta["ws_tick_rows_loaded"] = sum(
len(lst) for cm in loaded_ticks.values() for lst in cm.values()
)
@@ -325,10 +331,70 @@ def run_scalping_backtest_web_aligned(
if pg_loaded is not None:
engine_params["_bt_program_by_code"] = pg_loaded
trades = se.run_scalping_backtest(
candles_by_code, engine_params, universe_by_slot=universe_by_slot,
ticks_by_code=loaded_ticks or None,
)
rust_session = engine_params.get("_rust_session_id")
if rust_session:
try:
import kis_rust_core
p = engine_params
def get_float(k, default=0.0):
try: return float(p.get(k, default))
except: return float(default)
def get_int(k, default=0):
try: return int(p.get(k, default))
except: return int(default)
def get_bool(k, default=False):
v = p.get(k, default)
if isinstance(v, bool): return v
s = str(v).lower()
if s in ("1", "true", "yes", "t", "y"): return True
return False
sp = kis_rust_core.ScalpParams(
get_int("rsi_period", 14),
get_float("rsi_oversold", 30.0),
get_float("rsi_overbought", 70.0),
abs(get_float("sl_pct", 0.02)),
get_float("tp_pct", 0.05),
get_float("drop_rate", 0.0),
get_float("cooldown_min", 0.0),
get_int("max_daily", 10),
get_float("high_chase_thr", 1.2),
get_float("max_daily_chg", 25.0),
get_float("min_price", 1000.0),
get_float("vol_mult", 0.0),
get_bool("use_defense_filters", False),
get_bool("skip_hts", False),
get_int("time_start_hm", 900),
get_int("time_end_hm", 1520),
)
r_trades = kis_rust_core.run_engine_trial_scalp(rust_session, sp)
trades = [
{
"code": rt.code,
"entry_time": rt.buy_time,
"exit_time": rt.sell_time,
"entry": rt.buy_price,
"exit": rt.sell_price,
"pnl": 0,
"pnl_pct": rt.pnl_pct,
"reason": rt.reason,
"peak_price": rt.sell_price, # 간소화
"rsi": rt.rsi_entry,
"qty": None,
"entry_source": "rust_engine",
"ob_source": "",
"hold_min": 0,
}
for rt in r_trades
]
except Exception as e:
print(f"[ERROR] Rust run_engine_trial_scalp failed: {e}")
trades = []
else:
trades = se.run_scalping_backtest(
candles_by_code, engine_params, universe_by_slot=universe_by_slot,
ticks_by_code=loaded_ticks or None,
)
if meta_out is not None and tick_meta:
from kis_trader.backtest.breakout_tick_loader import enrich_tick_meta_with_traded_codes
tick_meta = enrich_tick_meta_with_traded_codes(
@@ -347,6 +413,16 @@ def run_scalping_backtest_web_aligned(
if snap_meta:
meta_out["trigger_snapshot_backtest"] = snap_meta
try:
from kis_trader.backtest.bt_post_filters import apply_bt_post_filters
trades = apply_bt_post_filters(
trades,
engine_params,
strategy="SCALP"
)
except Exception as e:
print(f"[ERROR] bt_post_filters failed: {e}")
attach_scalp_trade_pnl(
trades, fee_rate=fee_rate, sell_tax=sell_tax,
slip_pct=backtest_slip_pct(engine_params),