Every retail back-tester eventually confronts the same uncomfortable question: the simulated equity curve looks clean, the Sharpe is attractive, and the drawdown profile is manageable — then live execution starts and the gap between theory and reality widens with each rebalance. In the KOSPI 200 context, a significant portion of that gap originates not from strategy logic but from a modeling choice most retail tools make by default: filling orders at mid-price without accounting for KRX lot structure.
This post works through exactly how lot-level slippage accumulates in a typical KOSPI 200 rotation back-test, why the effect is larger than most practitioners expect, and where the modeling assumptions break down even in a lot-aware framework.
Past-performance disclaimer: All back-test results and parameter illustrations in this article are hypothetical and synthetic. Backtest results are not a guarantee of future returns; this is research, not investment advice.
What KRX Lot Structure Actually Means for Fill Modeling
KRX (한국거래소) has standardized trading lots across KOSPI 200. For the overwhelming majority of KOSPI 200 constituents, the minimum lot size is 1 share — a fact that leads many back-testers to assume lot-level modeling is a non-issue. That assumption is only partially correct.
The lot-level problem is not primarily about minimum order size — it is about how the visible bid-ask spread interacts with trade size at discrete price increments (호가 단위). KRX uses a tiered tick size system: stocks trading below ₩5,000 have a ₩5 tick, stocks between ₩5,000 and ₩10,000 have a ₩10 tick, and large-cap stocks above ₩500,000 have a ₩1,000 tick. When you model fills at the theoretical mid-price, you ignore that the actual executable price is the next available ask price, which sits at the next tick boundary above mid. For a stock trading near ₩50,000, one tick of spread is ₩50 — 0.10% per side, 0.20% round trip. Across a quarterly rebalance of 20 positions in a momentum rotation, that compounds to 4–6% of annual drag that the mid-price model simply never accounts for.
The more material issue arises with order size relative to quoted depth. KOSPI 200 large-caps — the semiconductor (반도체) and financial names in the top quartile by weight — typically show quoted depth of 10,000–50,000 shares at the best bid and ask. For a ₩100M position in a ₩50,000 stock, you need 2,000 shares. Filling 2,000 shares against 10,000 shares of quoted depth at the best ask is clean. But rotate into a KOSPI 200 mid-cap with ₩30,000 price and 800 shares of best-ask depth, and a ₩30M position (1,000 shares) already walks the book by one tick. That is a realized slippage of ₩30,000 on a ₩30M trade — 0.10% at the order level, but the mid-price model reported zero.
A Synthetic Walk-Through: Quarterly Rebalance on a 20-Stock Momentum Portfolio
Consider a synthetic KOSPI 200 momentum rotation with the following parameters: universe restricted to KOSPI 200 constituents ranked by 12-1 month momentum, top-20 held equally weighted, rebalanced quarterly on the third Friday of March, June, September, and December. Execution assumed at next-day open.
Under a mid-price fill model — the default in most retail-grade tools including simpler Python implementations using pandas and daily OHLCV data — the quarterly rebalance costs are near zero. The equity curve is pristine.
# Mid-price fill assumption — what most retail tools do
def fill_at_mid(row):
return (row['high'] + row['low']) / 2 # approximation of mid
# Lot-aware fill approximation
def fill_at_ask_adjusted(row, order_shares, avg_depth_shares):
tick_size = get_tick_size(row['close'])
half_spread = tick_size # minimum 1-tick spread
depth_impact = max(0, (order_shares / avg_depth_shares) - 0.2) * tick_size * 2
return row['close'] + half_spread + depth_impact
When we substitute the lot-aware fill for a synthetic KOSPI 200 mid-cap universe (constituents ranked 51–150 by market cap) and apply realistic depth estimates derived from historical tick data, the average per-trade slippage across 2018–2024 increases from approximately 0.02% (mid-price assumption) to 0.18–0.32% (lot-aware). Over four quarterly rebalances per year with 40% portfolio turnover per rebalance, that is 29–51 basis points of annual drag that was invisible in the mid-price model.
The spread between best-case and worst-case is driven primarily by rebalance-day timing. When a rebalance coincides with a KOSPI 200 constituent change announcement (구성종목 변경) — which KRX typically announces five trading days in advance — the affected names show meaningfully wider bid-ask spreads on the inclusion/exclusion day itself as arbitrageurs front-run the index replication flow. A back-test that happens to rebalance into a freshly included constituent on announcement day without modeling spread widening is missing a real execution cost.
Where the Lot-Level Model Itself Has Limits
We are not claiming that lot-level slippage modeling solves the execution gap entirely — we are saying it is a necessary precondition for an honest back-test. Even a well-calibrated lot-aware model carries its own structural limitations that practitioners should understand.
First, historical tick data from KRX covers available market data but does not capture hidden orders or dark pool activity. The reconstructed bid-ask surface is based on visible order book depth, which understates total liquidity for names with significant institutional participation via negotiated block trades.
Second, the depth estimates in any historical reconstruction are drawn from average or median daily depth snapshots. Rebalance days — particularly those coinciding with MSCI quarterly rebalance or KOSPI 200 quarterly reconstitution — show materially lower available depth as competing institutional orders crowd the same side of the book. A model calibrated on ordinary-day depth will systematically understate rebalance-day costs for larger position sizes.
Third, the tick-size regime in Korea has changed over time. KRX revised the tiered tick-size structure in 2016; any back-test extending to pre-2016 data needs to apply the period-appropriate tick schedule, or the slippage reconstruction will be anachronistic.
Practical Calibration: What Parameters Matter
For practitioners building their own lot-aware slippage model, three parameters dominate sensitivity:
- Average quoted depth at best bid/ask: Sourced from intraday snapshots; for KOSPI 200 mid-caps, typical ranges are 500–3,000 shares at best. Use median rather than mean — depth distributions are right-skewed and mean is inflated by occasional deep-book days.
- Position size as fraction of daily average volume (ADV): The KRX market convention for institutional block orders is 2–3% of ADV before significant market impact. Retail rotation strategies targeting mid-caps with ₩5–20M per position typically stay well within this threshold, but strategies scaling to ₩500M+ aggregate AUM will not.
- Rebalance timing vs. index event calendar: Offsetting rebalance dates by 3–5 trading days from KOSPI 200 quarterly reconstitution dates reduces execution cost variance significantly — a scheduling choice that mid-price models will never surface as relevant.
The IS/OOS Ratio as a Diagnostic
One practical way to detect whether a back-test is under-modeled on transaction costs is to examine the in-sample / out-of-sample (IS/OOS) performance ratio across walk-forward windows. When slippage is omitted or under-modeled, the IS Sharpe typically runs 1.4–2.0x the OOS Sharpe, because the optimizer finds the mid-price fantasy line and the real-execution degradation only appears in OOS. When lot-level slippage is included at realistic levels, the IS/OOS ratio tends to compress toward 1.1–1.3x for well-specified strategies — still degraded due to genuine regime change, but no longer inflated by a transaction cost fiction.
This IS/OOS compression is not guaranteed and should not be read as validation alone. But a strategy showing 1.8x IS/OOS degradation after adding lot-level slippage is telling you something important: the strategy's edge was primarily noise-fitting to frictionless data, not genuine alpha.
Finology's back-testing engine models bid-ask reconstruction from KRX tick data by default across both KOSPI 200 and KOSDAQ universes. The slippage parameters are configurable, the methodology is documented on the Methodology page, and the output includes a per-rebalance cost breakdown so you can see exactly where transaction drag accumulates — not just what the final equity curve says after absorbing it silently.