๋ฐ์ดํฐ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ ํธ๋ ์ด๋ฉ์ ๊ณต๋ถํ๋ฉด์ ๋ง๋ Python ์๋๋งค๋งค ์คํ์ค์ ๋๋ค. ์งํยทํ๋๋ฉํธ ๊ธฐ๋ฐ ์ ํธ ์์ฑ๋ถํฐ ๋ฐฑํ ์คํธ, ๋ชจ์ํฌ์, ๋ฆฌ์คํฌ ๊ด๋ฆฌ, ์ด์ ๋์๋ณด๋, KIS API ์ฐ๋๊น์ง ํ ์ ์ฅ์์์ ์ฌํํ ์ ์๊ฒ ๊ตฌ์ฑํ์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ ํ์ตยท์ฐ๊ตฌ์ฉ์ ๋๋ค. ํฌ์ ์กฐ์ธ์ด ์๋๋ฉฐ, ์ค์ ์ฃผ๋ฌธ ๊ฒฝ๋ก๋ ์ฌ๋ฌ fail-closed gate๋ฅผ ํต๊ณผํด์ผ๋ง ์ด๋ฆฌ๋๋ก ์ค๊ณํ์ต๋๋ค.
์๋๋งค๋งค ํ๋ก์ ํธ๋ "์์ต๋ฅ ๊ทธ๋ํ"๋ณด๋ค ์ด์ ์์ ์ฑ์ด ๋จผ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
quant_trader๋ ์ ๋ต์ ๋ฐ๋ก ์ค๊ณ์ข๋ก ๋ณด๋ด์ง ์๊ณ , ์๋ ํ๋ฆ์ ๊ฐ์ ํฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง๊ณผ ์งํ ๊ณ์ฐ
- ๋น์ฉยท์ฌ๋ฆฌํผ์งยทlook-ahead guard๊ฐ ๋ค์ด๊ฐ ๋ฐฑํ ์คํธ
- paper evidence์ runtime health ์ถ์
- promotion gate ๊ฒ์ฆ
- live ์์ ์ KIS ์ฐ๊ฒฐ, ์๊ณ ๋๊ธฐํ, current blockers ์ฌํ์ธ
- ํ๊ตญ ์ฃผ์ ์ค์ฌ ๋ฐฑํ ์คํธ, ํฌํธํด๋ฆฌ์ค ๋ฐฑํ ์คํธ, ๋ฐ์ค์ผ ๋ฆฌ๋ฐธ๋ฐ์ฑ
- scoring, mean reversion, trend following, fundamental factor, relative strength rotation ์ ๋ต
- paper trading runtime state machine๊ณผ 60์์ ์ผ evidence ๊ธฐ๋ฐ promotion workflow
- KIS REST/WebSocket ์ฐ๋, ์ฃผ๋ฌธ ์ค๋ณต ๋ฐฉ์ง, ๋ฏธ์ฒด๊ฒฐ reconcile, emergency liquidation guard
- Discord ์๋ฆผ, SQLite ๋ฐฑ์ , web dashboard, operator health check
- pytest ๊ธฐ๋ฐ ํ๊ท ํ ์คํธ์ ๋ค์ํ research sweep ๋๊ตฌ
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
# ์ฌ์ฉ ๊ฐ๋ฅํ ์คํ ๋ชจ๋ ๋ณด๊ธฐ
python main.py --mode guide
# ๋จ์ผ ์ข
๋ชฉ ๋ฐฑํ
์คํธ
python main.py --mode backtest --strategy scoring --symbol 005930
# ์ด์ ํฌ์ค ์ ๊ฒ
python main.py --mode health
# ํ
์คํธ
pytest tests/ -q| ๋ฌธ์ | ๋ด์ฉ |
|---|---|
docs/PROFITABILITY_FINDINGS.md |
์์ต์ฑ ์ ์ง ์ ๊ฒ๊ณผ ํ์ฌ ๊ฒฐ๋ก |
docs/BASKET_PAPER_EVALUATION.md |
๋ฐ์ค์ผ paperโlive ์น๊ฒฉ ๊ธฐ์ค |
docs/BASKET_LIVE_RUNBOOK.md |
๋ฐ์ค์ผ live ์ ํ ์ ์ฐจ |
docs/PROJECT_GUIDE.md |
ํ์ผ ๊ตฌ์กฐ์ ์คํ ํ๋ฆ |
quant_trader_design.md |
์ํคํ ์ฒ์ ์ ๋ต ์ค๊ณ |
quant_trader is a Python research project for risk-first algorithmic trading on Korean equities. It includes backtesting, paper trading, strategy validation, KIS API integration, portfolio rebalancing, operational health checks, and live-trading gates that fail closed unless the evidence package is current and consistent.
ํ์ฌ ์ํ (2026-06-10):
- ๋ฐ์ค์ผ paper ์ด์ ๊ฐ์:
kr_diversified_hold(๋ถ์ฐ ๋ํ์ฃผ buy&hold, ์ฃผ์ 80%/ํ๊ธ 20%) enabled โ ์ผ์ผ ์๋ ์ฌ์ดํด(๋ฆฌ๋ฐธ๋ฐ์ฑ โ NAV ์ค๋ ์ท โ DB ๋ฐฑ์ โ ์น๊ฒฉ ์งํ๋ฅ ๋ณด๊ณ )๋ก 60์์ ์ผ ํธ๋๋ ์ฝ๋ ์ถ์ ์ค.--mode health๊ฐ ์ฌ์ดํด ๋๊น(์ค๋ ์ท 4์ผ+)์ ์๋ ๊ฒฝ๊ณ- paperโlive ์น๊ฒฉ ๊ธฐ์ค ์ ์(
docs/BASKET_PAPER_EVALUATION.md): 60์์ ์ผยท์ค๋ ์ท ์ปค๋ฒ๋ฆฌ์ง โฅ95%ยทdead-letter 0๊ฑดยท๋น์ฉ ๋๋๊ทธ โค1%/๋ . ๋ฒ ํ ์ ๋ต์ด๋ฏ๋ก "์์ฅ ์ด๊ณผ์์ต"์ ๊ธฐ์ค์ด ์๋.tools/basket_paper_evaluation.py๋ก ์๋ ํ์ (WAIT/PASS_CANDIDATE/FAIL_REVIEW)- ๋ฐ์ค์ผ ์ ์ฉ live gate ๋ถ๊ธฐ: ๊ธฐ์กด ๊ฒ์ดํธ๊ฐ ๋ฐ์ค์ผ์ ์ ํธ ์ ๋ต์ฉ canonical promotion(๋ฒค์น๋งํฌ ์ด๊ณผ์์ต ํฌํจ)์ ์๊ตฌํด ์๊ตฌ ํต๊ณผ ๋ถ๊ฐ์๋ ํจ์ ํด์ โ paper ํ๊ฐ PASS_CANDIDATE ๊ธฐ๋ฐ์ผ๋ก ์ค์ ๋ก ์ด๋ฆฌ๋ ๊ฒฝ๋ก ํ๋ฆฝ. ์ ํ ์ ์ฐจ๋
docs/BASKET_LIVE_RUNBOOK.md(๋ชจ์์๋ฒ ๋ฆฌํ์ค โ ์ค๊ณ์ข ์์ก โ ๋ชฉํ ์๋ณธ)- live ๋ฐ์ค์ผ ๋ฆฌ๋ฐธ๋ฐ์ฑ ์คํ ๊ฐ๋ฅํ: BUY๊ฐ "paper-only" ์ฐจ๋จ์ผ๋ก ํญ์ ์คํจํด SELL-only ํ๊ธํ๊ฐ ๋๋ ๋ฒ๊ทธ ์์ (์ผ๋ฐ ๋งค์์ ๋์ผํ ์งํ ์์ ์ฅ์น + live gate ๊ฒ์ฌ ์น๊ณ), ํ์ ์จ ์์ฐ SELL ์ฐ์ ยท๋ถ๋ถ ์คํ, KIS ์๊ณ ๋ฏธํ์ธ ์ ์ฌ์ด์ง fail-closed
- ์ฃผ๋ฌธ ์๋ต ์ ์ค ์ ์ฌ์๋ ๋ํผ๊ฐ ์ฌ์ ์กํ๋ ์์ฌ ๊ตฌ๋ฉ ํ์(
KISOrderResponseUnknownโ reconcile ๋๊ธฐ), ์์ ๊ฐ ํํ ํด๋จํ, ํ์คํฐ๋ฆฌ์์ค SELL ํด์ ๋ถํธ ์์ , ๋ด์ฅ ์งํ ํด๋ฐฑ pandas-ta ํจ๋ฆฌํฐ(RSI ~12pt ์ค์ฐจ ์ ์ )- ํธ๋๋ ์ฝ๋ ๋๊ตฌ๊ฐ ํ๊ธ ๋ฐฐ๋ถ(
target_stock_weightยทmin_cash_ratio)์ ๋ฌด์ํด ์์ตยทMDD๋ฅผ ๊ณผ๋ ๋ณด๊ณ ํ๋ ๋ฌธ์ ์ ์ โ ๋ฐฐํฌ ๋ฐ์ค์ผ ์ ์ง ์์น(2021-12~2026-06): CAGR +26.9%, Sharpe 1.09, MDD โ21.4%- ์ธ์ ์์ด ์คํ ์ ๋ฐฑํ ์คํธ ์๋์คํ ๋์ ์ฌ์ฉ ๊ฐ์ด๋ ์ถ๋ ฅ(
--mode guide), ์ด์ ๋ฌธ์ v6.1 ๊ฐฑ์์ด์ ์ํ (2026-06-01):
- ์ ๋์ ์ฝ๋ ๊ฐ์ฌ๋ก ์ค๊ฑฐ๋ ์์ ๋ฒ๊ทธ ์ ๋ฆฌ: KIS ์ฃผ๋ฌธ์ด ์๋ต ์ ์ค ์ ์ฌ์ ์ก๋ผ ์ด์ค ์ฒด๊ฒฐ๋๋ ๊ฒฝ๋ก๋ฅผ
idempotent=False๋ก ์ฐจ๋จ(์ต๋ 1ํ ์ ์ถ), ์ํท ๋ธ๋ ์ด์ปค ์ฌ์๋ ๋ฃจํ ๋ด ์ฌํ์ธ, 429 Retry-After HTTP-date ํฌ๋์ ๊ฐ๋- ๋ถ๋ถ ์ต์ ์ด ๋งค ๋ชจ๋ํฐ๋ง ์ฌ์ดํด๋ง๋ค ์ฌ๋ฐ๋๋๋ ๋ฒ๊ทธ ์์ (
Position.partial_tp_done์์ํ), ์ค์ผ์ค๋ฌ ์ง์ ์์ธ ์ ์์ /์ต์ ์คํต ๋ฐฉ์ง, ์ผ์ผ ์์ค ํ๋ ๊ธฐ์ค๊ฐ์ ๋น์ผ ์ค๋ ์ท ์ฌ์ฉ ์ฐจ๋จ- ๋ผ์ด๋ธ ๊ฒ์ดํธ fail-closed ๋ณด๊ฐ: NaN/Inf ์งํ๊ฐ ์๊ณ๊ฐ ๋น๊ต๋ฅผ ํต๊ณผํ๋ ๊ตฌ๋ฉ์ ๋ง์(
_as_float๋น์ ํ๊ฐ โ None) ์์๋ ์งํ๋ก ๋ผ์ด๋ธ ์น๊ฒฉ๋๋ ๊ฒ์ ์ฐจ๋จ- ์์ต์ฑ ๊ฒ์ฆ ์ ์งํ: canonical ์ ๋๋ฒ์ค ์์กด์ ํธํฅ ์ฐจ๋จ + Deflated/Probabilistic Sharpe + ์ง์ง OOS holdout(
--oos-holdout-split)๋ก ๋ค์ค๊ฒ์ ยท์ ํ ๊ณผ์ ํฉ ๋ ธ์ถ- ์งํ ์์ง ADX +DI/-DI ๋งคํ ์ค๋ฅ, ๋ฐฑํ ์คํธ gross_return ๋น์ฉ ํ์ ์ค๋ฅ, ๊ฑฐ๋๋๋น์จ inf ๊ฐ๋ ์์
์ด์ ์ํ (2026-05-14):
- GitHub ์๊ฒฉ ๋ธ๋์น ์ ๋ฆฌ ์๋ฃ: ์๋ฃ ๋ธ๋์น ์ญ์ , ํ์ฑ PR ๋ธ๋์น๋ง ์ ์ง
- 60์์ ์ผ Paper ์คํ freeze pack ๋ณํฉ:
reports/experiment_freeze_pack.md, ์ผ/์ฃผ๊ฐ ops checklist, stop condition ๋ฌธ์ ์ถ๊ฐ- Paper Evidence ๋ฐํ์: v2 ์ผ๋ณ ์๋ ์์ง โ benchmark finalization โ ๋ ์ง์ canonical evidence โ promotion package โ launch readiness
- Paper Runtime State Machine: normal/degraded/frozen/blocked_insufficient_evidence ์ํ ์๋ ์ ํ + allowed_actions ์ ์ด
- Paper ์ด์ CLI๋ pilot ์ ์ด/๋ฐํ์ ์ํ ์ก์ ์ต์ ์ ํ ๋ฒ์ ํ๋๋ง ๋ฐ๋๋ก ์ ๋ฆฌ๋์ด, ์์ถฉ ์ก์ ๋์ ์ง์ ์ ์ํ ๋ณ๊ฒฝ ์ ์ fail-closed๋ก ์ข ๋ฃ
- Paper Pilot Authorization: blocked ์ํ์์๋ ์ ํ์ real paper ๊ฐ๋ฅ (์๋ ์น์ธ + ๋ฆฌ์คํฌ ์บก + fail-closed/audited entry guard)
- Paper ์ ๊ท ์ง์ ์คํ ๊ฒฝ๊ณ fail-closed: preflight ์ํ ๋๋ฝ/์์ ๋๋ runtime ์กฐํ ์คํจ ์ BUY ์ ์ถ ์ ์ฐจ๋จ, SELL ์ฒญ์ฐ์ ์ ์ง
- Paper ๋ฐ์ค์ผ ๋ฆฌ๋ฐธ๋ฐ์ฑ BUY ์คํ์ ์ค์ ์กด์ฌํ๋ ํฌํธํด๋ฆฌ์ค ์๋ณธ/ํ๊ธ ์กฐํ API๋ฅผ ์ฌ์ฉํ๋๋ก ๊ณ ์ ๋์ด ์ฃผ๋ฌธ ์คํ ์ ๋จ๊ณ ์ค๋ฅ๋ฅผ ํ๊ท ํ ์คํธ๋ก ์ฐจ๋จ
--mode paper๋จ๋ฐ ์คํ์ ์ค์ ํ์ผ์trading.mode=live๊ฐ ๋จ์ ์์ด๋ ํด๋น ์คํ์ paper๋ก ๊ณ ์ ํด ์ค์ฃผ๋ฌธ ๊ฒฝ๋ก ์ง์ ์ ์ฐจ๋จ- ์ฅ์ค auto-entry ํ๋ณด๋ ์ฃผ๋ฌธ ์ง์ ํ์ฌ ๋ฐ์ดํฐ๋ก BUY ์๊ทธ๋์ ์ฌ๊ฒ์ฆํ๋ฉฐ, ๋ฐ์ดํฐ/API/์ ๋ต ๊ณ์ฐ ์ค๋ฅ๋ก ์ฌ๊ฒ์ฆ์ ์คํจํ๋ฉด ํด๋น ๋ฃจํ ์ฃผ๋ฌธ์ ๋ณด๋ฅํ๊ณ ํ๋ณด๋ฅผ ๋ค์ ๋ฃจํ๋ก ๋๊น
QUANT_AUTO_ENTRYํด์ ๋จ์ผํ: YAML hash์ resolved hash๋ฅผ ๋ถ๋ฆฌํด ์คํ ์ค์ drift ๊ฐ์ง- Research sweep: ๊ธฐ์กด top-20 all-family ํ๋ณด ์ฌ๊ฒ์ฆ๋
NO_ALPHA_CANDIDATE;pullback, benchmark-relative momentum, risk-budget, cash-switch, benchmark-aware rotation, target-weight top-N rotation/score-floor ํ๋ณด๊ตฐ๊ณผ exposure-matched benchmark ์ง๋จ์ research-only๋ก ์ถ๊ฐ- target-weight ๋ฆฌ์คํฌ ์ํ top-200 sweep: ์ต์์ tolerance ํ๋ณด๋ ์์ต/์ด๊ณผ์์ต์ ๊ฐ์ ๋์ง๋ง MDDยทํ์ ์จ ๊ฒ์ดํธ ๋ฏธํต๊ณผ๋ก ์ ํ๋ณด
paper_only- target-weight ์ ํ์ top-200 sweep: ๊ฒฉ์/๋ถ๊ธฐ ํ๋ณด๊ฐ ํ์ ์จ์ ๋ฎ์ท์ง๋ง benchmark excess Sharpe์ MDD ๊ฒ์ดํธ ๋ฏธํต๊ณผ๋ก
NO_ALPHA_CANDIDATE- target-weight ๋ณ๋์ฑ ํ๊น top-200 sweep: ์ต์์ ํ๋ณด๋ ์ด๊ณผ์์ต์ด ์์์์ง๋ง ์ ํ๋ณด๊ฐ MDD ๊ฒ์ดํธ ๋ฏธํต๊ณผ๋ก
KEEP_RESEARCH_ONLY- target-weight ๋ฆฌ์คํฌ ํ๋ํฐ ๋ญํน top-200 sweep: ์์ตยท์ด๊ณผ์์ต์ ๊ฐ์ ๋์ง๋ง MDDยทํ์ ์จ ๊ฒ์ดํธ ๋ฏธํต๊ณผ๋ก
KEEP_RESEARCH_ONLY- target-weight ์์ค๋ฐฉ์ด top-200 sweep: pdd8/floor25/cooldown1 ํ๋ณด๊ฐ MDD -19.56%, turnover/year 296.4%๋ก ๊ฐ์ ๋์ด research sweep ๊ธฐ์ค
RUN_CANONICAL_EVALUATION- target-weight ์์ค๋ฐฉ์ด canonical ํ๊ฐ: pdd8 ํ๋ณด๋ benchmark excess -6.46%p, exp75 ์๋ณธ/tol3 ํ๋ณด๋ turnover/year 1026.3%/1009.0%, exp75 tol4 ํ๋ณด๋ turnover/year 986.5%๋ก ํ์ ์จ์ ํต๊ณผํ์ง๋ง MDD -20.25%๋ผ ๋ชจ๋
paper_only; tol4 guard-only, rank-risk ๊ฐํ, sector cap 2, corrcap85, corrpen ํ๋ณด๋ canonical ์ ๊ท ์น๊ฒฉ ์์. ์์ค ํ ์ฌ์ง์ ์ ํ ํ๋ณด๋ top-200์์ MDD ์ ํ๋ก canonical ์ ์ธ. ๊ธฐ์กด risk-overlay ํ๋ณด๋ง provisional ์ ์ง- target-weight ๋ณ๋์ฑ ์์ฐ canonical ํ๊ฐ: top-200์์๋ ํ๋ณด 2๊ฐ๊ฐ ํต๊ณผํ์ง๋ง canonical top-20์์๋ MDD -20.82%/-20.89%๋ก
paper_only; ์ด๊ณผ์์ตยทํ์ ์จ์ ๊ฐ์ ๋์ผ๋ live/paper ์ ๊ท ์ ํ์ ๊ธ์ง- target-weight ํฌ์ง์ ์์ค ๊ฐ์ฐ canonical ํ๊ฐ:
tol5+sectorcap2+posloss8ํ๋ณด๊ฐ return +198.15%, MDD -17.18%, turnover/year 993.9%๋ก ์ ๊ทprovisional_paper_candidate; pilot plan์ rank penalty/sector cap/ํฌ์ง์ ์์ค ๊ฐ์ฐ๊ณผ paper evidence ๊ธฐ๋ฐ portfolio drawdown guard ์ํ๋ฅผ ์ฌํํ๋ฉฐ, ๋ช ์ ์ํ๊ฐ ์์ผ๋ฉด fail-closed ์ฐจ๋จ- scoring: paper_only (๊ด์ฐฐ ๊ฐ๋ฅํ์ง๋ง Sharpe/PF/WF ์์ ์ฑ ๋ฏธ๋ฌ)
- rotation: provisional_paper_candidate (risk-adjusted ๊ธฐ์ค ํต๊ณผ, live alpha๋ ๋ฏธํ์ธ)
- target-weight risk overlay ํ๋ณด: canonical bundle ๊ธฐ์ค provisional_paper_candidate + ์ ์ฉ paper/pilot adapter/shadow proof, ์ ๋์ฑ/๋น์ฉ pre-trade/pilot ์น์ธ/์คํ์ผ/์ฅ ์๊ฐ/๊ฐ๊ฒฉ ์ต์ ์ฑ guard ์ถ๊ฐ. ๋ฆฌ์์น ๋ฐฑํ ์คํธ๋ ์ง์ ๊ฑฐ๋์ผ ์ ์ โ ๋ค์ ๊ฑฐ๋์ผ ์๊ฐ ์ฒด๊ฒฐ โ ์ข ๊ฐ ํ๊ฐ ๊ธฐ์ค์ผ๋ก ๋ณด์ํํ์ผ๋ฉฐ, ๊ธฐ์กด target-weight research artifact๋ execution price mode ํ์ธ ๋๋ ์ฌ์์ฑ ํ ์ฌ์ฉ (live ๋ฏธ์ฐ๊ฒฐ)
- target-weight capped pilot readiness: audit ์์ ์ paper preflight๋ฅผ ๋จผ์ ๊ฐฑ์ ํ๊ณ , Discord webhook ๋๋ฝ ๋๋ notifier ๋น์ ์ ์ํ๋ ์ฃผ๋ฌธ ์
BLOCKED๋ก ํ์ - live ๋ณด๋ฅ ์ฃผ๋ฌธ ๋ณต๊ตฌ๋ KIS ๋ฏธ์ฒด๊ฒฐ ๋ชฉ๋ก์์ ์ฌ๋ผ์ง ์ฃผ๋ฌธ๋ ์ฒด๊ฒฐ ์์ธ๊ฐ ํ์ธ๋ ๋๋ง
RECONCILED๋ก ๋ซ๊ณ , ์กฐํ ์คํจ/๋ถ๋ช ํ ์ํ๋ ์ด๋ฆฐ ์ฃผ๋ฌธ๊ณผ ์ค๋ณต ์ฐจ๋จ์ ์ ์ง- live ์ฒด๊ฒฐ ์กฐํ๋ ์ฃผ๋ฌธ๋ฒํธ๊ฐ ํ์ฌ ์ฃผ๋ฌธ๊ณผ ์ผ์นํ๋ ์ฒด๊ฒฐ row๋ง ํ์ ์ฒด๊ฒฐ๋ก ์ธ์
- KIS Circuit Breaker๋ ์ฅ์ ํ HALF_OPEN ๋ณต๊ตฌ ์ํ์์ ๋จ์ผ probe๋ง ํ์ฉํ๊ณ ๊ฒฐ๊ณผ ํ์ธ ์ ์ถ๊ฐ ์์ฒญ์ ์ฐจ๋จ
- ์ ๊ท BUY ์ฃผ๋ฌธ ์ง์ ์ ๋์ฑ ์ฌ๊ฒ์ฆ์ ํ๊ท ๊ฑฐ๋๋ ๋๋ฝ/0๋ fail-closed๋ก ์ฐจ๋จํด ์ํ์ฃผยท๋ฐ์ดํฐ ๊ณต๋ฐฑ ์ฃผ๋ฌธ์ ๋ง์
- ์์ฅ ๊ตญ๋ฉด ํํฐ๊ฐ ์ผ์ ธ ์๋๋ฐ ์ง์ ๋ฐ์ดํฐ ์กฐํยทMA ๊ณ์ฐ์ด ๋ถ๋ช ํํ๋ฉด
unknown๊ตญ๋ฉด์ผ๋ก ์ ๊ท BUY๋ฅผ ์ฐจ๋จ- ๊ฐญ์ ์ถ๊ฒฉ๋งค์ ๋ฐฉ์ง ๊ฐ๋๋ ์ต๊ทผ ๊ฐ๊ฒฉ ์กฐํ ์คํจยท๋ฐ์ดํฐ ๋ถ์กฑ๋ ์ ๊ท BUY ์ฐจ๋จ์ผ๋ก ์ฒ๋ฆฌ
- ์๊ด๊ด๊ณ ๋ฆฌ์คํฌ ํ์ธ์ ๊ฐ๊ฒฉ ๋ฐ์ดํฐ ์กฐํ ์คํจยท๋ถ์กฑ ์ ์ ๊ท BUY๋ฅผ ์ฐจ๋จ
- ์ ์ข ๋น์ค cap์ ์นํฐ ๋งต ์กฐํ ์คํจยท๋งคํ ๋๋ฝ ์ ์ ๊ท BUY๋ฅผ ์ฐจ๋จ
- ์ฃผ๋ฌธ/exit ํ๋จ ๊ฐ๊ฒฉ์ด 0ยทNaNยท๋๋ฝ์ด๋ฉด BUY/SELL ์ ์ถ๊ณผ ์์ /์ต์ /๋ธ๋์ค์ ํ๋จ์ ๋ณด๋ฅํ๊ณ ์ฐจ๋จ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ก
- live ๋ฐ์ค์ผ ๋ฆฌ๋ฐธ๋ฐ์ฑ ์ฃผ๋ฌธ์ CLI์ ์ค์ผ์ค๋ฌ ์๋ ์ฒดํฌ ๋ชจ๋ ๋ฐ์ค์ผ๋ณ
basket_rebalance:<basket>canonical live gate/account/order tag ์ผ์น ์์ด๋ ์คํ ์ฐจ๋จ- manual paper evidence single-day/backfill/finalize๋
backfillprovenance๋ก ๊ธฐ๋ก๋์ด ์น๊ฒฉ ์ฆ๊ฑฐ์์ ์ ์ธ- shadow bootstrap collect/finalize๋
shadow_bootstrapprovenance๋ก ๊ธฐ๋ก๋์ด ์ฃผ๋ฌธ ๊ธฐ๋ฐ ์น๊ฒฉ ์ฆ๊ฑฐ์ ๋ถ๋ฆฌ- live candidate: ์์.
--force-live์ ๊ฑฐ, hard gate ์ฐํ ๋ถ๊ฐ
- ๋ฐฑํ ์คํธ / ํฌํธํด๋ฆฌ์ค ๋ฐฑํ ์คํธ / ๋ฉํฐ์ ๋ต sleeve ๋น๊ต
- ๋ชจ์ํฌ์ / ์ค์ ๋งค๋งค
- ์ ๋ต ๊ฒ์ฆ / ์ฑ๊ณผ ๋น๊ต / ํ๋ผ๋ฏธํฐ ์ต์ ํ
- ์ค์ฝ์ด๋ง / ํ๊ท ํ๊ท / ์ถ์ธ์ถ์ข / ํ๋๋ฉํธ / ์์๋ธ ์ ๋ต
- ๊ฑฐ๋๋ ๋ํ(C-4) / ์๋๊ฐ๋ ํ์ (C-5) / 2-sleeve ํฌํธํด๋ฆฌ์ค (BV50/R50 Paper ๊ฐ๋ ์ค)
- Paper Evidence ์๋ ์์ง / Runtime State Machine / Pilot Authorization / Launch Readiness
- ๋ฆฌ์คํฌ ๊ด๋ฆฌ, ์๋ฆผ, ๋ฐ์ค์ผ ๋ฆฌ๋ฐธ๋ฐ์ฑ, ์น ๋์๋ณด๋
- Python 3.11 ~ 3.12
pip install -r requirements.txt์คํ ์ ์ ์ค์ ํ์ผ๊ณผ ํ๊ฒฝ๋ณ์๋ฅผ ๋จผ์ ์ค๋นํด์ผ ํฉ๋๋ค.
config/settings.yaml.exampleโconfig/settings.yaml.env.example์ฐธ๊ณ ํ.env์์ฑ- target-weight capped paper pilot์ Discord webhook์ด ํ์์
๋๋ค.
.env์DISCORD_WEBHOOK_URL์ ์ฑ์ฐ๊ณconfig/settings.yaml์discord.enabled: true๋ฅผ ์ ์งํ์ธ์. config/holidays.yaml์ ํ์ ์ ๊ฐฑ์ ๊ฐ๋ฅ- ๋ฏธ๊ตญ ํด์ฅ์ผ์ด ํ์ํ๋ฉด
config/us_holidays.yaml์ถ๊ฐ
Paper schedule์ ๊ธฐ๋ณธ์ ์ผ๋ก signal-only์ ๋๋ค. DB ๋ชจ์ ์ฃผ๋ฌธ๊น์ง ์คํํ๋ full paper๋ ํ๊ฒฝ๋ณ์๋ก๋ง ์ผญ๋๋ค.
QUANT_AUTO_ENTRY=true python main.py --mode schedule --strategy scoringtrading.auto_entry์ YAML ๊ธฐ๋ณธ๊ฐ์ false๋ก ๋๊ณ , 60์์
์ผ ์คํ์์๋ QUANT_AUTO_ENTRY์ ๋ฐ๋ผ resolved hash๊ฐ ๋ฌ๋ผ์ง๋์ง ํ์ธํฉ๋๋ค. live ๋ชจ๋๋ ๋ณ๋ hard gate๋ฅผ ํต๊ณผํด์ผ ํ๋ฉฐ, ํ๊ฒฝ๋ณ์๋ง์ผ๋ก ์ค์ ์ฃผ๋ฌธ์ ์ด ์ ์์ต๋๋ค.
# ๋จ์ผ ์ข
๋ชฉ ๋ฐฑํ
์คํธ
python main.py --mode backtest --strategy scoring --symbol 005930
# ํฌํธํด๋ฆฌ์ค ๋ฐฑํ
์คํธ (gap/์ด๋/BlackSwan guard ํฌํจ)
python main.py --mode portfolio_backtest --strategy scoring --symbols 005930,000660 --start 2023-01-01 --end 2024-12-31
# ๊ฑฐ๋๋ ๋ํ ์ ๋ต (C-4) ํฌํธํด๋ฆฌ์ค ๋ฐฑํ
์คํธ
python main.py --mode portfolio_backtest --strategy breakout_volume --symbols 005930,000660,035720,051910 --start 2024-01-01 --end 2025-12-31
# ๋ฉํฐ์ ๋ต sleeve ๋น์ค ์ค์ (C-5)
python scripts/c5_weight_sweep.py
# paper trading ์๊ฐ ๋ฆฌํฌํธ (BV50/R50 guardrail ๋ชจ๋ํฐ๋ง)
python scripts/c5_paper_monthly_report.py
# paper trading ํน์ ๊ธฐ๊ฐ ๋ฆฌํฌํธ
python scripts/c5_paper_monthly_report.py 2026-04-01 2026-04-02
# ๋ชจ์ํฌ์
python main.py --mode paper --strategy scoring
# ๋ชจ์ ์ค์ผ์ค ๋ฃจํ
python main.py --mode schedule --strategy scoring
# full paper ์ค์ผ์ค ๋ฃจํ (DB ๋ชจ์ ์ฃผ๋ฌธ ์คํ)
QUANT_AUTO_ENTRY=true python main.py --mode schedule --strategy scoring
# Paper ์ด์ preflight / launch readiness
python tools/paper_preflight.py --strategy scoring --with-pilot-check
python tools/paper_launch_readiness.py --strategy scoring --generate-runbook
# Target-weight capped pilot preflight / readiness audit
python tools/paper_preflight.py --strategy target_weight_rotation_top5_60_120_floor0_exp75_rankrisk90_tol5_sectorcap2_posloss8_frac50_pdd10_floor40_cd1 --with-pilot-check
python tools/target_weight_rotation_pilot.py --candidate-id target_weight_rotation_top5_60_120_floor0_exp75_rankrisk90_tol5_sectorcap2_posloss8_frac50_pdd10_floor40_cd1 --readiness-audit --allow-rerun
# Paper evidence pipeline
python tools/run_paper_evidence_pipeline.py --strategy scoring --finalize --date YYYY-MM-DD
python tools/run_paper_evidence_pipeline.py --strategy scoring --generate-package
# ์ค์ ๋งค๋งค (ํ์ฌ ๋ชจ๋ ์ ๋ต์ด live ์ฐจ๋จ ์ํ โ live_candidate ์น๊ฒฉ ์ ๊น์ง ์คํ ๋ถ๊ฐ)
# python main.py --mode live --strategy scoring --confirm-live
# ์ ๋ต ๊ฒ์ฆ
python main.py --mode validate --strategy scoring --symbol 005930 --validation-years 5
# ์ฑ๊ณผ ๋น๊ต
python main.py --mode compare --start 2025-01-01 --end 2025-03-19 --strategy scoring
# ํ๋ผ๋ฏธํฐ ์ต์ ํ
python main.py --mode optimize --strategy scoring --include-weights --auto-correlation
# ๋ฐ์ค์ผ ๋ฆฌ๋ฐธ๋ฐ์ฑ
python main.py --mode rebalance
python main.py --mode rebalance --dry-run
# config๊ฐ live์ผ ๋ ์ค์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ์ฃผ๋ฌธ์ ENABLE_LIVE_TRADING=true + --confirm-live + live gate ํต๊ณผ ํ์
# ์น ๋์๋ณด๋
python main.py --mode dashboard
# ๊ธฐ๋ณธ ๋ฐ์ธ๋๋ http://127.0.0.1:8080 ์
๋๋ค.
# ์ธ๋ถ ๊ณต๊ฐ๊ฐ ํ์ํ ๋๋ง ์ธ์ฆ/reverse proxy ๊ตฌ์ฑ ํ --dashboard-host 0.0.0.0 ์ ๋ช
์ํ์ธ์.
# ์ด์ ํตํฉ ํฌ์ค ์ ๊ฒ (์ ์ ๋ต runtime + current_blockers ํ๋์)
python main.py --mode health
# ์ข
๋ฃ์ฝ๋ 0=OK / 1=ATTENTION / 2=BLOCKED โ ๋ชจ๋ํฐ๋ง ์คํฌ๋ฆฝํธ์์ ๋ถ๊ธฐ ๊ฐ๋ฅ.
# ์ฃผ์: verdict๋ '์ด์ ๊ฑด๊ฐ' ๊ธฐ์ค์ด๋ค. live ์น๊ฒฉ ๊ฒ์ดํธ์ NO-GO(live ํ๋ณด ์์ โ
# ์ฐ๊ตฌ ๊ฒฐ๋ก ์ ์ ์ ์ํ)๋ BLOCKED๋ก ํฉ์ฐํ์ง ์๊ณ ํค๋๋ผ์ธ ๋ผ๋ฒจ๋ก๋ง ๋ณด๊ณ ํ๋ค.
# ๊ฒ์ดํธ artifact์ ์ฅ์ ์ฑ ์ ํธ(๋ถ์ฌ/stale/ํ๊ธฐ ๋ถ์ผ์น)๋ ATTENTION(1)์ผ๋ก ๊ฐ๋ฑ๋๋ค.
# ๊ฐ์ ์ ๊ฒ์ tools/paper_runtime_status.py --health (--json) ์ผ๋ก๋ ์คํํ ์ ์์ต๋๋ค.
# ํด์ฅ์ผ ๊ฐฑ์
python main.py --update-holidaysFull paper ์ ๊ท BUY๋ reports/paper_runtime/preflight_status_{strategy}.json์ด ์กด์ฌํ๊ณ , runtime state ์กฐํ๊ฐ ์ฑ๊ณตํ๋ฉฐ, entry ํ์ฉ ๋๋ ํ์ฌ pilot authorization์ด ์ฌ๊ฒ์ฆ๋ ๋๋ง ์คํ๋ฉ๋๋ค. preflight ๋๋ฝ/์์, runtime ์กฐํ ์คํจ, critical fail์ ์ฃผ๋ฌธ ์์ฑ ์ ์ฐจ๋จ๋๋ฉฐ ๊ธฐ์กด ํฌ์ง์
SELL ์ฒญ์ฐ์ ์ฐจ๋จํ์ง ์์ต๋๋ค.
python main.py --mode paper๋ ์ค์ ํ์ผ์ trading.mode: live๊ฐ ๋จ์ ์์ด๋ ํด๋น ์คํ์ paper๋ก ๊ณ ์ ํฉ๋๋ค. ๋ชจ์ํฌ์ ๋ช
๋ น์ด ์ค์ ์์ฌ ๋๋ฌธ์ ์ค์ ์ฃผ๋ฌธ ์คํ๊ธฐ๋ก ์ด๊ธฐํ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํ ์์ ์ฅ์น์
๋๋ค.
์ฅ์ /์ฅ์ค auto-entry ํ๋ณด๋ ์ฃผ๋ฌธ ์ ์ถ ์ง์ ์ ์ต์ OHLCV์ ์ ๋ต ์ ํธ๋ก ๋ค์ ํ์ธํฉ๋๋ค. ์ฌ์กฐํ ๋๋ ์ ํธ ๊ณ์ฐ์ด ์คํจํ๋ฉด stale ํ๋ณด๋ก ๋งค์ํ์ง ์๊ณ ENTRY_REVALIDATION_BLOCK ์ด๋ฒคํธ๋ฅผ ๋จ๊ธด ๋ค ํ๋ณด๋ฅผ ๋ค์ ๋ฃจํ๊น์ง ๋ณด๋ฅํฉ๋๋ค.
Target-weight capped pilot์ --readiness-audit๋ ์ฃผ๋ฌธ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ ํ๊ธฐ ์ ์ paper_preflight๋ฅผ ๋จผ์ ๊ฐฑ์ ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ preflight_refresh artifact์ ๋จ๊น๋๋ค. notifier: Discord webhook ๋ฏธ์ค์ ๋๋ notifier health ๋น์ ์ ์ํ๊ฐ ๋์ค๋ฉด pilot authorization์ด๋ cap์ด ๋ง์๋ ์คํ ์ BLOCKED๋ก ์ ์ง๋๋ฏ๋ก, .env์ DISCORD_WEBHOOK_URL ์ค์ ํ preflight์ readiness audit์ ๋ค์ ๋๋ ค์ผ ํฉ๋๋ค.
์ค์ ๋งค๋งค๋ ENABLE_LIVE_TRADING=true + --confirm-live + ์ ๋ต ์ํ ๋ ์ง์คํธ๋ฆฌ์ live_candidate ํ์ฉ + ํ์ฌ commit/config์ ์ผ์นํ๋ canonical promotion bundle + reports/current_blockers.json์ go_live=true ๋ฐ live_candidates ํฌํจ + ๋ด๋ถ strategy๊ฐ ํ์ฌ ์ ๋ต๋ช
๊ณผ ์ ํํ ์ผ์นํ๋ ELIGIBLE paper evidence package๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค. ์ด์์๊ฐ ์ ๋ต ์ํ๋ฅผ live ๋ฏธํ์ฉ์ผ๋ก ๋ฎ์ถ๊ฑฐ๋ current blockers๊ฐ ์ต์ promotion blocker summary์ ๋ง์ง ์์ผ๋ฉด canonical live gate๊ฐ ํต๊ณผํด๋ ์ค์ ์์์ fail-closed๋ก ์ฐจ๋จ๋ฉ๋๋ค. promotion engine๊ณผ live gate๋ same-universe/cash-adjusted paper excess๊ฐ ๋ชจ๋ ์์์ธ์ง ํ์ธํ๋ฉฐ, live gate๋ promotion_result.json ํ๊ธฐ๋ฅผ ๊ทธ๋๋ก ๋ฏฟ์ง ์๊ณ ๊ฐ์ ์ฐ์ถ๋ฌผ๊ณผ evidence๋ฅผ ์น๊ฒฉ ์์ง์ผ๋ก ์ฌ๊ณ์ฐํด ํ์ฌ ๊ท์น์์๋ live_candidate์ธ์ง ๋ค์ ํ์ธํฉ๋๋ค. paper evidence package๋ package payload hash์ ์๋ณธ daily evidence JSONL์ source record hash๋ ์ฌ๊ฒ์ฆํ๋ฏ๋ก ํจํค์ง ์์ฝ๊ฐ์ด๋ ์๋ณธ record๊ฐ ๋ฐ๋ก ๋ฐ๋๋ฉด live gate๊ฐ ์ฐจ๋จํฉ๋๋ค. live ์ค์ผ์ค๋ฌ ์์ ์ KIS ์ฐ๊ฒฐ ๊ฒ์ฆ๊ณผ KISโDB ์๊ณ ๋๊ธฐํ๋ ๋ฐ๋์ ํต๊ณผํด์ผ ํ๋ฉฐ, ์คํจํ๋ฉด ๊ฒฝ๊ณ ๋ก ๋๊ธฐ์ง ์๊ณ ์์์ ์ฐจ๋จํฉ๋๋ค. ๋ํ OrderExecutor๋ฅผ ์ง์ ์์ฑํด live BUY๋ฅผ ํธ์ถํด๋ live_gate_validated=True๋ก ์์ฑ๋ ์คํ ๊ฒฝ๋ก๊ฐ ์๋๋ฉด KIS ์ฃผ๋ฌธ ์ ์ถ ์ ์ ์ฐจ๋จ๋ฉ๋๋ค. live ์ฃผ๋ฌธ ์ ๋ฏธ์ฒด๊ฒฐ ์กฐํ ์คํจ๋ ๋ฏธ์ฒด๊ฒฐ ์์์ผ๋ก ํด์ํ์ง ์๊ณ ์ค๋ณต ์ฃผ๋ฌธ ๋ฐฉ์ง๋ฅผ ์ํด ์ฐจ๋จํ๋ฉฐ, live ๊ธด๊ธ ์ฒญ์ฐ๋ KIS ํ์ฌ๊ฐ๊ฐ ๊ฒ์ฆ๋์ง ์์ผ๋ฉด ํ๊ท ๋จ๊ฐ ์ง์ ๊ฐ fallback ๋งค๋๋ฅผ ์คํํ์ง ์์ต๋๋ค.
์๋ single-day/backfill/finalize evidence CLI๋ ์ด์ ๋ณด์ ยทํ์ง ์ ๊ฒ ์ฉ๋์ด๋ฉฐ backfill provenance๋ก ๊ธฐ๋ก๋ฉ๋๋ค. ์ค์ scheduler/pilot ์ธ์
์์ ์์ง๋ real_paper/pilot_paper record๋ง ์น๊ฒฉ ์ฆ๊ฑฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
Shadow bootstrap collect/finalize CLI๋ ์ฃผ๋ฌธ ์ ์ถ ์์ด shadow_bootstrap provenance๋ก ๊ธฐ๋ก๋๋ฉฐ, ๋น ์ด์ ์ผ์ finalizeํ๋ฉด์ ์ record๊ฐ ์์ฑ๋์ด๋ ์น๊ฒฉ ์ฆ๊ฑฐ๋ก ๊ณ์ฐํ์ง ์์ต๋๋ค.
ํ์ฌ ๋ชจ๋ ์ ๋ต์ provisional_paper_candidate ๋๋ disabled ์ํ์ด๋ฉฐ, live ๋ชจ๋๋ ์ฐจ๋จ๋์ด ์์ต๋๋ค.
reports/approved_strategies.json์ ์ค๋๋ validation_walkforward_*.json ํ์ผ์ ๋ ์ด์ live ๊ทผ๊ฑฐ๊ฐ ์๋๋๋ค. --force-live ํ๋๊ทธ๋ ์ ๊ฑฐ๋์์ผ๋ฉฐ, ์ด๋ค ์กฐํฉ์ผ๋ก๋ hard gate๋ฅผ ์ฐํํ ์ ์์ต๋๋ค. legacy approved_strategies.json๊ฐ ๊นจ์ ธ ์๊ฑฐ๋ ์คํค๋ง๊ฐ ๋ง์ง ์์ผ๋ฉด paper runtime๋ fail-closed๋ก ์ ๊ท entry/shadow ์์ง์ ๋ซ๊ณ exit/finalize ๊ฐ์ ์์ ์์
๋ง ํ์ฉํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์์ ์ฅ์น๋ ๋ฃ์ด๋์์ต๋๋ค.
- look-ahead ์ํ ๋ฐฑํ ์คํธ
- ํฌ์ง์ ์ / ์๊ธ ๋น์ค ์ ํ
- ๋ฏธ์ฒด๊ฒฐ / ์ค๋ณต ์ฃผ๋ฌธ ๋ฐฉ์ง (live ๋ฏธ์ฒด๊ฒฐ ์กฐํ ์คํจ ์ ์ฃผ๋ฌธ ๋ณด๋ฅ, ํธํ bool API๋ ๋ฏธ์ฒด๊ฒฐ ์์์ผ๋ก fail-closed)
- ์ ๊ท BUY ์ฃผ๋ฌธ ์ง์ ํ๊ท ๊ฑฐ๋๋ ๋๋ฝ ๋๋ ๊ฑฐ๋๋๊ธ ํํ ๋ฏธ๋ฌ ์ ์ฐจ๋จ
- ๊ฐญ ๋ฆฌ์คํฌ ํ์ธ์ฉ ์ต๊ทผ ๊ฐ๊ฒฉ ์กฐํ ์คํจ ๋๋ ๋ฐ์ดํฐ ๋ถ์กฑ ์ ์ ๊ท BUY ์ฐจ๋จ
- ์๊ด๊ด๊ณ ๋ฆฌ์คํฌ ํ์ธ์ฉ ๊ฐ๊ฒฉ ๋ฐ์ดํฐ ์กฐํ ์คํจ ๋๋ ๋ณด์ ์ข ๋ชฉ ๋ฐ์ดํฐ ๋ถ์กฑ ์ ์ ๊ท BUY ์ฐจ๋จ
- ์ ์ข ๋น์ค cap ํ์ธ์ฉ ์นํฐ ๋งต ์กฐํ ์คํจ ๋๋ ๋์/๋ณด์ ์ข ๋ชฉ ๋งคํ ๋๋ฝ ์ ์ ๊ท BUY ์ฐจ๋จ
- ์ฃผ๋ฌธ/์์ /์ต์ /๋ธ๋์ค์ ํ๋จ์ฉ ํ์ฌ๊ฐ๊ฐ ์๊ฑฐ๋ 0/NaN์ด๋ฉด ์ฃผ๋ฌธยท์ฒญ์ฐ ํ๋จ ๋ณด๋ฅ ๋ฐ
PRICE_DATA_BLOCK๊ธฐ๋ก - live ์ฃผ๋ฌธ ์ฒด๊ฒฐ ํ์ธ ์ DB ๊ฑฐ๋ยทํฌ์ง์ ๋ฐ์ ๋ณด๋ฅ
- live ์ฒด๊ฒฐ ์กฐํ ๊ฒฐ๊ณผ์ ์ฃผ๋ฌธ๋ฒํธ๊ฐ ํ์ฌ ์ฃผ๋ฌธ๊ณผ ๋ค๋ฅด๋ฉด DB ๊ฑฐ๋ยทํฌ์ง์ ๋ฐ์ ๋ณด๋ฅ
- live ์ฌ์์ ์ ๋ธ๋ก์ปค ๋ฏธ์ฒด๊ฒฐ ๋ชฉ๋ก์์ ์ฌ๋ผ์ง ๋ณด๋ฅ ์ฃผ๋ฌธ๋ ์ฒด๊ฒฐ ์์ธ ํ์ธ ์ ์๋ ์ด๋ฆฐ ์ฃผ๋ฌธ์ผ๋ก ์ ์ง
- live ์์ ์ KIS ์ฐ๊ฒฐ / ์๊ณ ๋๊ธฐํ ์คํจ ์ ์ค์ผ์ค๋ฌ ์์ ์ฐจ๋จ
- paper evidence package payload hash / source record hash ๋ถ์ผ์น ์ live gate ์ฐจ๋จ,
--check-only๋ invalid package๋ฅผ ๊ตฌ์กฐํ๋ WARN์ผ๋ก ๋ ธ์ถํ๊ณ--paper-evidence-quarantine-invalid๋ก ์ด์ ์ ๋ ฅ ๊ฒฝ๋ก ๋ฐ์ ๊ฒฉ๋ฆฌ ๊ฐ๋ฅ - live ์ ๊ท BUY๋ gate ํต๊ณผ ์ํ๊ฐ ์ ๋ฌ๋
OrderExecutor์์๋ง KIS ์ฃผ๋ฌธ ์ ์ถ ํ์ฉ - live ๋ฐ์ค์ผ ๋ฆฌ๋ฐธ๋ฐ์ฑ ์ฃผ๋ฌธ์ CLI ์ด์์ ํ์ธ ๋๋ live ์ค์ผ์ค๋ฌ ๊ฒ์ฆ ์ํ์์ ๋ฐ์ค์ผ๋ณ canonical live gate, account_key/order strategy tag ์ผ์น, KISโDB ํฌ์ง์ ๋๊ธฐํ ํต๊ณผ ํ์๋ง ์คํ
- auto-entry ํ๋ณด ์๊ทธ๋ ์ฌ๊ฒ์ฆ ์คํจ ์ ์ ๊ท BUY ๋ณด๋ฅ
- live ๊ธด๊ธ ์ฒญ์ฐ ์ KIS-only ๋ณด์ ํฌ์ง์ ์ DB์ ๋จผ์ ๋ฐ์
- live ๊ธด๊ธ ์ฒญ์ฐ ํ์ฌ๊ฐ ์กฐํ ์คํจ ์ ํ๊ท ๋จ๊ฐ ์ง์ ๊ฐ fallback ๋งค๋ ์ฐจ๋จ
- HTTP ๊ธด๊ธ ์ฒญ์ฐ ํธ๋ฆฌ๊ฑฐ live ์คํ์ ๋ณ๋ ํ์ธ ํ๊ฒฝ๋ณ์ ์์ด๋ ์ฐจ๋จ
- HTTP ๊ธด๊ธ ์ฒญ์ฐ์ ๊ฐ๋ณ ๋งค๋ ์คํจ๊ฐ ์์ผ๋ฉด ์คํจ ์๋ต์ผ๋ก ๋ ธ์ถ
- HTTP ๊ธด๊ธ ์ฒญ์ฐ ์คํ์ POST ์ ์ฉ์ด๋ฉฐ query token ์ธ์ฆ์ ๊ธฐ๋ณธ ๋นํ์ฑ
- HTTP ๊ธด๊ธ ์ฒญ์ฐ ์๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 127.0.0.1์๋ง ๋ฐ์ธ๋
- HTTP ๊ธด๊ธ ์ฒญ์ฐ ํ ํฐ์ ๊ธฐ๋ณธ ์ต์ 16์์ placeholder ์ฐจ๋จ ๊ฒ์ฆ ์ ์ฉ
- ๊ธด๊ธ ์ฒญ์ฐ ๊ฒฐ๊ณผ๋ ์ฑ๊ณต/์คํจ summary๋ฅผ ํตํฉ ์๋ฆผ์ผ๋ก ์ ํ
- paper/live ํ๊ธ ์ ์ฐ์ ์ค์ ์ฒด๊ฒฐ๊ฐ ๊ธฐ์ค์ด๋ฉฐ ์ฌ๋ฆฌํผ์ง๋ฅผ ํ๊ธ ํ๋ฆ์์ ์ค๋ณต ์ฐจ๊ฐํ์ง ์์
- ์ฑ๊ณผ ์ดํ ์ ์ง์ ์ ํ
- ์์ฅ ๊ตญ๋ฉด / ๋ธ๋์ค์ ๋์
- ๋จ์ผ์ข ๋ชฉ/ํฌํธํด๋ฆฌ์ค ๋ฐฑํ ์คํธ gap/์ด๋/BlackSwan ์ด๋ฒคํธ guard
- ๋ฐฑํ ์คํธ / research sweep universe 20์ผ ํ๊ท ๊ฑฐ๋๋๊ธ ์ฌ์ ํํฐ
- DB ๋ฐฑ์ / ์๊ณ ํฌ๋ก์ค์ฒดํฌ / ๊ธด๊ธ ์ฒญ์ฐ
- ์๋ฆผ ์ฑ๋ fallback
์ธ๋ถ ์ค์ ์ config/risk_params.yaml, config/strategies.yaml, config/settings.yaml์์ ๊ด๋ฆฌํฉ๋๋ค.
pytest tests/ -q์ธ๋ถ API๋ ์น์์ผ์ด ํ์ํ ๋ถ๋ถ์ ๋ชจํนํด์ ํ ์คํธํฉ๋๋ค.
config/โ ์ค์ core/โ ๋ฐ์ดํฐ, ์งํ, ์ ํธ, ๋ฆฌ์คํฌ, ์ฃผ๋ฌธ, ์ค์ผ์ค๋ฌ, ์๋ฆผ, paper evidence/runtime/pilot/preflightstrategies/โ ์ ๋ต (scoring, breakout_volume, relative_strength_rotation ๋ฑ)scripts/โ ๊ฒ์ฆ ์คํฌ๋ฆฝํธ (C-4 OOS, C-5 sleeve ๋น๊ต/๋น์ค ์ค์/ํํฐ ํ ์คํธ/rolling WF/paper ๋ฆฌํฌํธ)tools/โ Paper ์ด์ ๋๊ตฌ์ research sweep (evidence pipeline, pilot control, bootstrap, preflight, launch readiness, candidate sweep, target-weight pilot)api/โ KIS RESTยท์น์์ผbacktest/โ ๋ฐฑํ ์คํธ, ๊ฒ์ฆ, ์ต์ ํ, ๋น๊ตdatabase/โ ๋ชจ๋ธยท๋ฐฑ์monitoring/โ ๋ก๊น , ์๋ฆผ, ๋์๋ณด๋, ์ฒญ์ฐ ํธ๋ฆฌ๊ฑฐtests/โ ํ ์คํธdocs/โ ๋ฌธ์deploy/โ (์ ํ) Oracle Cloud ARM ์๋ฒ ์์ ๊ตฌ๋(systemd, logrotate)
| ๋ฌธ์ | ๋ด์ฉ |
|---|---|
docs/PROFITABILITY_FINDINGS.md |
์์ต์ฑ ์ ์ง ์ ๊ฒ (๋จผ์ ์ฝ์ ๊ฒ) โ ๋ฅ๋ alpha๋ ์์, ๋ถ์ฐ ๋ํ์ฃผ buy&hold๊ฐ ํ์ค์ ๊ณ ์์ต ๊ฒฝ๋ก |
docs/PAPER_TO_LIVE_RUNBOOK.md |
PaperโLive ๊ฒ์ฆ๋ ์ด์ ๊ฒฝ๋ก + ์ ์งํ caveat |
docs/PROJECT_GUIDE.md |
ํ์ผ ์ญํ , ๋ชจ๋๋ณ ํ๋ฆ, ์ค์ ์์ฝ, ์ค์ ์ ์ฒดํฌ๋ฆฌ์คํธ |
quant_trader_design.md |
์ํคํ ์ฒ, ์งํยท์ ๋ตยท๋ฆฌ์คํฌ ์ค๊ณ, ๊ฒ์ฆ ๊ด์ , ๋ก๋๋งต |
BACKTEST_IMPROVEMENT.md |
๋ฐฑํ ์คํธ ์ ๋ขฐ์ฑ ๊ฐ์ ๋ด์ญ, ์๋ ค์ง ํ๊ณ, ์ถ๊ฐ ๊ณผ์ |
deploy/README.md |
Oracle Cloud Free Tier ARM ๋ฐฐํฌยทsystemd ์์ ๊ตฌ๋ ๊ฐ์ด๋ |
reports/strategy_promotion_policy.md |
์ ๋ต ์น๊ฒฉ ์ ๋ ๊ธฐ์คํ |
reports/live_gate_policy.md |
Live ์ง์ canonical/evidence hard gate |
reports/paper_runbook.md |
Paper Trading ์ด์ ๊ฐ์ด๋ |
reports/experiment_freeze_pack.md |
60์์ ์ผ Paper ์คํ ๋๊ฒฐ ๊ธฐ์ค, hash, ์คํ ๋ชจ๋ |
reports/daily_ops_checklist.md |
์ผ์ผ Paper ์ด์ ์ฒดํฌ๋ฆฌ์คํธ |
reports/weekly_ops_checklist.md |
์ฃผ๊ฐ Paper ์ด์ ์ฒดํฌ๋ฆฌ์คํธ |
reports/experiment_stop_conditions.md |
์คํ ์ค๋จยท๋๊ฒฐยท์ฌ๊ฐ ์กฐ๊ฑด |
์น๊ฒฉ ๊ท์น v3 โ core/promotion_engine.py์์ metrics ๊ธฐ๋ฐ ์๋ ํ์ . tools/evaluate_and_promote.py --canonical๋ก ์ฌํํ๋ฉฐ, canonical ํ๊ฐ ์ฐ์ถ๋ฌผ์๋ ์ข
๋ชฉ๊ตฐ ๊ตฌ์ฑ, ๋ฐ์ดํฐ ๋ฒ์, ์์ง ์ค๋ฅ๋ฅผ ๋ฐํ์ผ๋ก ๋ง๋ data_snapshot_hash๋ฅผ ๋จ๊ธด๋ค. live gate์ ์น๊ฒฉ ์ฐ์ถ๋ฌผ ๋ก๋๋ ์ด ํด์, ๋ฐ์ดํฐ ๋ฒ์, ์์ง ์ค๋ฅ, ํ๊ฐ ์คํจ ์ํ๋ฅผ ๋ค์ ๊ฒ์ฆํ๊ณ , live ์ง์
์ง์ ์ promotion engine ํ์ ์ ์ฌ๊ณ์ฐํด ์์๋๊ฑฐ๋ ํ์ฌ ๊ท์น๊ณผ ์ด๊ธ๋ ์ฐ์ถ๋ฌผ ์ฌ์ฉ์ ์ฐจ๋จํ๋ค.
Research candidate sweep โ tools/research_candidate_sweep.py --quick --candidate-family all๋ก promotion๊ณผ ๋ถ๋ฆฌ๋ rotation/momentum/breakout/pullback/benchmark-relative/risk-budget/cash-switch/benchmark-aware rotation/target-weight top-N rotation ํ๋ณด ๋ญํน artifact๋ฅผ ์์ฑ. Raw EW B&H gate๋ ์ ์งํ๋, defensive/cash-heavy ํ๋ณด ํด์์ ์ํด ํ๊ท ๋
ธ์ถ๋ฅ ๊ณผ exposure-matched B&H excess๋ ์ง๋จ๊ฐ์ผ๋ก ๊ธฐ๋กํฉ๋๋ค. ๋ฒค์น๋งํฌ universe ์ผ๋ถ ์ข
๋ชฉ์ด๋ผ๋ OHLCV ์์งยท๊ธฐ๊ฐ ๊ฒ์ฆ์ ์คํจํ๋ฉด INSUFFICIENT_BENCHMARK_DATA๋ก fail-closed ์ฐจ๋จํ๊ณ , ๊ฒฐ์ธก ์ข
๋ชฉ๊ณผ ์ปค๋ฒ๋ฆฌ์ง ๋น์จ์ artifact/Markdown์ ๋จ๊น๋๋ค. --top-n 200์ฒ๋ผ ๋์ ์ ๋๋ฒ์ค ๊ฒ์ฆ์ ์์ฒญํ๋ฉด ๊ธฐ๋ณธ ํ๋ณด ์ค์บ ๋ฒ์๋ฅผ max(100, top_n*2)๋ก ๋ํ๋ฉฐ, ํ์ ์ --universe-scan-limit์ผ๋ก ๋ช
์ ์กฐ์ ํ ์ ์์ต๋๋ค. ๊ธฐ์กด best ํ๋ณด๋ง ๋น ๋ฅด๊ฒ ์ฌ๊ฒ์ฆํ ๋๋ --candidate-id๋ฅผ ๋ฐ๋ณต ๋๋ ์ผํ ๊ตฌ๋ถ์ผ๋ก ๋๊ฒจ ์ ํํ ํ๋ณด๋ง ํ๊ฐํฉ๋๋ค. top-200 follow-up์ฒ๋ผ MDD/ํ์ ์จ ์ํ ํ๋ณด๋ง ๋น๊ตํ ๋๋ --candidate-family target_weight_risk_relief๋ก risk-off/tolerance/exposure ์ถ์ ํ๋ณด๊ตฐ์ ๋ฐ๋ก ์คํํ๊ณ , ๋ฆฌ๋ฐธ๋ฐ์ฑ ๋น๋ ์ํ ํ๋ณด๋ง ๋ณผ ๋๋ --candidate-family target_weight_turnover_relief๋ก ๊ฒฉ์/๋ถ๊ธฐ ํ๋ณด๊ตฐ์ ์คํํฉ๋๋ค. ์์ค ๊ตฌ๊ฐ ๋
ธ์ถ์ ๋ ์ง์ ๋ฎ์ถ๋ ํ๋ณด๋ --candidate-family target_weight_volatility_target๋ก benchmark ์คํ ๋ณ๋์ฑ ํ๊น๊ณผ ๋ํญ floor๋ฅผ ์ ์ฉํด ๊ฒ์ฆํฉ๋๋ค. ์ข
๋ชฉ ์ ํ ์์ฒด๋ฅผ ๋ณด์ํํ๋ ํ์ ๋น๊ต๋ --candidate-family target_weight_downside_rank_relief๋ก ๋ํญยทํ๋ฐฉ๋ณ๋์ฑ ํ๋ํฐ๋ฅผ ๋ญํน ์ ์์ ๋ฐ์ํด ๊ฒ์ฆํฉ๋๋ค. ๋ญํน ํ๋ํฐ ๊ธฐ๋ฐ ํ๋ณด์ ๊ต์ฒด ๋น๋๋ฅผ ์ค์ด๋ ํ์ ๋น๊ต๋ --candidate-family target_weight_churn_relief๋ก ๊ฒฉ์ ๋ฆฌ๋ฐธ๋ฐ์ฑ๊ณผ ๋ฆฌ๋ฐธ๋ฐ์ฑ๋น ์ ๊ท ํธ์
์ ์ํ(max_new_targets_per_rebalance)์ ๊ฒฐํฉํด ๊ฒ์ฆํฉ๋๋ค. ํฌํธํด๋ฆฌ์ค ์์ค ๊ตฌ๊ฐ ์์ฒด๋ฅผ ์ค์ด๋ ํ์ ๋น๊ต๋ --candidate-family target_weight_drawdown_guard๋ก ์ง์ ํ๊ฐ NAV ๊ธฐ๋ฐ drawdown guard์ ์ฌ์ง์
cooldown์ ๊ฒฐํฉํด ๊ฒ์ฆํฉ๋๋ค. ์ ์ ์ข
๋ชฉ์ ๋ชฉํ ๊ธ์ก ์์ฒด๋ฅผ ๋ณ๋์ฑ ์์ฐํ์ผ๋ก ์กฐ์ ํ๋ ํ์ ๋น๊ต๋ --candidate-family target_weight_volatility_budget๋ก ์ญ๋ณ๋์ฑ sleeve weighting์ ์ ์ฉํฉ๋๋ค. target-weight ํ๋ณด ํ๊ฐ๋ ๊ฐ์ sweep ์์์ OHLCV fetch cache๋ฅผ ๊ณต์ ํด ๋์ผ ์ข
๋ชฉยท๊ธฐ๊ฐ ๋ฐ๋ณต ์์ง์ ์ค์ด๊ณ , cache hit/unique fetch ์ง๋จ๊ฐ์ artifact์ Markdown์ ๋จ๊น๋๋ค. sweep artifact์ Markdown์๋ ์ ํ ๋ฐฉ์, ์์ฒญ top-N, ์ค์บ ํ๋, ํ๋ณด ํํฐ, ์ ๋์ฑ ํํฐ ์ ํ ์ข
๋ชฉ ์, ํ๋ณด๋ณ ํ๋ฝ ์ฌ์ ์ ๋ฐ๋ณต ๋ณ๋ชฉ ์์ฝ์ ๋จ๊ฒจ ์ค์ ๊ฒ์ฆ ๋ฒ์์ ๊ฒ์ดํธ ๋ณ๋ชฉ์ ํ์ธํฉ๋๋ค. target-weight ํ๋ณด๋ min_score_floor_pct๋ก ์ฝํ ์ด๊ณผ ๋ชจ๋ฉํ
์ฌ๋กฏ์ ํ๊ธ์ผ๋ก ๋จ๊ธฐ๊ณ , hold_rank_buffer์ max_new_targets_per_rebalance๋ก ๋ญํน ํ๋ค๋ฆผ์ ๋ฐ๋ฅธ ๋ถํ์ํ ๊ต์ฒด์ ์ ๊ท ํธ์
์๋ฅผ ์ค์ด๋ฉฐ, target_allocation_mode=inverse_volatility๋ก ์ ํ ์ข
๋ชฉ๋ณ ๋ชฉํ ๊ธ์ก์ rolling ๋ณ๋์ฑ์ ์ญ์ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ , portfolio_drawdown_guard_trigger_pct/portfolio_drawdown_guard_exposure/portfolio_drawdown_guard_cooldown_rebalances๋ก ํฌํธํด๋ฆฌ์ค ๋ํญ ํ ๋ชฉํ ๋
ธ์ถ๊ณผ ์ฌ์ง์
์๋๋ฅผ ์ ํํ๊ณ , market_exposure_mode=benchmark_risk๋ก KS11 SMA/๋ํญ/๋ณ๋์ฑ risk-off ๊ตฌ๊ฐ์ ๋ถ๋ถ ๋
ธ์ถ ์ถ์๋ฅผ ๊ฒ์ฆํฉ๋๋ค. canonical risk-overlay ํ๋ณด์๋ target_tolerance_pct=3/5 turnover-aware ๋ณํ๋ ํฌํจํด ์์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ์๋ต์ด ๋น์ฉ๊ณผ ์ฑ๊ณผ์ ์ฃผ๋ ์ํฅ์ ๋น๊ตํฉ๋๋ค. target-weight ๋ฆฌ์์น ๋ฐฑํ
์คํธ๋ ์ง์ ๊ฑฐ๋์ผ ์ ์๋ก ๋ค์ ๊ฑฐ๋์ผ ์๊ฐ์ ๋ฆฌ๋ฐธ๋ฐ์ฑํ๊ณ ์ผ๋ง ํ๊ฐ๋ ์ข
๊ฐ๋ก ํ๋ฉฐ, ์ ์ผ ๊ธฐ์ค 20์ผ ํ๊ท ๊ฑฐ๋๋์ ๋น์ฉ ๊ณ์ฐ์ ๋๊ฒจ ๋์ ์ฌ๋ฆฌํผ์ง์ participation ์ง๋จ๊ฐ์ ๋จ๊น๋๋ค.
Paper Evidence ์ฒด๊ณ โ core/paper_evidence.py v2 ์ผ๋ณ 22๊ฐ ์งํ ์๋ ์์ง, core/paper_runtime.py entry gate, core/paper_pilot.py launch readiness/pilot auth ํ์ . scheduler๋ v2 collector๋ง canonical ์ฆ๊ฑฐ๋ก ๊ธฐ๋กํ๋ฉฐ, legacy core/evidence_collector.py๋ import ํธํ์ฉ deprecated no-op์
๋๋ค. ์น๊ฒฉ ํจํค์ง๋ execution_backed=True์ real_paper/pilot_paper ์ถ์ฒ๊ฐ ๋ช
์๋ ๊ธฐ๋ก๋ง ์น๊ฒฉ ์ฆ๊ฑฐ๋ก ์ธ์ ํ๊ณ , ํจํค์ง ๋ด๋ถ strategy๊ฐ ํ์ฌ ์ ๋ต๋ช
๊ณผ ์ ํํ ์ผ์นํ์ง ์์ผ๋ฉด ์น๊ฒฉ/๋ผ์ด๋ธ ์ฆ๊ฑฐ๋ก ์ฐ์ง ์์ ์์ ํ์ยท์์์
๊ธฐ๋ก ์ค์ผ์ ์ฐจ๋จํ๋ค.
2026-04-29 all-family quick sweep: 5์ข
๋ชฉ(005930,000660,035720,051910,068270)์์ rotation/momentum/breakout ํ๋ณด 14๊ฐ๋ฅผ ๋น๊ตํ์ง๋ง ๋ชจ๋ benchmark excess return/Sharpe๋ฅผ ํต๊ณผํ์ง ๋ชปํด NO_ALPHA_CANDIDATE๋ก ํ์ . ์ด ๊ฒฐ๊ณผ๋ง์ผ๋ก canonical promotion์ด๋ paper/live ์น๊ฒฉ์ ์งํํ์ง ์์ต๋๋ค.
2026-04-30 top-20 all-family quick sweep: canonical liquidity universe 20์ข
๋ชฉ์์ ๋์ผ ํ๋ณด 14๊ฐ๋ฅผ ์ฌ๊ฒ์ฆํ์ง๋ง NO_ALPHA_CANDIDATE ์ ์ง. best=momentum_factor_120d๋ return +118.56%, Sharpe 0.79์์ผ๋ benchmark excess=-30.83%p, MDD=-40.08%๋ก ์น๊ฒฉ ๋ถ๊ฐ. ๋ค์ ์ฐ๊ตฌ๋ ๋จ์ ํ๋ณด ํ์ฅ์ด ์๋๋ผ benchmark๋ฅผ ์ด๊ธฐ๋ ์๋ก์ด alpha ํ๋ณด๊ตฐ ์ค๊ณ๋ก ์ ํํฉ๋๋ค.
2026-04-30 follow-up: ๊ธฐ์กด ์ ๋ต ์ค ์ธ๋ถ ์ฌ๋ฌด ๋ฐ์ดํฐ ์์กด์ด ์๋ trend_pullback์ pullback candidate family๋ก ์ถ๊ฐํ์ต๋๋ค. ๋ํ ๊ธฐ์กด ์คํจ ์์ธ(์ ๋์์ต์ ๋์ง๋ง benchmark์ ๋ค์ฒ์ง)์ ์ง์ ๊ฒจ๋ฅํ๊ธฐ ์ํด momentum_factor์ KS11 ๋๋น ์ด๊ณผ ๋ชจ๋ฉํ
/๋ณ๋์ฑ ๊ฒ์ดํธ ์ต์
์ ์ถ๊ฐํ๊ณ benchmark_relative candidate family๋ก ๋
ธ์ถํ์ต๋๋ค. all sweep์ ์ด์ rotation/momentum/breakout/pullback/benchmark-relative ํ๋ณด๊ตฐ์ ํจ๊ป ํ๊ฐํฉ๋๋ค.
2026-04-30 5-symbol smoke sweep: ์ ๊ท benchmark_relative 3๊ฐ์ pullback 4๊ฐ ๋ชจ๋ NO_ALPHA_CANDIDATE. best=benchmark_relative_momentum_60d return +4.13%, excess=-169.50%p; best pullback=trend_pullback_aggressive return +3.04%, excess=-170.59%p. ๋ ํ๋ณด๊ตฐ์ ๊ณ์ research-only์
๋๋ค.
2026-04-30 follow-up: ์ ํธ ํํฐ๋ง ์ถ๊ฐํ๋ ๋ฐฉํฅ์ด ์ฝํ๋ค๊ณ ํ๋จํด risk_budget candidate family๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ๋์ผ ์ ํธ๋ฅผ ์ง์คํ/๊ท ํํ/๋ฐฉ์ดํ exposure budget์ผ๋ก ๋๋ ํ๊ฐํ๊ณ , ๊ฐ ํ๋ณด artifact์ ์ ์ฉ๋ diversification ์ค์ ์ ๊ธฐ๋กํฉ๋๋ค.
2026-04-30 risk-budget smoke sweep: 5์ข
๋ชฉ ๊ธฐ์ค NO_ALPHA_CANDIDATE. best return=risk_budget_momentum_120d_concentrated +11.40%, excess=-162.23%p, MDD=-32.28%; best risk-adjusted=risk_budget_rotation_slow_defensive +10.91%, excess=-162.72%p, MDD=-6.41%. ๋ฐฉ์ดํ exposure๋ ๋ํญ์ ์ค์์ง๋ง alpha ์์ฒด๋ ์์ง ์์ต๋๋ค.
2026-04-30 follow-up: ๋ฐฉ์ดํ exposure๋ง์ผ๋ก benchmark๋ฅผ ์ด๊ธฐ์ง ๋ชปํด relative_strength_rotation์ market_filter_exit ์ต์
์ ์ถ๊ฐํ๊ณ cash_switch candidate family๋ฅผ ์ถ๊ฐํ์ต๋๋ค. KS11์ด ์ด๋ํ๊ท ์๋๋ก ๋ด๋ ค๊ฐ๋ฉด ์ ๊ท ์ง์
์ฐจ๋จ์ ๋์ด ๊ธฐ์กด ํฌ์ง์
๋ ํ๊ธํํ๋ ๊ตฌ์กฐ์
๋๋ค.
2026-04-30 cash-switch smoke sweep: 5์ข
๋ชฉ ๊ธฐ์ค NO_ALPHA_CANDIDATE. best=cash_switch_rotation_slow_defensive return +1.87%, excess=-171.76%p, Sharpe=-0.40, MDD=-11.78%. ํ๊ธ ์ ํ์ ์์ค ๋ฐฉ์ด์๋ ์ผ๋ถ ์ ํจํ์ง๋ง benchmark ๋๋น alpha๋ ๋ง๋ค์ง ๋ชปํด research-only๋ก ์ ์งํฉ๋๋ค.
2026-04-30 follow-up: research_candidate_sweep์ exposure-matched benchmark diagnostics๋ฅผ ์ถ๊ฐํ์ต๋๋ค. cash-switch ํ๋ณด์ ํ๊ท ๋
ธ์ถ์ 8.410.0%์ ๋ถ๊ณผํ๊ณ exposure-matched excess๋ -7.87%p-0.36%p๋ก ์์์์ต๋๋ค. ์ฆ raw benchmark gap์ ๋ฎ์ ๋
ธ์ถ ์ํฅ์ด ํฌ์ง๋ง, ๊ฐ์ ๋
ธ์ถ๋ก ๋น๊ตํด๋ ์ ํธ edge๊ฐ ์์ง ์์ด ๋ค์ ์ฐ๊ตฌ๋ ๋จ์ ํ๊ธํ๋ณด๋ค benchmark-aware ๋ญํน/๋ถ๋ถ ํค์ง/๋
ธ์ถ ์ ์งํ alpha ์ค๊ณ๊ฐ ์ฐ์ ์
๋๋ค.
2026-04-30 follow-up: relative_strength_rotation์ benchmark-aware ranked mode๋ฅผ ์ถ๊ฐํ์ต๋๋ค. score_mode=benchmark_excess๋ ์ข
๋ชฉ 60/120d ๋ณตํฉ ๋ชจ๋ฉํ
์์ KS11 ๋ณตํฉ ๋ชจ๋ฉํ
์ ์ฐจ๊ฐํด ๋ญํนํ๊ณ , rank_entry_mode=dense_ranked/exit_rebalance_mode=score_floor๋ก ์ ๋ ์ถ์ธ ํํฐ ๋๋ฌธ์ ๊ณผ๋ํ๊ฒ ํ๊ธํ๋๋ ๋ฌธ์ ๋ฅผ research-only๋ก ๋ถ๋ฆฌ ๊ฒ์ฆํฉ๋๋ค.
2026-05-08 follow-up: backtest/portfolio_backtester.py์๋ gap-up ์ ๊ท ๋งค์ ์ฐจ๋จ, gap-down GAP_DOWN ์ฒญ์ฐ, ์ด๋ ์๋์ฐ ์ ๊ท ๋งค์ ์ฐจ๋จ, BlackSwan ์ฒญ์ฐยท์ฟจ๋ค์ดยทrecovery ์ฌ์ด์ง์ ๋ฐ์ํ์ต๋๋ค. ๋จ์ผ์ข
๋ชฉ/ํฌํธํด๋ฆฌ์ค ๋ฐฑํ
์คํธ๊ฐ ๊ฐ์ ๋ฆฌ์คํฌ ์ด๋ฒคํธ ์ ์ ๋ก ๋น๊ต๋๋๋ก gap_*, earnings_*, blackswan_* ์ง๋จ ์นด์ดํฐ์ ํ๊ท ํ
์คํธ๋ฅผ ๋ณด๊ฐํ์ต๋๋ค.
2026-05-08 follow-up: WatchlistManager.liquidity_filter_report()๋ฅผ ๊ณตํต ์ง๋จ API๋ก ๋ถ๋ฆฌํ๊ณ , ํฌํธํด๋ฆฌ์ค ๋ฐฑํ
์คํธ์ tools/research_candidate_sweep.py๊ฐ ํ๊ฐ ์์์ผ ๊ธฐ์ค 20์ผ ํ๊ท ๊ฑฐ๋๋๊ธ ํํ ๋ฏธ๋ง ๋๋ strict ๋ชจ๋ ๋ฐ์ดํฐ ๋๋ฝ ์ข
๋ชฉ์ universe์์ ๋จผ์ ์ ์ธํ๋๋ก ๋ณด๊ฐํ์ต๋๋ค. research artifact์๋ ์
๋ ฅ universe, ํํฐ ํต๊ณผ universe, ์ ์ธ ์ข
๋ชฉ/์ฌ์ ๊ฐ ํจ๊ป ๋จ์ต๋๋ค.
2026-05-08 follow-up: PortfolioBacktester๋ ๋จ์ผ์ข
๋ชฉ ๋ฐฑํ
์คํฐ์ฒ๋ผ ์ข
๋ชฉ๋ณ 20์ผ ํ๊ท ๊ฑฐ๋๋์ RiskManager.calculate_transaction_costs()์ ์ ๋ฌํด ๋์ ์ฌ๋ฆฌํผ์ง ๋ฐฐ์๋ฅผ ๋ฐ์ํฉ๋๋ค. ํฌํธํด๋ฆฌ์ค ๊ฑฐ๋ ๊ธฐ๋ก์๋ participation_rate, slippage_multiplier, slippage_cost๊ฐ ๋จ์ ๊ฑฐ๋๋น์ฉ ๊ณผ์์ถ์ ์ ์ ๊ฒํ ์ ์์ต๋๋ค.
2026-05-12 follow-up: ๋จ์ผ/ํฌํธํด๋ฆฌ์ค ๋ฐฑํ
์คํธ ๋ฆฌํฌํธ์ ๋น์ฉ ์ /ํ ์ฑ๊ณผ ๋น๊ต๋ฅผ ์๋ ๋
ธ์ถํฉ๋๋ค. backtest.cost_impact๊ฐ ์์๋ฃยท์ธ๊ธยท์ฌ๋ฆฌํผ์ง๋ฅผ ํ์ค ์ง๊ณํด ๋น์ฉ ์ฐจ๊ฐ ์ ์ถ์ ์์ต๋ฅ , ๋น์ฉ ๋๋๊ทธ(bp), ๋น์ฉ/์์์ต, cost impact status๋ฅผ ๋จ๊ธฐ๋ฉฐ, ๋น์ฉ ๋๋ฌธ์ gross profit์ด net loss๋ก ๋ค์งํ๊ฑฐ๋ ๋น์ฉ์ด ์์ด์ต์ ์ด๊ณผํ๋ฉด ์ด์ ๊ฒํ ์ ํธ๋ก ํ์ํฉ๋๋ค.
2026-05-08 follow-up: tools/research_candidate_sweep.py์ target-weight ๋ฆฌ์์น ๋ฐฑํ
์คํธ๋ OHLCV volume์ผ๋ก ์ข
๋ชฉ๋ณ 20์ผ ํ๊ท ๊ฑฐ๋๋์ ๊ณ์ฐํด ๋งค์ยท๋งค๋ ๋น์ฉ์ ์ ๋ฌํฉ๋๋ค. target-weight trade์ metrics์๋ avg_daily_volume, participation_rate, slippage_multiplier, slippage_cost_total์ด ๋จ์ high-turnover ํ๋ณด์ ๋น์ฉ ๊ณผ์์ถ์ ์ ๋ ๋นจ๋ฆฌ ํ์ธํ ์ ์์ต๋๋ค.
2026-05-12 follow-up: target-weight research sweep์ canonical risk-overlay ํ๋ณด์ target_tolerance_pct=3/5 ๋ณํ์ ์ถ๊ฐํ์ต๋๋ค. ๋ฆฌ์์น metrics์๋ rebalance_tolerance_pct, rebalance_tolerance_skipped_trades, rebalance_tolerance_skipped_notional์ ๋จ๊ฒจ ๋์ tolerance๊ฐ ์ค์ ๋ก turnover๋ฅผ ์ค์๋์ง artifact์์ ๋ฐ๋ก ํ์ธํ ์ ์์ต๋๋ค.
2026-05-08 follow-up: research_candidate_sweep์ EW B&H ๋ฒค์น๋งํฌ๊ฐ ์ผ๋ถ ์ข
๋ชฉ ๊ฒฐ์ธก ์ํ์์ ์ ์ฒด capital ๋๋น ๋ฎ๊ฒ ๊ณ์ฐ๋์ด ํ๋ณด ์ด๊ณผ์์ต์ด ๊ณผ๋ํ๊ฐ๋๋ ๊ฒฝ๋ก๋ฅผ ์ฐจ๋จํ์ต๋๋ค. ๋ฒค์น๋งํฌ ์
๋ ฅ universe ์ ์ฒด๊ฐ ์์งยท๊ฒ์ฆ๋์ง ์์ผ๋ฉด excess gate์ decision action์ INSUFFICIENT_BENCHMARK_DATA๋ก ๊ณ ์ ๋ฉ๋๋ค.
2026-05-08 follow-up: OrderExecutor live BUY/SELL์ ์ฃผ๋ฌธ ACK ์ดํ ์ฒด๊ฒฐ๊ฐยท์ฒด๊ฒฐ์๋ ํ์ธ์ด ๋์ง ์๊ฑฐ๋ ๋ถ๋ถ์ฒด๊ฒฐ๋ง ํ์ธ๋๋ฉด ๋ ์ด์ ์์๊ฐ ๊ธฐ์ค ์ ๋ FILLED๋ก ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. ์ด๋ success=False๋ ๋ธ๋ก์ปค ์ฃผ๋ฌธ ๋ถ์ฌ๊ฐ ์๋๋ผ order_pending=True/requires_reconcile=True์ธ ์ฅ๋ถ ๋ฐ์ ๋ณด๋ฅ ์ํ์ด๋ฉฐ, KIS ์๊ณ ๋์กฐ ์ DB ํฌ์ง์
ยท๊ฑฐ๋ ๊ธฐ๋ก ์ค์ผ์ ๋ง์ต๋๋ค.
2026-05-11 follow-up: paper BUY ์๋ยท์์ ยท์ต์ ยทํธ๋ ์ผ๋ง ๊ธฐ์ค์ ์์ ์ฒด๊ฒฐ๊ฐ๋ก ๋ณด์ํํ๊ณ , paper SELL๋ ๋งค์์ฒ๋ผ ๋ชจ๋ธ ์ฌ๋ฆฌํผ์ง๋ฅผ ์ฒด๊ฒฐ๊ฐ์ ๋ฐ์ํฉ๋๋ค. TradeHistory.price๋ ์ค์ ์ฒด๊ฒฐ๊ฐ๋ก ๋ณด๊ณ , get_trade_cash_summary()๋ ์ฌ๋ฆฌํผ์ง๋ฅผ ์ง๋จ๊ฐ์ผ๋ก ์ง๊ณํ๋ ํ๊ธ ํ๋ฆ์์๋ ์์๋ฃยท์ธ๊ธ๋ง ๋ณ๋ ์ฐจ๊ฐํด ์ฒด๊ฒฐ๊ฐ์ ์ด๋ฏธ ๋ค์ด๊ฐ ๋น์ฉ์ด ์ค๋ณต ๋ฐ์๋์ง ์๊ฒ ํ์ต๋๋ค.
2026-05-08 follow-up: KIS ๋ฏธ์ฒด๊ฒฐ ์กฐํ ์คํจ๋ฅผ ๋ ์ด์ โ๋ฏธ์ฒด๊ฒฐ ์์โ์ผ๋ก ํด์ํ์ง ์์ต๋๋ค. live BUY/SELL์ ์ฃผ๋ฌธ ์ ๋ฏธ์ฒด๊ฒฐ ์กฐํ๊ฐ ์คํจํ๊ฑฐ๋ ์๋ต ํ์์ด ๋ถ๋ช
ํํ๋ฉด live_unfilled_check.checked=False๋ก ์ฃผ๋ฌธ์ ๋ณด๋ฅํ๊ณ , ์ฌ์์ ๋ณต๊ตฌ์์๋ KIS ๋ฏธ์ฒด๊ฒฐ ์กฐํ ์คํจ๋ฅผ ๋ณ๋ critical ์๋ฆผ์ผ๋ก ๋๋ฌ๋
๋๋ค.
2026-05-14 follow-up: ํธํ์ฉ has_unfilled_orders()๋ ๋ฏธ์ฒด๊ฒฐ ์กฐํ ์คํจ๋ฅผ False๋ก ๊ฐ์ถ์ง ์๊ณ ๋ฏธ์ฒด๊ฒฐ ์์์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค. live ์ ๊ท ์ฃผ๋ฌธ์ด ์ํํ API๋ฅผ ์ฐํํ๋ ๋ ๊ฑฐ์ ๊ฒฝ๋ก๋ก ๋ค์ด์๋ ์ค๋ณต ์ฃผ๋ฌธ ์ํ์ fail-closed๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
2026-05-14 follow-up: OrderExecutor live BUY ์ง์ ํธ์ถ ์ฐํ๋ฅผ ๋ง์์ต๋๋ค. run_live_trading() ๋๋ live ๋ฆฌ๋ฐธ๋ฐ์ฑ์ฒ๋ผ readiness gate๋ฅผ ํต๊ณผํ ๊ฒฝ๋ก๋ง live_gate_validated=True๋ฅผ ์ ๋ฌํ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ fail-closed๋ผ ์๋ ์คํฌ๋ฆฝํธ/์ฝ์์์ executor๋ฅผ ์ง์ ๋ง๋ค์ด๋ ์ ๊ท BUY๋ KIS ์ฃผ๋ฌธ ์ ์ ์ฐจ๋จ๋ฉ๋๋ค. SELL์ ๊ธด๊ธ ์ฒญ์ฐ ์์ ์ฑ์ ์ํด ๊ธฐ์กด ์คํ ๊ฒฝ๋ก๋ฅผ ์ ์งํฉ๋๋ค.
2026-05-14 follow-up: ๋ฐ์ค์ผ ๋ฆฌ๋ฐธ๋ฐ์ฑ paper BUY ์คํ ๊ฒฝ๋ก๋ฅผ ๋ณต๊ตฌํ์ต๋๋ค. BasketRebalancer.execute()๊ฐ ์๋ ํฌํธํด๋ฆฌ์ค ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ get_current_capital()/get_available_cash() ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํ๊ณ , ์ค์ ์ฃผ๋ฌธ ์คํ ์ ์๋ณธยทํ๊ธ ๊ฐ์ด OrderExecutor.execute_buy_quantity()์ ์ ๋ฌ๋๋์ง ํ๊ท ํ
์คํธ๋ก ๊ณ ์ ํ์ต๋๋ค.
2026-05-14 follow-up: ์์ฅ ๊ตญ๋ฉด ํํฐ๋ฅผ fail-closed๋ก ๋ณด๊ฐํ์ต๋๋ค. market_regime_filter=true ์ํ์์ ์ง์ ๋ฐ์ดํฐ ์กฐํ ์คํจ, ๋น ๋ฐ์ดํฐ, MA ๊ณ์ฐ ์คํจ๊ฐ ๋ฐ์ํ๋ฉด ๋ ์ด์ bullish ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๊ธฐ์ง ์๊ณ regime=unknown, allow_buys=false, position_scale=0.0์ผ๋ก ์ ๊ท BUY๋ฅผ ์ฐจ๋จํฉ๋๋ค. ์ง์ OrderExecutor.execute_buy()๋ฅผ ํธ์ถํ๋ ๊ฒฝ๋ก๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ผ๋ฉด ์ฃผ๋ฌธ ์ ์ค๋จํฉ๋๋ค.
2026-05-14 follow-up: KIS Circuit Breaker์ HALF_OPEN ๋ณต๊ตฌ ์ํ๋ฅผ ๋จ์ผ probe ๋ฐฉ์์ผ๋ก ์ ํํ์ต๋๋ค. OPEN ์ฟจ๋ค์ด ํ ์ฒซ ์์ฒญ ํ๋๋ง ํต๊ณผ์ํค๊ณ , on_success() ๋๋ on_failure()๊ฐ ๋ค์ด์ค๊ธฐ ์ ๊น์ง ์ถ๊ฐ ์์ฒญ์ ์ฐจ๋จํด ์ฅ์ ํ๋ณต ์งํ ์์ฒญ์ด ํ๊บผ๋ฒ์ ํ๋ฆฌ์ง ์๊ฒ ํ์ต๋๋ค.
2026-05-14 follow-up: paper promotion evidence package์ package_integrity.payload_hash์ source_records.records_hash๋ฅผ ์ถ๊ฐํ์ต๋๋ค. live gate๋ ํจํค์ง payload hash, ์๋ณธ daily evidence JSONL์์ ์ฌ๊ณ์ฐํ source record hash, record count/date ๋ฒ์๋ฅผ ๋ชจ๋ ๋น๊ตํด ํจํค์ง ์์ฝ๊ฐ๊ณผ ์๋ณธ evidence๊ฐ ๋ฐ๋ก ๋ณ๊ฒฝ๋ ์ํ๋ฅผ live ์ ํ ๊ทผ๊ฑฐ๋ก ์ฐ์ง ์์ต๋๋ค.
2026-05-14 follow-up: live ๊ธด๊ธ ์ฒญ์ฐ์ KIS ํ์ฌ๊ฐ๊ฐ ์๊ฑฐ๋ 0 ์ดํ์ด๋ฉด ํด๋น ์ข
๋ชฉ์ ์คํจ ์์ธ๋ก ๊ธฐ๋กํ๊ณ execute_sell์ ํธ์ถํ์ง ์์ต๋๋ค. ํ๊ท ๋จ๊ฐ๋ฅผ ํ์ฌ ์์ฅ๊ฐ์ฒ๋ผ ์ฌ์ฉํ ์ง์ ๊ฐ ๋งค๋ fallback์ ๋ง์ ๊ธ๋ฝ์ฅ ๋ฏธ์ฒด๊ฒฐ ์ํ์ ์ด์ ์๋ฆผ์ผ๋ก ๋๋ฌ๋
๋๋ค.
2026-05-08 follow-up: target-weight ๋ฆฌ์์น ๋ฐฑํ
์คํธ์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ์ฒด๊ฒฐ ๊ธฐ์ค์ ๋น์ผ ์ข
๊ฐ์์ ๋ค์ ๊ฑฐ๋์ผ ์๊ฐ๋ก ๋ณด์ํํ์ต๋๋ค. ๋ญํน๊ณผ risk-off ํ๋จ์ ์ง์ ๊ฑฐ๋์ผ ์ข
๊ฐ๊น์ง๋ง ์ฌ์ฉํ๊ณ , ๋ฆฌ๋ฐธ๋ฐ์ฑ ์ฒด๊ฒฐ์ ํด๋น ๊ฑฐ๋์ผ ์๋ณธ open, ์ผ๋ง ํ๊ฐ๋ close๋ก ๋ถ๋ฆฌํฉ๋๋ค. ์ ๊ท top-N ๋งค์ ํ๋ณด์ ๋ฆฌ๋ฐธ๋ฐ์ฑ์ผ open์ด ๋๋ฝ๋๋ฉด target_weight_research_execution_price_missing์ผ๋ก ์ค๋จํ๊ณ , ์ด๋ฏธ ๋ณด์ ํ ์ข
๋ชฉ์ open์ด ์์ผ๋ฉด ํด๋น ๋ฆฌ๋ฐธ๋ฐ์ฑ์ ๊ฑฐ๋ ์์ด skip ์ง๋จ์ผ๋ก ๋จ๊น๋๋ค. ๋์ ์ฌ๋ฆฌํผ์ง์ 20์ผ ํ๊ท ๊ฑฐ๋๋๋ ๋น์ผ ๊ฑฐ๋๋์ ํฌํจํ์ง ์๋๋ก 1๊ฑฐ๋์ผ ์ง์ฐํฉ๋๋ค.
2026-04-30 benchmark-aware rotation smoke sweep: 5์ข
๋ชฉ ๊ธฐ์ค NO_ALPHA_CANDIDATE. best=benchmark_aware_rotation_60_120_balanced return=+21.65%, Sharpe=0.50, avg exposure=24.1%์์ง๋ง raw excess=-151.98%p, exposure-matched excess=-16.05%p๋ผ promotion ๋ฏธ์งํ. fast 40_100_dense๋ exposure-matched excess=+2.04%p์์ผ๋ raw excess=-163.35%p๋ผ ๋ค์ ์ฐ๊ตฌ ํํธ๋ก๋ง ๊ธฐ๋กํฉ๋๋ค. ๋ค์ ๋ฐฉํฅ์ sparse BUY/SELL ์ ํธ๋ฅผ ๋์ด monthly top-N ๋ชฉํ๋น์ค ๋ฆฌ๋ฐธ๋ฐ์ฑ์ ๋ณ๋ ๋ฐฑํ
์คํฐ๋ก ๊ฒ์ฆํ๋ ๊ฒ์
๋๋ค.
2026-04-30 target-weight top-N rotation smoke sweep: 5์ข
๋ชฉ ๊ธฐ์ค NO_ALPHA_CANDIDATE. best=target_weight_rotation_top3_40_100_excess return=+128.44%, Sharpe=1.13, avg exposure=85.3%๋ก ๋
ธ์ถ ๋ถ์กฑ ๋ฌธ์ ๋ ํด๊ฒฐํ์ง๋ง raw excess=-45.19%p, exposure-matched excess=-14.82%p๋ผ promotion ๋ฏธ์งํ. ์ด ๊ฒฐ๊ณผ๋ sparse ์ ํธ๊ฐ ๋ณ๋ชฉ์ด์์์ ํ์ธํ์ง๋ง, ๋์ผ ์ ๋๋ฒ์ค B&H๋ฅผ ์ด๊ธฐ๋ alpha๋ ์์ง ์๋๋ผ์ ๋ค์ ์ฐ๊ตฌ๋ ๋ ๋์ ์ ๋๋ฒ์ค์ ๋ถ๋ถ hedge/์๋๊ฐ๋ ํํฐ ๊ฐ์ ์
๋๋ค.
2026-04-30 canonical top-20 target-weight full sweep: ๊ธฐ์กด target_weight_rotation_top5_60_120_floor0_hold3๋ return=+278.57%, raw excess=+129.18%p, exposure-matched excess=+150.88%p, Sharpe=1.65, WF positive/Sh+ 100%, turnover/year=807.8%์์ง๋ง MDD=-28.25%๋ก paper_only. benchmark-risk overlay ์ถ๊ฐ ํ best=target_weight_rotation_top5_60_120_floor0_hold3_risk60_35๋ return=+210.24%, raw excess=+60.85%p, exposure-matched excess=+130.96%p, Sharpe=1.60, PF=5.73, MDD=-19.24%, turnover/year=858.0%, WF positive/Sh+ 100%, risk-off rebalance=38.9%๋ก ์ฒ์ provisional_paper_candidate์ ๋๋ฌํ์ต๋๋ค. ํ์์ผ๋ก tools/evaluate_and_promote.py --canonical์ด ์ด ํ๋ณด๋ฅผ canonical promotion bundle์ ์ฌํํ๋๋ก ์ฐ๊ฒฐํ๊ณ , promotion_result.json์์๋ ๋์ผ ํ๋ณด๊ฐ provisional_paper_candidate๋ก ๋ก๋๋ฉ๋๋ค. ์ถ๊ฐ๋ก tools/target_weight_rotation_pilot.py๊ฐ portfolio-level ๋ชฉํ๋น์ค plan์ ๋ง๋ค๊ณ pilot cap์ ๊ฒ์ฆํ ๋ค paper-only exact-quantity ์ฃผ๋ฌธ์ ๋ผ ์ ์๊ฒ ํ์ต๋๋ค. dry-run์ --record-shadow-evidence๋ก non-promotable shadow_bootstrap evidence๋ฅผ ๋จ๊ธฐ๊ณ , ๊ฐ์ ์คํ์์ launch readiness JSON/MD์ pilot runbook์ ์์ฑํฉ๋๋ค. session artifact์๋ ๊ธฐ๋ณธ cap preview, plan ๊ธฐ๋ฐ ์ต์/์ถ์ฒ pilot cap, enable ๋ช
๋ น, launch artifact ๊ฒฝ๋ก๊ฐ ํจ๊ป ๊ธฐ๋ก๋ฉ๋๋ค. live ์๋์ด์์ ์ฌ์ ํ ๊ธ์ง์
๋๋ค.
2026-05-11 follow-up: target-weight canonical์ next-open ์ฒด๊ฒฐ๊ณผ ๊ฒฐ์ธก ์ง๋จ ๊ธฐ์ค์ผ๋ก ์ฌ๊ฒ์ฆํ์ต๋๋ค. target_weight_rotation_top5_60_120_floor0_hold3_risk60_35๋ return=+171.20%, PF=4.24, Sharpe=1.41, MDD=-19.90%, WF positive=100%, WF Sharpe+=83.3%๋ก provisional_paper_candidate๋ฅผ ์ ์งํ์ต๋๋ค. ์ด๋ฒ ์ฐ์ถ๋ฌผ์ stale score ํ๋ณด 2๊ฐ ์ ์ธ, held stale valuation 21์ผ, ๋ณด์ ์ข
๋ชฉ ์๊ฐ ๋๋ฝ์ ๋ฐ๋ฅธ ๋ฆฌ๋ฐธ๋ฐ์ฑ skip 1ํ๋ฅผ metrics์ ๋จ๊ธฐ๋ฏ๋ก paper pilot์์๋ ์ฒด๊ฒฐ ๊ฐ๋ฅ์ฑ๊ณผ stale valuation ๋น๋๋ฅผ ํจ๊ป ๊ฐ์ํด์ผ ํฉ๋๋ค.
2026-05-12 top-200 target-weight follow-up: --top-n 200 --candidate-id target_weight_rotation_top5_60_120_floor0_hold3_risk60_35 full sweep์ ์คํํ์ต๋๋ค. canonical liquidity 200๊ฐ ์ค ์ ๋์ฑ ํํฐ ํต๊ณผ 164๊ฐ, benchmark coverage 100%์์ return=+110.39%, raw excess=+78.50%p, exposure-matched excess=+90.25%p, Sharpe=0.85, PF=2.06, WF positive=83.3%, WF Sharpe+=100%์์ง๋ง MDD=-25.79%, turnover/year=1097.1%๋ก provisional ๊ฒ์ดํธ๋ฅผ ๋์ง ๋ชปํด paper_only์
๋๋ค. ์ด ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค์ผ๋ก alpha ์กด์ฌ ์ฌ๋ถ๋ณด๋ค drawdown๊ณผ turnover๋ฅผ ๋์์ ๋ฎ์ถ๋ ๋ฆฌ์คํฌ ์ํ ํ๋ณด๊ตฐ ๊ฒ์ฆ์ผ๋ก ์ด์ด๊ฐ์ต๋๋ค.
2026-05-12 ๋ฆฌ์คํฌ ์ํ top-200 follow-up: --candidate-family target_weight_risk_relief --top-n 200 full sweep์์ 10๊ฐ ํ๋ณด๋ฅผ ๋น๊ตํ์ต๋๋ค. ์ต์์ ํ๋ณด target_weight_rotation_top5_60_120_floor0_hold3_risk60_35_tol5๋ return=+125.61%, raw excess=+93.72%p, exposure-matched excess=+104.53%p, avg exposure=68.5%, Sharpe=0.91, PF=2.19, WF positive=83.3%, WF Sharpe+=100%๋ก ๊ธฐ์กด ๋จ์ผ ํ๋ณด๋ณด๋ค ์์ต์ฑ์ ๊ฐ์ ๋์ต๋๋ค. ๋ค๋ง ์ ์ฒด ํ๋ณด๊ฐ MDD -25.27%~-32.14%, turnover/year 1027.2%~1344.3% ๊ตฌ๊ฐ์ ์์ด mdd < -20์ turnover_per_year >= 1000 ๋ณ๋ชฉ์ ๋์ง ๋ชปํ๊ณ , ํ์ ์ KEEP_RESEARCH_ONLY์
๋๋ค. sweep data fetch cache๋ unique_fetches=1155, cache_hits=10395๋ก ๋์์ ํ์ธํ์ต๋๋ค. ๋ค์ ์ฐ๊ตฌ๋ ๋ฆฌ๋ฐธ๋ฐ์ฑ ๋น๋ ์์ฒด๋ฅผ ๋ฎ์ถ๋ ๊ฒฉ์/๋ถ๊ธฐ ๋ฆฌ๋ฐธ๋ฐ์ฑ, ๋ณ๋์ฑ ํ๊น, ๋ํญ ์ฐจ๋จ, ํ์ ์จ ํจ๋ํฐ ๋ญํน์ ์ฐ์ ํฉ๋๋ค.
2026-05-12 ์ ํ์ top-200 follow-up: --candidate-family target_weight_turnover_relief --top-n 200 full sweep์์ ๊ฒฉ์/๋ถ๊ธฐ ๋ฆฌ๋ฐธ๋ฐ์ฑ ํ๋ณด 6๊ฐ๋ฅผ ๊ฒ์ฆํ์ต๋๋ค. best=target_weight_rotation_top5_60_120_floor0_hold3_risk90_35_bimonthly๋ return=+85.72%, raw excess=+53.83%p, exposure-matched excess=+68.63%p, Sharpe=0.73, PF=1.86, turnover/year=616.7%์์ต๋๋ค. ๋ถ๊ธฐ ํ๋ณด์ turnover/year๋ 456.1476.9%๊น์ง ๋ด๋ ค๊ฐ์ง๋ง, ์ ํ๋ณด๊ฐ benchmark excess Sharpe<=0 ๋ฐ MDD -25.35%-35.12%๋ก ๋งํ ํ์ ์ NO_ALPHA_CANDIDATE์
๋๋ค. ์ฆ ๋จ์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ๋น๋ ์ถ์๋ ํ์ ์จ ๋ณ๋ชฉ์ ์ํํ์ง๋ง ์ํ์กฐ์ alpha์ ๋ํญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๊ณ , ์ด ํ๋จ์ ๋ฐํ์ผ๋ก ๋ณ๋์ฑ ํ๊น๊ณผ ๋ํญ ์ฐจ๋จ์ ์ค์ ํฌ์ง์
ํฌ๊ธฐ ์ฐ์์ ๋ฃ๋ ํ๋ณด๊ตฐ์ ์ด์ด์ ๊ฒ์ฆํ์ต๋๋ค.
2026-05-12 ๋ณ๋์ฑ ํ๊น top-200 follow-up: --candidate-family target_weight_volatility_target --top-n 200 full sweep์์ benchmark ์คํ ๋ณ๋์ฑ ํ๊น๊ณผ drawdown floor ํ๋ณด 6๊ฐ๋ฅผ ๊ฒ์ฆํ์ต๋๋ค. best=target_weight_rotation_top5_60_120_floor0_hold3_risk60_35_tol5_vol16_dd8_floor35๋ return=+105.18%, raw excess=+73.29%p, exposure-matched excess=+91.35%p, avg exposure=71.7%, Sharpe=0.81, PF=2.03, turnover/year=958.0%์์ต๋๋ค. ๋ค๋ง ์ ํ๋ณด๊ฐ MDD -24.26%~-31.04%๋ก provisional MDD ๊ฒ์ดํธ๋ฅผ ํต๊ณผํ์ง ๋ชปํ๊ณ , 5๊ฐ ํ๋ณด๋ benchmark excess Sharpe๋ 0 ์ดํ๋ผ ํ์ ์ KEEP_RESEARCH_ONLY์
๋๋ค. ๋ณ๋์ฑ ๊ธฐ๋ฐ ๋
ธ์ถ ์ถ์๋ง์ผ๋ก๋ ๋ํญ ๋ณ๋ชฉ์ด ์ถฉ๋ถํ ํ๋ฆฌ์ง ์์์ผ๋ฏ๋ก ๋ค์ ์ฐ๊ตฌ๋ ๋ชฉํ ๋
ธ์ถ ์ฐ์๋ณด๋ค ์ข
๋ชฉ ์ ๋ณ ๋ญํน์ ๋ํญยทํ๋ฐฉ๋ณ๋์ฑยท์๊ด/์
์ข
์ง์ค ํ๋ํฐ๋ฅผ ๋ฃ๋ ๋ฐฉํฅ์ผ๋ก ์ ํํฉ๋๋ค.
2026-05-12 ๋ฆฌ์คํฌ ํ๋ํฐ ๋ญํน top-200 follow-up: --candidate-family target_weight_downside_rank_relief --top-n 200 full sweep์์ ๋ํญยทํ๋ฐฉ๋ณ๋์ฑ ํ๋ํฐ ํ๋ณด 5๊ฐ๋ฅผ ๊ฒ์ฆํ์ต๋๋ค. best=target_weight_rotation_top5_60_120_floor0_hold3_risk60_35_tol5_rankrisk60๋ return=+132.51%, raw excess=+100.62%p, exposure-matched excess=+111.43%p, Sharpe=0.94, PF=2.21, WF positive/Sh+=100%๋ก ๊ธฐ์กด ๋ฆฌ์คํฌ ์ํ ํ๋ณด๋ณด๋ค ์์ต์ฑ์ ๊ฐ์ ๋์ต๋๋ค. ๋ค๋ง ์ ํ๋ณด๊ฐ MDD -25.20%~-33.07%, turnover/year 1143.8%~1366.0%๋ก ๋งํ ํ์ ์ KEEP_RESEARCH_ONLY์
๋๋ค. ์ฆ downside rank penalty๋ alpha ํ๋ณด์ฑ์ ๊ฐํํ์ง๋ง, ์ข
๋ชฉ ๊ต์ฒด ๋น๋๋ฅผ ๋ฎ์ถ์ง ๋ชปํ์ต๋๋ค. ๋ค์ ์ฐ๊ตฌ๋ ์ด ๋ญํน ํ๋ํฐ๋ฅผ ๊ฒฉ์ ๋ฆฌ๋ฐธ๋ฐ์ฑ, ๋ ๋์ tolerance, ์๋ณ ์ ๊ท ํธ์
์ ์ ํ ๊ฐ์ churn control๊ณผ ๊ฒฐํฉํ๋ ๋ฐฉํฅ์
๋๋ค.
2026-05-12 follow-up: target_weight_churn_relief ํ๋ณด๊ตฐ์ ์ถ๊ฐํ์ต๋๋ค. ์ง์ best์๋ downside rank penalty ํ๋ณด๋ฅผ ๊ธฐ์ค์ผ๋ก max_new_targets_per_rebalance ์ ๊ท ํธ์
์ํ, ๊ฒฉ์ ๋ฆฌ๋ฐธ๋ฐ์ฑ, ๋์ tolerance ์กฐํฉ์ ๋ณ๋ family๋ก ๋ถ๋ฆฌํด top-200 full sweep์์ turnover/year์ MDD ๋ณ๋ชฉ์ด ์ค์ ๋ก ์ํ๋๋์ง ํ์ธํ ์ ์๊ฒ ํ์ต๋๋ค.
2026-05-12 churn control top-200 follow-up: --candidate-family target_weight_churn_relief --top-n 200 full sweep์์ ํ๋ณด 5๊ฐ๋ฅผ ๊ฒ์ฆํ๊ณ ํ์ ์ KEEP_RESEARCH_ONLY์
๋๋ค. best=target_weight_rotation_top5_60_120_floor0_hold3_risk60_35_tol5_rankrisk60_maxnew2๋ return=+118.89%, raw excess=+87.00%p, exposure-matched excess=+97.61%p, Sharpe=0.89, PF=2.04, WF positive/Sh+=100%์์ง๋ง MDD=-26.95%, turnover/year=1034.2%๋ก provisional ๊ฒ์ดํธ๋ฅผ ๋์ง ๋ชปํ์ต๋๋ค. maxnew1๊ณผ ๊ฒฉ์ ํ๋ณด๋ turnover/year๋ฅผ 423.0~674.4%๊น์ง ๋ฎ์ท์ง๋ง benchmark excess Sharpe์ MDD๊ฐ ์
ํ๋์ต๋๋ค. ๋ค์ ์ฐ๊ตฌ๋ ๋จ์ ๊ต์ฒด ์ ํ๋ณด๋ค ํฌํธํด๋ฆฌ์ค drawdown guard, ์ฌ์ง์
cooldown, ์๊ด/์
์ข
์ง์ค๋ ํ๋ํฐ์ฒ๋ผ ์์ค ๊ตฌ๊ฐ ์์ฒด๋ฅผ ์ค์ด๋ ๊ตฌ์กฐ๊ฐ ์ฐ์ ์
๋๋ค.
2026-05-12 follow-up: target_weight_drawdown_guard ํ๋ณด๊ตฐ์ ์ถ๊ฐํ์ต๋๋ค. ์ง์ ํ๊ฐ NAV ๊ธฐ์ค ํฌํธํด๋ฆฌ์ค ๋ํญ์ด ์๊ณ๊ฐ์ ๋์ผ๋ฉด ๋ค์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ๋ชฉํ ๋
ธ์ถ์ floor๊น์ง ๋ฎ์ถ๊ณ , ํ๋ณต ์งํ์๋ ์ง์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ํ์๋งํผ cooldown์ ์ ์งํฉ๋๋ค. ๋ค์ ๊ฒ์ฆ์ --candidate-family target_weight_drawdown_guard --top-n 200 full sweep์ผ๋ก MDD๊ฐ ์ค์ ๋ก ๋ฎ์์ง๋์ง ํ์ธํฉ๋๋ค.
2026-05-12 ์์ค๋ฐฉ์ด top-200 follow-up: --candidate-family target_weight_drawdown_guard --top-n 200 full sweep์์ ํ๋ณด 5๊ฐ๋ฅผ ๊ฒ์ฆํ๊ณ ํ์ ์ RUN_CANONICAL_EVALUATION์
๋๋ค. best=target_weight_rotation_top5_60_120_floor0_hold3_risk60_35_tol5_rankrisk60_pdd8_floor25_cd1๋ return=+99.53%, raw excess=+67.64%p, exposure-matched excess=+83.07%p, avg exposure=56.5%, Sharpe=1.02, PF=4.88, MDD=-19.56%, turnover/year=296.4%, WF positive/Sh+=66.7%์์ต๋๋ค. ํฌํธํด๋ฆฌ์ค guard๋ trigger 17ํ, guard rebalance 20ํ(74.1%)๋ก ๋์ํ์ต๋๋ค. ๋ ๋ฒ์งธ ํ๋ณด target_weight_rotation_top5_60_120_floor0_exp75_rankrisk90_pdd10_floor40_cd1๋ provisional ์กฐ๊ฑด์ ํต๊ณผํ์ง๋ง turnover/year=893.4%๋ก ๋น์ฉ ๋ฏผ๊ฐ๋๊ฐ ๋ ํฝ๋๋ค. ๋๋จธ์ง 3๊ฐ๋ MDD -20% ๋ฏธ๋ง ๋๋ benchmark excess Sharpe<=0๋ก paper_only์
๋๋ค. ๋ค์ ๋จ๊ณ๋ eligible 2๊ฐ ํ๋ณด๋ฅผ canonical promotion evaluation์ ์ฌ๋ ค ๊ฐ์ ๊ธฐ์ค์์ ์ฌํ์ฑ์ ํ์ธํ๋ ๊ฒ์ด๋ฉฐ, ์ด artifact๋ง์ผ๋ก paper/live ์ ํ์ ํ์ง ์์ต๋๋ค.
2026-05-13 ์์ค๋ฐฉ์ด canonical follow-up: tools/evaluate_and_promote.py --canonical์ eligible 2๊ฐ ์์ค๋ฐฉ์ด ํ๋ณด๋ฅผ ํฌํจํด ์ฌํ๊ฐํ์ต๋๋ค. ๊ธฐ์กด target_weight_rotation_top5_60_120_floor0_hold3_risk60_35๋ return=+171.20%, benchmark excess=+21.81%p, Sharpe=1.41, PF=4.24, MDD=-19.90%, turnover/year=794.0%, WF positive=100%, WF Sharpe+=83.3%๋ก provisional_paper_candidate๋ฅผ ์ ์งํ์ต๋๋ค. pdd8/floor25 ํ๋ณด๋ return=+142.93%, Sharpe=1.43, PF=7.69, MDD=-15.89%, turnover/year=530.8%๋ก ๋ฐฉ์ด๋ ฅ์ ์ข์์ก์ง๋ง canonical benchmark excess=-6.46%p๋ผ paper_only์
๋๋ค. exp75/rankrisk90/pdd10/floor40 ํ๋ณด๋ return=+180.40%, benchmark excess=+31.01%p, Sharpe=1.49, PF=4.85, MDD=-19.24%, WF positive/Sh+=100%์์ง๋ง turnover/year=1026.3%๋ก ๊ฒ์ดํธ๋ฅผ ๋๊ฒจ paper_only์
๋๋ค. ๋ค์ ์ฐ๊ตฌ๋ exp75 ๊ณ์ด์ tolerance ๋๋ ์ ๊ท ํธ์
์ ํ์ ๊ฒฐํฉํด ์ด๊ณผ์์ต๊ณผ WF ์์ ์ฑ์ ์ ์งํ๋ฉด์ turnover/year๋ฅผ 1000% ์๋๋ก ๋ฎ์ถ๋ ๋ฐฉํฅ์
๋๋ค.
2026-05-13 exp75 ํ์ ์จ ์ํ follow-up: target_weight_drawdown_guard family์ exp75/rankrisk90/pdd10/floor40 ๊ธฐ๋ฐ tol3, tol4, tol5, maxnew2, tol3_maxnew2 ๋ณํ์ ์ถ๊ฐํ์ต๋๋ค. --candidate-family target_weight_drawdown_guard --top-n 200 ์ฌ๊ฒ์ฆ์์๋ ํ๋ณด 10๊ฐ ์ค 4๊ฐ๊ฐ canonical ํ๊ฐ ๋์์ผ๋ก ๋จ์๊ณ , ์ tol4 ํ๋ณด๋ return=+81.19%, raw excess=+49.30%p, exposure-matched excess=+66.89%p, MDD=-19.33%, turnover/year=886.7%, WF positive/Sh+=100%๋ก research ๊ธฐ์ค์ ํต๊ณผํ์ต๋๋ค. canonical ์ฌํ๊ฐ์์๋ target_weight_rotation_top5_60_120_floor0_exp75_rankrisk90_tol4_pdd10_floor40_cd1๊ฐ return=+183.02%, benchmark excess=+33.63%p, Sharpe=1.50, PF=4.82, turnover/year=986.5%๋ก ํ์ ์จ ๊ฒ์ดํธ๋ ํต๊ณผํ์ง๋ง MDD=-20.25%๊ฐ -20% ์ ํ์ 0.25%p ์ด๊ณผํด paper_only์
๋๋ค. tol3๋ turnover/year=1009.0%, ์๋ณธ์ 1026.3%๋ก ๊ฐ๊ฐ ํ์ ์จ ๋ฏธ๋ฌ์
๋๋ค. ๋ค์ ์ฐ๊ตฌ๋ tol4์ ๋ฎ์์ง ํ์ ์จ์ ์ ์งํ๋ฉด์ drawdown floor/cooldown ๋๋ ranking risk penalty๋ฅผ ๋ ๋ณด์ํํด MDD๋ฅผ -20% ์์ชฝ์ผ๋ก ๋๋๋ฆฌ๋ ๋ฐฉํฅ์ด๋ฉฐ, ํ์ฌ live/paper ์ ํ ๋์์ ๊ธฐ์กด risk-overlay ํ๋ณด๋ง ์ ์งํฉ๋๋ค.
2026-05-13 tol4 ๋ํญ ์ํ follow-up: tol4 ๊ธฐ๋ฐ์ผ๋ก pdd10_floor35_cd1, pdd8_floor40_cd1, pdd8_floor35_cd1, pdd10_floor40_cd2 ๋ค ๋ณํ์ ์ถ๊ฐํด target_weight_drawdown_guard --top-n 200 full sweep์ ๋ค์ ์คํํ์ต๋๋ค. ํ๋ณด 14๊ฐ ์ค ์ ๊ท ๋ณํ์ canonical eligible์ ์ถ๊ฐ๋์ง ์์์ต๋๋ค. pdd10_floor35๋ turnover/year=829.8%๋ก ๋ฎ์์ก์ง๋ง MDD=-20.20%, pdd8_floor35๋ MDD=-20.20%๋ผ ์คํจํ๊ณ , pdd8_floor40๊ณผ cooldown2๋ MDD/turnover๋ ํต๊ณผ๊ถ์ด์์ง๋ง benchmark excess Sharpe<=0์ผ๋ก ์ ์ธ๋์ต๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก guard trigger/floor/cooldown๋ง ๋ ์กฐ์ด๋ ๋ฐฉ์์ alpha ๋๋ MDD ์ค ํ๋๋ฅผ ์๊ธฐ ์ฌ์ฐ๋ฏ๋ก, ๋ค์ ํ๋ณด๋ ์ข
๋ชฉ ์ ํ ๋จ๊ณ์ downside rank penalty/์๊ดยท์
์ข
์ง์ค๋ ํ๋ํฐ๋ ๋น์ฉ ๋ฏผ๊ฐ๋ ๊ธฐ์ค์ ํจ๊ป ์กฐ์ ํ๋ ์ชฝ์ด ์ฐ์ ์
๋๋ค.
2026-05-13 rank-risk ๋ณด๊ฐ follow-up: exp75 ๊ณ์ด์ rankrisk90_dd75, rankrisk120์ ์ถ๊ฐํ๊ณ tol4+pdd10/floor40 guard์ ๊ฒฐํฉํ์ต๋๋ค. target_weight_drawdown_guard --top-n 200 ํ๋ณด 16๊ฐ ์ฌ๊ฒ์ฆ์์๋ rankrisk120_tol4๊ฐ return=+84.41%, raw excess=+52.52%p, MDD=-19.30%, turnover/year=919.4%, rankrisk90_dd75_tol4๊ฐ return=+82.56%, raw excess=+50.67%p, MDD=-19.54%, turnover/year=896.0%๋ก ๊ธฐ์กด tol4๋ณด๋ค ์ข์์ ธ canonical ํ๊ฐ ๋์์ ํฌํจ๋์ต๋๋ค. ํ์ง๋ง canonical top-20 ์ฌํ๊ฐ์์๋ ๊ฐ๊ฐ return=+125.69%/+125.99%, turnover/year=927.9%/947.6%์์ง๋ง MDD=-20.74%/-20.76%์ benchmark excess=-23.70%p/-23.40%p๋ก paper_only์
๋๋ค. ํจ๋ํฐ ๊ฐ๋๋ง ํค์ฐ๋ฉด top-200์์๋ ์ข์์ ธ๋ canonical ๋ํ์ฃผ ๊ตฌ๊ฐ alpha๊ฐ ๊บพ์ด๋ฏ๋ก, ๋ค์์ sector/correlation cap์ฒ๋ผ ๋ถ์ฐ ์ ์ฝ์ ์ ํ ๋จ๊ณ์ ์ง์ ๋ฃ๋ ์ชฝ์ ์ฐ์ ํฉ๋๋ค.
2026-05-13 sector cap follow-up: FDR KRX ๋ชฉ๋ก์ ์
์ข
์ปฌ๋ผ์ด ์๋ ํ๊ฒฝ์์๋ get_sector_map()์ด KRX KIND ์์ฅ๋ฒ์ธ ๋ชฉ๋ก(2,766๊ฐ ์
์ข
๋งคํ)์ผ๋ก fallbackํ๋๋ก ๋ณด๊ฐํ๊ณ , target_weight_drawdown_guard --top-n 200์ sectorcap1/2 ํ๋ณด๋ฅผ ์ถ๊ฐํ์ต๋๋ค. sectorcap2๋ ์ค์ ์นํฐ ๋งต ์ ์ฉ ๊ธฐ์ค์ผ๋ก rankrisk120_tol4_sectorcap2 return=+85.49%, raw excess=+53.60%p, MDD=-19.94%, turnover/year=941.5%, rankrisk90_tol4_sectorcap2 return=+82.57%, raw excess=+50.68%p, MDD=-19.59%, turnover/year=909.3%๋ก canonical ํ๊ฐ ๋์์ ํฌํจ๋์ต๋๋ค. canonical top-20์์๋ rankrisk90_tol4_sectorcap2๊ฐ return=+185.39%, benchmark excess=+36.00%p, turnover/year=981.0%๋ก ์๋ณธ tol4๋ณด๋ค ์ข์์ก์ง๋ง MDD=-20.22%๋ผ paper_only์
๋๋ค. rankrisk120_tol4_sectorcap2๋ sector cap ์ ์ฉ ํ์๋ canonical ๊ฒฐ๊ณผ๊ฐ ๊ธฐ์กด๊ณผ ๊ฐ์ benchmark excess=-23.70%p, MDD=-20.74%๋ก ์ ์ธํ์ต๋๋ค. ๋ค์ ํ๋ณด๋ ์นํฐ ์๋ cap๋ง์ผ๋ก ๋ถ์กฑํ ๋ํญ 0.22%p๋ฅผ ์ค์ด๊ธฐ ์ํด ์๊ด๋ cap, ์๋ณ ์์ค ์ดํ ์ฌ์ง์
์ ํ, ๋ณ๋์ฑ ์์ฐํ target selection์ ๊ฒฐํฉํ๋ ์ชฝ์
๋๋ค.
2026-05-18 sector map cache follow-up: DataCollector.get_sector_map()์ FDR/KRX KIND/pykrx ์
์ข
๋งคํ์ ์ฑ๊ณต์ ์ผ๋ก ์ฝ์ผ๋ฉด reports/sector_map_cache.json์ schema v1 ์บ์๋ฅผ ์ ์ฅํ๊ณ , ์ค์๊ฐ ์์ค๊ฐ ๋ชจ๋ ๋น์ด ์์ผ๋ฉด ํด๋น ์บ์๋ฅผ fallback์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์ต์ ์บ์๋ KRX KIND ๊ธฐ์ค 2,766๊ฐ ์ข
๋ชฉ์ด๋ฉฐ, target-weight sector cap plan์ ์บ์๊ฐ ์๋๋ผ๋ planning universe ์ ์ฒด ์นํฐ๊ฐ ๋งคํ๋์ง ์์ผ๋ฉด target_weight_sector_map_incomplete๋ก fail-closed ์ฐจ๋จํฉ๋๋ค. KRX KIND๊ฐ ์ฐ์ ์ฃผ ์นํฐ๋ฅผ ์ง์ ์ฃผ์ง ์๋ ๊ฒฝ์ฐ์๋ 005935 โ 005930์ฒ๋ผ ๊ฐ์ 5์๋ฆฌ stem์ ๋ณดํต์ฃผ ์นํฐ๋ฅผ ์ถ๋ก ํ๊ณ diagnostics์ sector_map_inferred_symbols์ ๊ธฐ๋กํฉ๋๋ค. no-order --daily-ops-summary/--readiness-audit๋ sector map blocker๋ฟ ์๋๋ผ FDR/yfinance/KIS fallback ๋นํ์ฑํ๋ก ์ธํ ๊ฐ๊ฒฉ ์์ง ์คํจ๋ traceback ๋์ BLOCKED failure artifact๋ก ๋จ๊น๋๋ค.
2026-05-13 correlation cap follow-up: target selection ๋จ๊ณ์ max_pairwise_correlation, correlation_lookback_days, correlation_min_periods๋ฅผ ์ถ๊ฐํด ์ด๋ฏธ ์ ํ๋ ์ข
๋ชฉ๊ณผ์ ๊ณผ๊ฑฐ ์์ต๋ฅ ์๊ด์ด ์๊ณ๊ฐ์ ๋๋ ํ๋ณด๋ฅผ ๊ฑด๋๋ฐ๋๋ก ํ์ต๋๋ค. target_weight_drawdown_guard --top-n 200์์๋ corrcap85์ sectorcap2_corrcap85๊ฐ canonical ํ๊ฐ ๋์์ ํฌํจ๋๊ณ ๊ด์ธก ์ต๋ ์ ํ ์๊ด๋๋ 0.8147๋ก ์ ํ๋์ง๋ง, return/MDD/turnover๋ ๊ฐ๊ฐ ๊ธฐ์กด tol4 ๋ฐ sectorcap2์ ๋์ผํ์ต๋๋ค. corrcap80์ ๊ด์ธก ์๊ด๋๋ฅผ 0.7675๊น์ง ๋ฎ์ท์ง๋ง return=+70.22%, raw excess=+38.33%, MDD=-19.33%, turnover/year=908.3%์์ benchmark excess Sharpe<=0์ผ๋ก ์ ์ธ๋์ต๋๋ค. canonical top-20์์๋ corrcap85๋ MDD=-20.25%, sectorcap2_corrcap85๋ MDD=-20.22%๋ก ๊ธฐ์กด ํ๋ณด์ ๊ฐ์ paper_only์
๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก 0.85 ๋จ์ pairwise cap์ ๋๋ฌด ๋์จํ๊ณ , 0.80 ๋จ๋
cap์ alpha๋ฅผ ๊น์ผ๋ฏ๋ก ๋ค์์ ์๊ด๋ penalty๋ฅผ ๋ญํน ์ ์์ ์ง์ ์๊ฑฐ๋ ๋ณ๋์ฑ ์์ฐ/์์ค ํ ์ฌ์ง์
์ ํ๊ณผ ๊ฒฐํฉํด์ผ ํฉ๋๋ค.
2026-05-13 correlation rank penalty follow-up: ๋จ์ hard cap ๋์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ์์ ์ score_row์ ํ๊ท ์์ ์๊ด๋ ๊ธฐ๋ฐ correlation_rank_penalty_weight๋ฅผ ์ฐจ๊ฐํ๋ ํ๋ณด๋ฅผ ์ถ๊ฐํ์ต๋๋ค. top-200 target_weight_drawdown_guard์์๋ sectorcap2_corrpen05๊ฐ return=+84.22%, raw excess=+52.33%p, MDD=-19.59%, turnover/year=912.5%, corrpen10์ด return=+83.50%, raw excess=+51.61%p, MDD=-19.96%, turnover/year=892.3%, corrpen05๊ฐ return=+82.82%, raw excess=+50.93%p, MDD=-19.33%, turnover/year=889.9%๋ก ๋ชจ๋ canonical ํ๋ณด์ ํฌํจ๋์ต๋๋ค. ํ์ง๋ง canonical top-20์์๋ corrpen05 return=+141.09%, benchmark excess=-8.30%p, MDD=-20.25%, corrpen10 return=+128.43%, benchmark excess=-20.96%p, MDD=-20.25%, sectorcap2_corrpen05 return=+143.11%, benchmark excess=-6.28%p, MDD=-20.22%๋ก ๋ชจ๋ paper_only์
๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ํ๊ท ์๊ด๋ ์ ์ ์ฐจ๊ฐ์ top-200์์๋ ๋ถ์ฐ ๊ฐ์ ์ ํธ๊ฐ ์์์ง๋ง ๋ํ์ฃผ canonical alpha๋ฅผ ํฌ๊ฒ ๊น์ ์ด์ ์น๊ฒฉ์๋ ๋ถ์ ํฉํฉ๋๋ค. ๋ค์์ ์ ์ ์ฐจ๊ฐ๋ณด๋ค ์์ค ํ ์ฌ์ง์
์ ํ์ด๋ ๋ณ๋์ฑ ์์ฐํ target selection์ฒ๋ผ ๋ํญ์ ์ง์ ๊ฒจ๋ฅํ๋ ์ ์ฝ์ ์ฐ์ ํฉ๋๋ค.
2026-05-13 loss re-entry guard follow-up: ์ง์ ์คํ ๋ฆฌ๋ฐธ๋ฐ์ค ํ ํ๊ฐ NAV ๋๋น ์์ค๋ฅ ์ด loss_reentry_guard_trigger_pct๋ฅผ ๋์ผ๋ฉด ์ง์ cooldown ๋์ ์ ๊ท ํธ์
์๋ฅผ loss_reentry_guard_max_new_targets๋ก ๋ฎ์ถ๋ ์ต์
์ ์ถ๊ฐํ์ต๋๋ค. target_weight_drawdown_guard --top-n 200์ reentry4_maxnew0_cd1, reentry3_maxnew0_cd1, sectorcap2_reentry4_maxnew0_cd1 ํ๋ณด๋ฅผ ์ถ๊ฐํ์ง๋ง, ์์ค ์งํ ์ ์ข
๋ชฉ ํธ์
์ ๋ง๋ ๋ฐฉ์์ ํ์ ์จ๋ง ๋ฎ์ถ๊ณ MDD๋ฅผ ์
ํ์์ผฐ์ต๋๋ค. sectorcap2_reentry4๋ return=+84.68%, raw excess=+52.79%p, turnover/year=793.8%์์ง๋ง MDD=-22.34%, reentry4๋ return=+57.71%, MDD=-27.29%, reentry3์ return=+28.93%, MDD=-35.30%๋ก ๋ชจ๋ paper_only๋ผ canonical ํ๊ฐ ๋์์์ ์ ์ธํ์ต๋๋ค. ๋ค์์ ๋ณด์ ์ข
๋ชฉ ๊ณ ์ฐฉ์ ๋ง๋๋ ์ ๊ท ํธ์
์ฐจ๋จ๋ณด๋ค, ์ข
๋ชฉ๋ณ ๋ณ๋์ฑ ์์ฐ์ด๋ ํฌ์ง์
๋ณ ์์ /๊ฐ์ฐ์ฒ๋ผ ์์ค ์์ธ์ ์ง์ ์ค์ด๋ ์ ์ฝ์ด ์ฐ์ ์
๋๋ค.
2026-05-13 position loss reduction follow-up: ์ ๊ท ํธ์
์ ๋ง์ ์์ค ์ข
๋ชฉ์ ๊ณ ์ฐฉ์ํค๋ ๋์ , ์ง์ ํ์ ์ข
๊ฐ ๊ธฐ์ค ๋ณด์ ์ข
๋ชฉ ์์ค๋ฅ ์ด position_loss_reduce_trigger_pct๋ฅผ ๋์ผ๋ฉด ๋ค์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ๋ชฉํ ๊ธ์ก์ position_loss_reduce_target_fraction๊น์ง ๊ฐ์ฐํ๋ ์ต์
์ ์ถ๊ฐํ์ต๋๋ค. ๊ฐ์ฐ ๋งค๋๋ ๊ธฐ์กด ๋น์ฉ/PnL/turnover ๊ฒฝ๋ก๋ฅผ ๊ทธ๋๋ก ํ๋ฉฐ, ๋ฆฌ๋ฐธ๋ฐ์ฑ tolerance ๋๋ฌธ์ ์ํ ๊ฐ์ฐ์ด ์๋ต๋์ง ์๋๋ก ๋ถ๋ฆฌํ์ต๋๋ค. ์ค๋ฐ์ดํฐ target_weight_drawdown_guard --top-n 200 full sweep์์๋ sectorcap2_posloss8 ํ๋ณด๊ฐ return=+105.79%, raw excess=+73.90%p, MDD=-18.96%, Sharpe=1.00์ผ๋ก ํต๊ณผํ์ง๋ง canonical์์๋ turnover/year=1006.2%๋ก paper_only์์ต๋๋ค. ํ์์ผ๋ก tol5๋ฅผ ๊ฒฐํฉํ์ target_weight_rotation_top5_60_120_floor0_exp75_rankrisk90_tol5_sectorcap2_posloss8_frac50_pdd10_floor40_cd1๊ฐ top-200 return=+112.16%, raw excess=+80.27%p, MDD=-19.23%, Sharpe=1.04๋ก ํต๊ณผํ๊ณ , canonical top-20์์๋ return=+198.15%, benchmark excess=+48.76%p, Sharpe=1.57, PF=5.58, MDD=-17.18%, turnover/year=993.9%, WF positive/Sh+=100%๋ก ์ ๊ท provisional_paper_candidate๊ฐ ๋์ต๋๋ค. ๋จ live๋ ์ฌ์ ํ 60์ผ paper evidence์ target-weight verified proof๊ฐ ์์ด ์ฐจ๋จ๋ฉ๋๋ค. core.target_weight_rotation.build_target_weight_plan()์ paper/pilot plan์์๋ rank_penalty_mode=downside_risk, max_targets_per_sector, position_loss_reduce_*, portfolio_drawdown_guard_*๋ฅผ ์ ์ฉํ๊ณ , sector map ๋๋ฝ ๋๋ drawdown guard ๋ช
์ ์ํ ๋๋ฝ์ fail-closed๋ก ๋ง์ต๋๋ค. pilot adapter๋ ๊ธฐ์กด paper evidence์ total NAV, peak, guard cooldown์ ์ํ๋ก ๋ณต์ํ๋ฉฐ evidence snapshot์๋ guard ๊ฒฐ๊ณผ๋ฅผ ๋จ๊ฒจ ๋ค์ ๋ฆฌ๋ฐธ๋ฐ์ฑ์ cooldown์ ์ด์ด๊ฐ๋๋ค.
2026-05-13 volatility budget target selection follow-up: ์ ํ ์ข
๋ชฉ์ ์ ์งํ๋ ๋ชฉํ ๊ธ์ก์ ๋์ผ๊ฐ์ค์ด ์๋๋ผ rolling ์คํ ๋ณ๋์ฑ์ ์ญ์๋ก ๋ฐฐ๋ถํ๋ target_allocation_mode=inverse_volatility๋ฅผ target-weight research backtester์ ์ถ๊ฐํ์ต๋๋ค. allocation_vol_lookback_days, allocation_vol_min_periods, allocation_vol_floor_pct, allocation_max_sleeve_weight_pct๋ฅผ artifact metrics์ ๋จ๊น๋๋ค. ์ค๋ฐ์ดํฐ target_weight_volatility_budget --top-n 200 full sweep์์๋ canonical liquidity 200๊ฐ ์ค ์ ๋์ฑ ํต๊ณผ 164๊ฐ, benchmark coverage 100%์์ best=target_weight_rotation_top5_60_120_floor0_exp75_rankrisk90_tol4_pdd10_floor40_cd1_volbudget60_cap35๊ฐ return=+78.77%, raw excess=+46.88%p, exposure-matched excess=+63.79%p, avg exposure=55.2%, Sharpe=0.81, PF=1.96, MDD=-18.96%, trades=107๋ก provisional_paper_candidate๊ฐ ๋์ต๋๋ค. sectorcap2+volbudget60 ํ๋ณด๋ return=+77.18%, raw excess=+45.29%p, MDD=-19.19%๋ก ํต๊ณผํ๊ณ , volbudget90 ํ๋ณด๋ benchmark excess Sharpe<=0 ๋ณ๋ชฉ์ด๋ผ ์ ์ธํ์ต๋๋ค. ํ์ง๋ง tools/evaluate_and_promote.py --canonical ์ฌํ๊ฐ์์๋ volbudget60 ํ๋ณด๊ฐ return=+170.73%, benchmark excess=+21.34%p, Sharpe=1.44, PF=4.53, turnover/year=982.6%, WF positive/Sh+=100%์์ง๋ง MDD=-20.82%๋ก paper_only์
๋๋ค. sectorcap2+volbudget60๋ return=+173.80%, benchmark excess=+24.41%p, Sharpe=1.46, PF=4.68, turnover/year=978.1%, WF positive/Sh+=100%์์ง๋ง MDD=-20.89%๋ผ paper_only์
๋๋ค. ๋ณ๋์ฑ ์์ฐ์ ํ์ ์จ๊ณผ ์ด๊ณผ์์ต์ ์ ์งํ์ง๋ง ๋ํ์ฃผ canonical MDD๊ฐ ๋ ์
ํ๋์ผ๋ฏ๋ก paper/live ์ ํ ๋์์ ์๋๋ฉฐ, research-only ๋ฐฐ๋ถ ๋ก์ง์ด๋ฏ๋ก ํฅํ ํต๊ณผ ํ๋ณด๊ฐ ๋ค์ ์๊ธฐ๋ฉด paper pilot ์ core.target_weight_rotation plan builder์ ๊ฐ์ ๋ฐฐ๋ถ ์ฐ์์ ์ด์ํ๊ณ params_hash ์ผ์น๊น์ง ๊ฒ์ฆํด์ผ ํฉ๋๋ค. ๋ค์ ์ฐ๊ตฌ๋ ๋ชฉํ๋น์ค ๋ฐฐ๋ถ๋ณด๋ค ํฌ์ง์
๋ณ ์์ค ๊ฐ์ฐ ๋๋ ๋ ๋ณด์์ ์ธ drawdown guard๋ฅผ ๊ฒฐํฉํด MDD๋ฅผ -20% ์์ชฝ์ผ๋ก ์์ ํํ๋ ๋ฐฉํฅ์
๋๋ค.
2026-05-13 research empty-universe guard: canonical universe ๋ชฉ๋ก ์กฐํ ์คํจ, ๋ฐ์ดํฐ ์์ง ์คํจ, strict ์ ๋์ฑ ํํฐ ๋๋ฌธ์ research universe๊ฐ 0๊ฐ๊ฐ ๋๋ฉด ํ๋ณด๋ณ 0% ์ฑ๊ณผ๋ฅผ ๋ง๋ค์ง ์๊ณ benchmark/candidate ํ๊ฐ๋ฅผ ๊ฑด๋๋ฐ๋๋ก ๋ณด๊ฐํ์ต๋๋ค. artifact์ Markdown์๋ INSUFFICIENT_BENCHMARK_DATA, empty_universe_reason, selection_error, skipped_due_to_data๊ฐ ๋จ์ ๋ฐ์ดํฐ ๋ฌธ์ ๋ฅผ ์ ๋ต ์ฑ๊ณผ๋ก ์คํดํ์ง ์๊ฒ ํฉ๋๋ค.
| ์ ๋ต | ์ํ | Ret% | PF | WF P% | WF Sh+% | Paper Status |
|---|---|---|---|---|---|---|
| relative_strength_rotation | provisional_paper_candidate | +18.09 | 1.62 | 100 | 83.3 | โ |
| target_weight_rotation_top5_60_120_floor0_exp75_rankrisk90_tol5_sectorcap2_posloss8_frac50_pdd10_floor40_cd1 | provisional_paper_candidate (default capped pilot) | +198.15 | 5.58 | 100 | 100 | ์ ์ฉ paper/pilot adapter ๊ธฐ๋ณธ ํ๋ณด, 60์์ ์ผ verified pilot evidence ํ์ |
| target_weight_rotation_top5_60_120_floor0_hold3_risk60_35 | provisional_paper_candidate (previous default) | +171.20 | 4.24 | 100 | 83.3 | ์ด์ ๊ธฐ๋ณธ ํ๋ณด, ๊ด์ฐฐ ์ ์ง |
| scoring | paper_only | +11.22 | 1.07 | 83.3 | 50.0 | risk-adjusted alpha ๋ฏธ๋ฌ |
| breakout_volume | disabled (research_only) | -13.31 | 0.79 | 0 | 0 | โ |
| mean_reversion | disabled (research_only) | -8.36 | 0.85 | 33.3 | 0 | โ |
| trend_following | disabled (research_only) | -6.94 | 0.67 | 16.7 | 0 | โ |
| ensemble | disabled (research_only) | โ | โ | 0 | 0 | โ |
์ค์ ํฌ์
์ ์๋ ๋ฐฑํ
์คํธ, ๊ฒ์ฆ, ๋ชจ์ํฌ์๋ฅผ ์ถฉ๋ถํ ๊ฑฐ์น ๋ค ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
ํ์ฌ scoring์ ๊ด์ฐฐ์ฉ paper_only๋ก ๊ฐ๋ฑ๋์์ต๋๋ค. ์ ๊ท ์ฐ์ ์คํ์ risk-adjusted ๊ธฐ์ค์ ํต๊ณผํ ํ๋ณด๋ง ๋์์ผ๋ก ํ๋ฉฐ, Paper Evidence ์ฒด๊ณ๋ก ์น๊ฒฉ/๊ฐ๋ฑ ๊ทผ๊ฑฐ๋ฅผ ์๋ ์์งํฉ๋๋ค.
Paper ์ด์ ๋๊ตฌ: tools/run_paper_evidence_pipeline.py (backfill/finalize/package), tools/paper_preflight.py, tools/paper_launch_readiness.py, tools/paper_pilot_control.py, tools/paper_runtime_status.py, tools/research_candidate_sweep.py, tools/target_weight_rotation_pilot.py. tools/paper_pilot_control.py์ tools/paper_runtime_status.py์ ์ํ ๋ณ๊ฒฝ/์กฐํ ์ก์
์ต์
์ ํ ๋ฒ์ ํ๋๋ง ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํ์ฑํ์ ๋นํ์ฑํ์ฒ๋ผ ์๋ก ๋ค๋ฅธ ์ก์
์ ๊ฐ์ ๋ช
๋ น์ ์์ผ๋ฉด ํ์ผ ๊ธฐ๋ก์ด๋ ๋ฐํ์ ์ํ ์กฐํ๋ฅผ ์งํํ์ง ์๊ณ ์ฆ์ ์คํจํฉ๋๋ค. tools/paper_preflight.py์ tools/paper_launch_readiness.py๋ ์ ๊ฒ ๋์์ --strategy ๋๋ --all ์ค ํ๋๋ง ํ์ฉํ๋ฉฐ, ๋ ์ต์
์ ํจ๊ป ๋๊ธฐ๋ฉด DB ์ด๊ธฐํ๋ ์ด์ artifact ์์ฑ ์ ์ ์ฆ์ ์คํจํฉ๋๋ค. preflight CLI๋ overall fail ๋๋ entry ์ฐจ๋จ ๊ฒฐ๊ณผ๋ฅผ non-zero๋ก ๋ฐํํ๊ณ , launch readiness CLI๋ READY๊ฐ ์๋๋ฉด non-zero๋ก ์ข
๋ฃํฉ๋๋ค. readiness ๋ฆฌํฌํธ๋ง ๋ง๋ค๊ณ ์ถ์ ๋๋ง --report-only๋ฅผ ์ฌ์ฉํฉ๋๋ค. tools/paper_bootstrap.py๋ ๋น watchlist, ๋น/์ญ์ ๋ ์ง ๋ฒ์, ์์ฒญ์ผ canonical evidence ๋ฏธ์์ฑ ์ํ๋ฅผ incomplete๋ก ๋ณด๊ณ non-zero ์ข
๋ฃํฉ๋๋ค. target-weight ํ๋ณด๋ capped pilot ์น์ธ ์ tools/target_weight_rotation_pilot.py --record-shadow-evidence, --shadow-days 3, ๋๋ --shadow-start-date YYYY-MM-DD --shadow-end-date YYYY-MM-DD๋ก dry-run plan artifact, shadow readiness evidence, launch readiness artifact, plan ๊ธฐ๋ฐ cap ์ถ์ฒ๊ณผ enable ๋ช
๋ น์ด ํฌํจ๋ pilot runbook์ ๋จผ์ ๋์ ํฉ๋๋ค. ์ดํ --readiness-audit๋ก ์ฃผ๋ฌธ ์ ์ถ์ด๋ shadow/pilot evidence ๊ธฐ๋ก ์์ด clean shadow, launch readiness, active pilot caps, ์ค๋ณต ์ธ์
, ์คํ์ผ/์ฅ ์๊ฐ, ์คํ ์ ํฌ์ง์
๋๋ฆฌํํธ, ์ข
๋ชฉ/๋ฒค์น๋งํฌ ๊ฐ๊ฒฉ ์ต์ ์ฑ, ์ถ์ฒ cap ์ถฉ์กฑ ์ฌ๋ถ, ์ต๊ทผ ํ๊ท ๊ฑฐ๋๋๊ธ ๋๋น ์ฃผ๋ฌธ ๋น์จ, ๋น์ฉ ๋ฐ์ ํ ํ๊ธ/ํฌ์๋น์ค ํ๋๋ฅผ JSON artifact์ Markdown ์ด์ ๋ฆฌํฌํธ๋ก ์ ๊ฒํฉ๋๋ค. ์ ๋์ฑ preflight๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ๋ฌธ๋ณ 20์ผ ํ๊ท ๊ฑฐ๋๋๊ธ์ 5% ์ด๊ณผ๋ฅผ ์ฐจ๋จํ๋ฉฐ --max-order-adv-pct๋ก ์กฐ์ ํ ์ ์์ต๋๋ค. pre-trade risk ๊ฒ์ฆ์ ์ฃผ๋ฌธ๋ณ ์์๋ฃ/์ธ๊ธ/๋์ ์ฌ๋ฆฌํผ์ง๋ฅผ ๋ฐ์ํ ์์ ์ฒด๊ฒฐ๊ฐ๋ก ํ๊ธ ๋ถ์กฑ, ์ต์ ํ๊ธ๋น์ค, ์ดํฌ์๋น์ค, ์ข
๋ชฉ๋ณ ๋น์ค, ์ต๋ ๋ณด์ ์ข
๋ชฉ ์ ์๋ฐ์ ์คํ ์ ์ ์ฐจ๋จํฉ๋๋ค. Markdown ๋ฆฌํฌํธ์๋ shadow ์์ง, audit ์ฌ์คํ, ์ถ์ฒ cap ์น์ธ, capped paper ์คํ ๋ช
๋ น์ด ํจ๊ป ๊ธฐ๋ก๋ฉ๋๋ค. --shadow-days N์ ํด์ฅ/๋ฐ์ดํฐ ๊ณต๋ฐฑ์ผ๋ก ๊ฐ์ ๊ฑฐ๋์ผ์ ๋งคํ๋๋ ๊ฒฝ์ฐ ๊ณผ๊ฑฐ ํ์ผ์ ์ถ๊ฐ ์ค์บํด N๊ฐ ๊ณ ์ resolved trade_day ์ถฉ์กฑ์ ๋ชฉํ๋ก ํ๋ฉฐ, ๋ชฉํ ๋ฏธ๋ฌ์ด๋ ๋ ์ง๋ณ ์คํจ๊ฐ ์์ผ๋ฉด CLI๊ฐ non-zero๋ก ์ข
๋ฃํด ์๋ํ๊ฐ ๋ถ์์ ํ ์ฆ๊ฑฐ๋ฅผ ์ฑ๊ณต์ผ๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ๊ฒ ํฉ๋๋ค. ์คํํ pilot evidence๋ ๊ฐ์ candidate/trade_day์ ๊ธฐ์กด pilot session artifact๊ฐ ์๊ณ , run_pilot ์ ๊ฒ๊ณผ execute_plan ์ฃผ๋ฌธ ์ ์ถ ์ง์ ์ฌํ์ธ์์ ์ค์ paper position์ด ๊ณํ ์
๋ ฅ ์ฅ๋ถ position_quantities_before์ ๋ชจ๋ ์ผ์นํ๋ฉฐ, plan.trade_day๊ฐ KST ์คํ์ผ๊ณผ ์ผ์นํ๊ณ KRX ์ ๊ท์ฅ ์ฃผ๋ฌธ ๊ฐ๋ฅ ์๊ฐ์ธ ๊ฒฝ์ฐ์๋ง ์งํ๋ฉ๋๋ค. ์ดํ ์ ๋์ฑ preflight์ pre-trade risk ๊ฒ์ฆ์ ํต๊ณผํ๊ณ , ๋ชจ๋ ๊ณํ ์ฃผ๋ฌธ์ด ์ฑ๊ณตํ๋ฉฐ, ์ฑ๊ณต ์ฃผ๋ฌธ ๊ฒฐ๊ณผ์ ๋น์ผ TradeHistory fill ์ง๊ณ์ ์ข
๋ชฉ/๋ฐฉํฅ/์๋์ด ๊ณํ๊ณผ ์ผ์นํ๊ณ , ์คํ ํ ์ค์ paper position ์ ์ฒด๊ฐ ๋ฆฌ๋ฐธ๋ฐ์ฑ ํ target_quantities_after ์ฅ๋ถ์ ์ผ์นํ๊ณ ๊ณํ ๋ฐ ์์ ํฌ์ง์
์ด ์์ ๋๋ง pilot_paper๋ก ์์ง๋ฉ๋๋ค. ๊ฐ์ ๋ ์ง evidence๊ฐ ์ด๋ฏธ ์์ผ๋ฉด ์ต์ canonical record๋ pilot_paper/authorized/target-weight complete/execution-market-session-allowed/liquidity-complete/pre-trade-risk-complete/fill-complete ์กฐ๊ฑด์ ํต๊ณผํด์ผ ์ฌ์ฌ์ฉํฉ๋๋ค. ์ค๋ณต ์คํ์ ๊ธฐ๋ณธ ์ฐจ๋จํ๋ฉฐ ์ด์์๊ฐ ๋ช
์์ ์ผ๋ก ์ฌ์๋ํด์ผ ํ ๋๋ง --allow-rerun์ ์ฌ์ฉํฉ๋๋ค. ๋ถ๋ถ ์คํ/์ค๋จ/์ค๋ณต ์คํ/์ฃผ๋ฌธ ๊ฒฐ๊ณผ ๋ถ์ผ์น/์ฒด๊ฒฐ ๊ธฐ๋ก ๋ถ์ผ์น/๊ธฐ์กด evidence ๊ฒ์ฆ ์คํจ/์คํ์ผ ๋ถ์ผ์น/์ฅ ์๊ฐ ์ธ ์คํ/์คํ ์ ํฌ์ง์
๋๋ฆฌํํธ/์ ๋์ฑ preflight ์คํจ/pre-trade risk ์คํจ/์คํ ํ ํฌ์ง์
๋ถ์ผ์น๋ execution-backed ์น๊ฒฉ ์ฆ๊ฑฐ์์ ์ ์ธ๋ฉ๋๋ค.
Target-weight 60์์
์ผ pilot manifest: --readiness-audit๋ ์ด์ ๋ฆฌํฌํธ์ ํจ๊ป target_weight_paper_experiment_manifest_*.json์ ์์ฑํด ํ๋ณด snapshot, ์ถ์ฒ cap, ์ฐจ๋จ ์ฌ์ , ์คํ ๋ช
๋ น, ๋ฐ์ดํฐ ํ์ง ์ง๋จ, ์น๊ฒฉ ์ฆ๊ฑฐ ์กฐ๊ฑด์ ๊ณ ์ ํฉ๋๋ค. --daily-ops-summary๋ readiness, risk check, ๋ฐ์ดํฐ ํ์ง, ์คํ์ผ ์ผ์น ์ฌ๋ถ, ์ฅ ์๊ฐ ์ฃผ๋ฌธ ๊ฐ๋ฅ ์ฌ๋ถ, verified pilot day ์งํ๋ฅ , ๋ค์ ์คํ ๋ช
๋ น์ target_weight_daily_ops_summary_*.json/.md๋ก ๋ฌถ์ด ๋งค์ผ ์ด์ ํ๋จ์ ํ ๋ฒ์ ํ์ธํ๊ฒ ํฉ๋๋ค. ๋น์ผ pilot_paper ์ฆ๊ฑฐ๊ฐ ์ด๋ฏธ ๊ธฐ๋ก๋๊ฑฐ๋ ๋ณต๊ตฌ ๋ณด์กด๋ ๊ฒฝ์ฐ์๋ summary ์์ฒด์๋ not_before_date์ premature_run_guard=target_weight_future_as_of_date_blocked๋ฅผ ๋จ๊ฒจ current_blockers.json์ด ๋ฆ๊ฒ ๊ฐฑ์ ๋ผ๋ ๋ค์ KRX ์์
์ผ ์ ์ฌ์คํ์ ๋ง์ต๋๋ค. ๋ no-order ๋ช
๋ น์ sector map, stale benchmark, ๊ฐ๊ฒฉ ๋ฐ์ดํฐ, FDR/yfinance/KIS fallback ๋นํ์ฑํ ๊ฐ์ plan ์์ฑ blocker๋ก ๋งํ๋ traceback ๋์ target_weight_daily_ops_summary_failure_*.json/.md ๋๋ target_weight_readiness_audit_failure_*.json/.md๋ฅผ ๋จ๊ธฐ๋ฉฐ, ํด๋น failure artifact์๋ status=BLOCKED, ์์ธ, ์ฌ์คํ ๋ช
๋ น, orders_submitted=false๊ฐ ๊ณ ์ ๋ฉ๋๋ค. READY_TO_EXECUTE์ WAITING_FOR_MARKET_SESSION์ ์คํ์ผ/์ฅ ์๊ฐ ์ ๊ฒ๊ณผ pilot authorization snapshot์ด ์ค์ checked=True๋ก ํต๊ณผํ ๊ฒฝ์ฐ์๋ง ํ์ํ๋ฉฐ, ๋ฏธ์ ๊ฒ ํญ๋ชฉ์ NOT CHECKED๋ก ๋จ๊ฒจ cap ์น์ธ ์ค๋น์ ์คํ ์ค๋น๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. daily ops/readiness/manifest์ ์คํ ๋ช
๋ น์ READY_TO_EXECUTE๊ฐ ์๋ ๋ # blocked: ์ฃผ์ ๋ช
๋ น์ผ๋ก ๊ณ ์ ํด cap ์น์ธ ์ ์ด๋ blocker ํด์ ์ paper ์คํ์ ์ด์ ๋ฆฌํฌํธ๊ฐ ์ ๋ํ์ง ์๊ฒ ํฉ๋๋ค. reports/current_blockers.json๋ schema v3๋ถํฐ operator_runbook๊ณผ next action๋ณ command/order_safety๋ฅผ ํฌํจํด check-only โ daily ops summary โ readiness audit โ READY_TO_EXECUTE ๋น์ผ capped paper evidence ์์ง ์์๋ฅผ ๊ณ ์ ํฉ๋๋ค. ์ต์ daily ops summary๊ฐ ์์ผ๋ฉด current blockers์ 1์์๋ ๋จผ์ daily ops summary ์์ฑ์ด๊ณ , ์ต์ summary๊ฐ ์์ผ๋ฉด shadow 3์ผ ์์ง, Discord test preflight, ์ถ์ฒ cap ์น์ธ, READY_TO_EXECUTE ์คํ ์ค ํ์ฌ ์ํ์ ๋ง๋ ๋ช
๋ น์ผ๋ก ์๋ ์ ๋ ฌ๋ฉ๋๋ค. Discord webhook ๋ฏธ์ค์ blocker๋ DISCORD_WEBHOOK_URL ์ค์ ์ด ๋จผ์ ํ์ํ ์ก์
์ผ๋ก ํ์ํ๊ณ , READY ์ํ๊ฐ ์๋ ์ต์ summary์ ์คํ ๋ช
๋ น์ current blockers์์๋ # blocked:๋ก๋ง ๋
ธ์ถ๋ฉ๋๋ค. preflight์ pilot runbook๋ target-weight ํ๋ณด์์๋ generic paper evidence pipeline ๋์ target_weight_rotation_pilot.py --shadow-days, --daily-ops-summary, --readiness-audit, Discord --send-test-notification ๊ฒฝ๋ก๋ฅผ ์ฐ์ ์๋ดํฉ๋๋ค. ๊ณต์ reports/paper_experiment_manifest.json๋ ๊ธฐ์กด scoring 60์์
์ผ ์คํ๊ณผ target-weight capped paper pilot์ ๋ถ๋ฆฌํด ๊ธฐ๋กํฉ๋๋ค.
Target-weight cash override ์ ์ฑ
: --cash๋ dry-run ๊ณํ ๊ฒํ ์ shadow bootstrap ๋ณด์กฐ ์
๋ ฅ์๋ง ์ฌ์ฉํฉ๋๋ค. --readiness-audit, --daily-ops-summary, --execute, --collect-evidence์์๋ ์ค์ paper ๊ณ์ข ํ๊ธ๊ณผ ์คํ ์ง์ ํฌ์ง์
์ ๊ธฐ์ค์ผ๋ก๋ง ํ๋จํ๋ฉฐ, --cash๊ฐ ๊ฐ์ด ๋ค์ด์ค๋ฉด CLI์ ํจ์ ํธ์ถ ๋ชจ๋ target_weight_cash_override_blocked๋ก fail-closed ์ฐจ๋จํฉ๋๋ค. --collect-evidence๋ ๋ฐ๋์ --execute์ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ฉฐ, ๋จ๋
์ฆ๊ฑฐ ์์ง ์์ฒญ์ target_weight_collect_evidence_requires_execute๋ก ์ฐจ๋จํฉ๋๋ค.
Generic paper entry๋ ๋์ผํ ์คํ ๊ฒฝ๊ณ ์์น์ ๋ฐ๋ฅธ๋ค. main.py --mode paper, scheduler auto-entry, fixed-quantity paper BUY ๋ชจ๋ preflight status์ runtime state๋ฅผ ์ฃผ๋ฌธ ์์ฑ ์ ์ ํ์ธํ๊ณ , ํ์ธ ์คํจ๋ fail-closed๋ก ์ฐจ๋จํ๋ค. blocked runtime์์ pilot authorization์ด ํ์ฑํ๋์ด๋ check_pilot_entry()๋ฅผ ๋ค์ ํต๊ณผํด์ผ ํ๋ฉฐ, pilot ์ด๋
ธ์ถ cap์ ํ์ฌ ๋
ธ์ถ๋ฟ ์๋๋ผ ์ด๋ฒ ์ฃผ๋ฌธ ํ ์์ ๋
ธ์ถ๊น์ง ๊ธฐ์ค์ผ๋ก ๊ฒ์ฌํ๋ค. SELL/exit ๊ฒฝ๋ก๋ ํฌ์ง์
์ ๋ฆฌ๋ฅผ ์ํด ๊ณ์ ํ์ฉํ๋ค. ์ด์ ์์ค ํ๋๋ ๊ฐ์ ์์น์ ๋ฐ๋ฅธ๋ค. risk_params.yaml:drawdown.max_portfolio_mdd ๋๋ max_daily_loss์ ๋ฟ์ผ๋ฉด ์ ๊ท BUY๋ง fail-closed๋ก ์ฐจ๋จํ๊ณ , ์์ ยทํธ๋ ์ผ๋งยท์๋ ์ฒญ์ฐ SELL์ ๊ณ์ ์ด์ด ๋๋ค. pilot evidence freshness๋ ๋ฌ๋ ฅ์ผ์ด ์๋๋ผ ์ฃผ๋ง๊ณผ ํ๊ตญ์ฅ ํด์ฅ์ผ์ ์ ์ธํ ์์
์ผ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํฉ๋๋ค.
Target-weight pilot ์น์ธ/์ฌ์๋ ๋ณด๊ฐ: tools/paper_pilot_control.py --enable์ reports/promotion/run_metadata.json์ canonical strategy_specs[].base_strategy=target_weight_rotation์ ์ฐ์ ๊ธฐ์ค์ผ๋ก target-weight ํ๋ณด๋ฅผ ์๋ณํ๊ณ , ๊ธฐ์กด target_weight_* ์ ๋์ด๋ ํธํ fallback์ผ๋ก๋ง ์ฌ์ฉํฉ๋๋ค. pilot auth๋ฅผ ์ฐ๊ธฐ ์ target-weight readiness audit์ ๋ค์ ์คํํด ์ด์์๊ฐ ์์ฒญํ cap์ด ํ์ฌ plan, launch readiness, ์ ๋์ฑ preflight, ๋น์ฉ ๋ฐ์ pre-trade risk๋ฅผ ๋ง์กฑํ๋์ง ๊ฒ์ฆํฉ๋๋ค. ์ด๋ ์์ฒญ cap์ audit์ cap_recommendation.suggested_caps์ ์ ํํ ์ผ์นํด์ผ ํ๋ฏ๋ก, ํต๊ณผ ๊ฐ๋ฅํ ๋ ํฐ cap์ผ๋ก pilot์ ์ฌ๋ ๊ฒฝ๋ก๋ ์ฐจ๋จ๋ฉ๋๋ค. ์น์ธ auth์๋ ๋น์ plan์ trade_day, as_of_date, params_hash, targets, ์์/๋ชฉํ ์๋ snapshot์ ํจ๊ป ์ ์ฅํด cap ์น์ธ๊ณผ ์คํ ๊ณํ์ ๋ฌถ์ต๋๋ค. ์ ๋์ฑ diagnostics๊ฐ ์์ผ๋ฉด fail-closed๋ก ์ฐจ๋จํ๊ณ , ์ด๋ฏธ ์ฃผ๋ฌธ์ด ์๋ฃ๋ same-candidate/trade-day ์ธ์
์ --allow-rerun์ ์ค๋ ์ฌ์คํํ์ง ์์ต๋๋ค. --execute๋ ์ฃผ๋ฌธ ์ ์ถ ์ ๊ฐ์ candidate/trade_day์ atomic .lock์ ์ ์ ํ๋ฉฐ, ์ด๋ฏธ in-progress lock์ด ์์ผ๋ฉด ์ฃผ๋ฌธยทํฌ์ง์
์กฐํยท์ฆ๊ฑฐ ์์ง ์ ์ ์ฐจ๋จํฉ๋๋ค. --allow-rerun๋ ์ด์ ์ธ์
์ด ์ฃผ๋ฌธ ์ ์ถ์ ๋๋ฌํ๊ฑฐ๋ ์คํจ/์ค๋จ ํ์ ์ด ์์ผ๋ฉด ์ฌ์คํํ์ง ์๊ณ , ์ฃผ๋ฌธ ์ ์ถ ์ ๋จ๊ณ์์ ๋งํ ๋ถ์์ ์ธ์
๋ณต๊ตฌ์๋ง ์ฌ์ฉํฉ๋๋ค.
Target-weight ์คํ ์ฐจ๋จ ๊ธฐ๋ก: --execute๊ฐ pilot cap validation์์ ๋งํ๋ฉด ์ฃผ๋ฌธยท์ฒด๊ฒฐยท์ฆ๊ฑฐ ์์ง ์์ด session JSON artifact์ ์ฐจ๋จ ์ฌ์ ๋ฅผ ๋จ๊น๋๋ค. runtime pilot session์ ์ฐ์ง ์์ cap์ ๊ณ ์น ๋ค ๊ฐ์ ๊ฑฐ๋์ผ ๊ณํ์ ๋ค์ ์ ๊ฒํ ์ ์์ต๋๋ค. ๋ํ plan.trade_day์ KST ๊ธฐ์ค ์ค์ ์คํ์ผ์ด ๋ค๋ฅด๊ฑฐ๋, ํ์ฌ ์๊ฐ์ด KRX ์ ๊ท์ฅ ์ฃผ๋ฌธ ๊ฐ๋ฅ ์๊ฐ์ด ์๋๊ฑฐ๋, ํ์ฑ pilot auth์ ์น์ธ snapshot์ด ํ์ฌ plan์ params_hash/trade day/targets/์๋ ์ฅ๋ถ์ ๋ค๋ฅด๋ฉด ์ฃผ๋ฌธ, idempotency, ํฌ์ง์
์กฐํ, ์ฒด๊ฒฐ ๋์กฐ, session ์ ์ฅ, ์น๊ฒฉ ์ฆ๊ฑฐ ์์ง ์ ์ fail-closed๋ก ์ฐจ๋จํฉ๋๋ค. target-weight ์ ์ฉ ์คํ ์ด๋ํฐ๋ ํ๋ณด๋ช
์ ๋์ด์ ๋ฌด๊ดํ๊ฒ ์น์ธ snapshot์ ์๊ตฌํฉ๋๋ค. no-order --readiness-audit์ --daily-ops-summary๋ ์คํ์ผ check, ์ฅ ์๊ฐ check, ์น์ธ snapshot check๋ฅผ blocker๋ก ํ์ํด ์ค๋๋์๊ฑฐ๋ ์ฅ ์ธ ์คํ ๋ช
๋ น์ READY ์ํ๋ก ๋
ธ์ถํ์ง ์์ต๋๋ค. pilot entry๊ฐ ๋งํ ์์ง ์น์ธ snapshot์ด๋ ์ฅ ์๊ฐ ๊ฒ์ฌ๊ฐ ์คํ๋์ง ์์ ๊ฒฝ์ฐ Markdown๊ณผ JSON risk snapshot์ NOT CHECKED๋ก ํ์ํด ๋ฏธ๊ฒ์ฌ๋ฅผ ํต๊ณผ๋ก ์คํดํ์ง ์๊ฒ ํฉ๋๋ค.
Target-weight ๊ฐ๊ฒฉ ์ต์ ์ฑ guard: ๋ชฉํ๋น์ค plan ์์ฑ ์ ์ข
๋ชฉ๋ณ ๋ง์ง๋ง ์ค์ ์ข
๊ฐ ๋ ์ง(price_last_dates)์ ๋ฒค์น๋งํฌ ์ต์ ๋ ์ง(benchmark_last_date)๋ฅผ diagnostics์ ๋จ๊น๋๋ค. ์ด์ ์ฃผ๋ฌธ ๊ณํ์์๋ ffill๋ก ๋ณด์ ๋ ๋ก์ ์ข
๋ชฉ ๊ฐ๊ฒฉ์ด trade_day ์ต์ ๊ฐ๊ฒฉ์ฒ๋ผ ์ฐ์ด๋ฉด target_weight_stale_price_data๋ก ์ฐจ๋จํ๊ณ , benchmark_excess ์ ์๋ benchmark risk overlay์ ํ์ํ ๋ฒค์น๋งํฌ ๊ฐ๊ฒฉ์ด score day๋ณด๋ค ์ค๋๋๋ฉด target_weight_benchmark_price_stale๋ก plan ์์ฑ ์์ฒด๋ฅผ ์ค๋จํฉ๋๋ค. --readiness-audit์ --daily-ops-summary๋ ๊ฐ์ diagnostics๋ฅผ data_quality_check/Data Quality ์น์
์ผ๋ก ๋ค์ ๋
ธ์ถํด ๊ฐ๊ฒฉ ์ต์ ์ฑ ์ง๋จ ๋๋ฝ, stale ์ข
๋ชฉ, ๋ฒค์น๋งํฌ ์ง์ฐ์ READY ์ํ๋ก ์จ๊ธฐ์ง ์์ต๋๋ค. research target-weight backtest๋ ์๋ณธ close/open panel์ ๋ณด์กดํ๋, score day ์ค์ ์ข
๊ฐ๊ฐ ์๋ ์ข
๋ชฉ์ ํ๋ณด์์ ์ ์ธํ๊ณ stale_score_symbols_*๋ก ๊ธฐ๋กํฉ๋๋ค. ๋ณด์ ์ข
๋ชฉ์ ์ผ๋ณ stale ํ๊ฐ๋ held_stale_valuation_*๋ก ๋จ๊ธฐ๋ฉฐ, ๋ณด์ ์ข
๋ชฉ์ ๋ฆฌ๋ฐธ๋ฐ์ฑ์ผ ์๊ฐ๊ฐ ์์ผ๋ฉด ๊ฑฐ๋ ์์ด missing_held_open_*/skipped_rebalance_missing_held_open_count๋ก ๊ธฐ๋กํฉ๋๋ค. ๋ฒค์น๋งํฌ stale๊ณผ ์ ๊ท top-N ๋งค์ ํ๋ณด์ ์๊ฐ ๋๋ฝ์ ๊ณ์ fail-closed๋ก ์ค๋จํด stale ๊ฐ๊ฒฉ์ด๋ ๋น์ผ ์ข
๊ฐ ์ฒด๊ฒฐ ์ฐฉ์๊ฐ pilot ํ๋ฆ์ ์์ด์ง ์๊ฒ ํฉ๋๋ค.
Target-weight daily ops ์คํ ์ต์ ์ฑ guard: READY_TO_EXECUTE, READY_TO_ENABLE_CAPS, WAITING_FOR_MARKET_SESSION summary๋ trade_day๊ฐ ํ์ฌ KST ๋ ์ง์ ๋ง์์ผ ํ ๋ฟ ์๋๋ผ generated_at๋ ํ์ฌ์ผ 30๋ถ ์ด๋ด์ฌ์ผ ํฉ๋๋ค. ๋๋ฝ, ํ์ ์ค๋ฅ, ๋ฏธ๋ ์๊ฐ, 30๋ถ ์ด๊ณผ ์์ฝ์ paper_pilot_control.py --status์ current blockers runbook์์ ์คํ/์น์ธ ๋ช
๋ น์ # blocked:๋ก ๋ฐ๊พธ๊ณ daily ops summary ์ฌ์์ฑ์ ์๊ตฌํฉ๋๋ค.
Earnings filter fail-closed: trading.skip_earnings_days๊ฐ 0๋ณด๋ค ํฌ๋ฉด ์ ๊ท BUY ์ ์ yfinance์ DART ์์๋ก ์ค์ ์ผ์ ํ์ธํฉ๋๋ค. ๋ ์์ค ๋ชจ๋ ์ค์ ์ผ์ ํ์ธํ์ง ๋ชปํ๋ฉด ๊ธฐ๋ณธ trading.earnings_filter_unknown_policy=block ์ ์ฑ
์ผ๋ก ๋งค์๋ฅผ ์ฐจ๋จํฉ๋๋ค. ์กฐํ ๋ถ๊ฐ ์ํ๋ฅผ ๊ฐ์ํ๊ณ ์ด์ฉํ๋ ค๋ฉด earnings_filter_unknown_policy: "allow"๋ฅผ ๋ช
์ํด์ผ ํฉ๋๋ค.
Paper trade quality gate: tools/paper_trade_quality_report.py๋ ์ฒด๊ฒฐ ํ์ง์ด review์ด๊ฑฐ๋ ์ ํ ๊ธฐ๊ฐ์ TradeHistory๊ฐ 0๊ฑด์ด๋ฉด ๊ธฐ๋ณธ non-zero๋ก ์ข
๋ฃํฉ๋๋ค. ์ฒด๊ฒฐ 0๊ฑด ๋ฆฌํฌํธ๋ง ์์ฑํ๋ ค๋ฉด --allow-no-trades๋ฅผ ๋ช
์ํฉ๋๋ค. promotion package๋ ๊ฐ์ ๊ธฐ๊ฐ trade_quality_status=no_trades๋ฅผ fill_quality_no_trades blocker๋ก ๋ฐ์ํ๊ณ , execution_session_id/order_id๊ฐ ๋น์ด ์๊ฑฐ๋ evidence์ total_trades ๋ฐ BUY/SELL ํฉ๊ณ๊ฐ TradeHistory์ ๋ค๋ฅด๋ฉด fill_quality_execution_link_missing/fill_quality_trade_count_mismatch/fill_quality_trade_action_mismatch๋ก ์ฐจ๋จํฉ๋๋ค. TradeHistory.action์ด BUY/SELL์ด ์๋ ๊ฒฝ์ฐ๋ fill_quality_unknown_trade_action์ผ๋ก fail-closed ์ฒ๋ฆฌํฉ๋๋ค. promotion engine ์ญ์ live ํ๋ณด ํ์ ์์ paper_trade_quality_status=ok๋ฅผ ์ฌํ์ธํฉ๋๋ค.
Target-weight ์น๊ฒฉ ์ฆ๊ฑฐ ๋ณด๊ฐ: target-weight ๊ณ์ด ์ ๋ต์ ์ผ๋ฐ execution_backed=True paper record๋ง์ผ๋ก promotion evidence day๋ฅผ ์ฑ์ฐ์ง ์์ต๋๋ค. pilot_paper/authorized record๊ฐ target-weight plan๊ณผ execution proof๋ฅผ ํฌํจํ๊ณ , record date์ plan trade day๊ฐ ์ผ์นํ๋ฉฐ, execution_trade_day_allowed=True, execution_market_session_allowed=True, pilot_authorization_snapshot_allowed=True, liquidity/pre-trade risk/order result/fill/position reconciliation complete ๋ฐ plan/execution params hash ์ผ์น๋ฅผ ๋ง์กฑํ ๋ ๋ง ์น๊ฒฉ ์นด์ดํธ์ ๋ค์ด๊ฐ๋๋ค. 60์์
์ผ ์ ์ฒด verified pilot evidence๋ ํ๋์ params hash๋ก ๊ณ ์ ๋์ด์ผ ํ๋ฉฐ, promotion package ์์ฑ๊ณผ promotion/live gate๋ canonical strategy_specs์ base_strategy=target_weight_rotation์ ์ฐ์ ๊ธฐ์ค์ผ๋ก target-weight ํ๋ณด๋ฅผ ์๋ณํฉ๋๋ค. paper evidence package๋ canonical params hash์ pilot proof๊ฐ ๋ง์ง ์์ผ๋ฉด BLOCKED๋ก ๋จ๊ธฐ๋ฉฐ, live gate๋ canonical metadata์ params hash์ paper evidence params hash๊ฐ ๋ค๋ฅด๋ฉด target-weight live ์ ํ์ ์ฐจ๋จํฉ๋๋ค.
Target-weight finalize ์ฑ๊ณผ ์ง๋จ: --finalize-pilot-evidence๊ฐ total_value/daily_return ๋ฏธํ์ ์ผ๋ก ๋งํ๋ฉด finalize report์ source record ๋ณด์ ์ฑ๊ณผ ํ๋, portfolio metrics probe ์ํ ์ฌ๋ถ, probe์์ ํ์ธ๋ ํ๋, ์ต์ข
๋๋ฝ ํ๋๋ฅผ ๊ธฐ๋กํฉ๋๋ค. current blockers์ paper_pilot_control.py --status๋ ์ด ์ ๋ณด๋ฅผ ๋
ธ์ถํด, ์ฑ๊ณผ snapshot ๋๊ธฐ์ธ์ง benchmark ๋๊ธฐ์ธ์ง ์ด์์๊ฐ ๊ตฌ๋ถํ ์ ์๊ฒ ํฉ๋๋ค. daily_return/portfolio_value/benchmark excess ๋๋ฝ์ฒ๋ผ finalize๋ก promotable record๊ฐ ๋ ์ ์๋ ์ฌ์ ๋ repair๋ณด๋ค finalize๋ฅผ ๋จผ์ ์๋ดํฉ๋๋ค.