KRX Volatility Interruption (VI)-Aware Order Router Playbook

2026-02-25 · finance

KRX Volatility Interruption (VI)-Aware Order Router Playbook

Date: 2026-02-25 (KST)

TL;DR

If you treat KRX VI as “just another market event,” live automation will eventually send the right order at the wrong micro-state.

This playbook turns VI into explicit execution state:

  1. Detect whether the symbol is in normal matching or 2-minute VI single-price mode
  2. Shift from spread capture to uncertainty control (smaller clips, wider patience, stricter caps)
  3. Resume with a re-entry protocol after VI ends (no immediate overreaction chase)

Goal: reduce avoidable slippage spikes and reject loops during high-volatility transitions.


1) Why this matters in KR live trading

KRX VI is a built-in per-symbol volatility brake. For execution engines, the key point is not theory but mechanics:

So routing logic must be stateful, not a static “submit and retry” loop.


2) What to encode from official rules

Based on KRX regulation pages (유가증권시장 종목별 변동성완화장치):

Implementation takeaway:

Never hardcode “VI should be rare.” Design for repeated transitions.


3) Session-aware trigger map (practical baseline)

KRX documents separate trigger-rate bands by product/session bucket (e.g., KOSPI200 vs 일반종목, regular vs closing single-price windows). Treat these as configuration data, not constants in strategy code.

Recommended config shape:

viTriggerTable:
  version: "krx-vi-2026-02"
  equity:
    kospi200:
      regular: 0.03
      closeAuction: 0.02
      afterHoursSinglePrice: 0.03
    general:
      regular: 0.06
      closeAuction: 0.04
      afterHoursSinglePrice: 0.06
  static:
    default: 0.10

Why config-first:


4) Execution state machine (minimum viable)

Use a symbol-level state machine:

  1. NORMAL
    • continuous matching assumptions valid
    • standard participation controls
  2. VI_ACTIVE
    • 2-minute single-price mode assumptions
    • clip-size reduction + aggression cap tightening
  3. VI_RECOVERY (30–180s after release, tune by symbol)
    • reopen shock buffer
    • gradual participation restore

Transition examples:

Add hysteresis so it does not flap under noisy flags.


5) Policy deltas by state

5.1 NORMAL

5.2 VI_ACTIVE

5.3 VI_RECOVERY


6) Venue fragmentation note (KRX + ATS era)

From FSC ATS rollout guidance (Nextrade launch context):

For router design:


7) Data contract (implementation-ready)

interface ViSignal {
  ts: string
  symbol: string
  venue: 'KRX' | 'NXT'
  viType: 'DYNAMIC' | 'STATIC' | 'UNKNOWN'
  phase: 'START' | 'END'
  refPrice?: number
  triggerRate?: number
}

interface SymbolExecState {
  symbol: string
  mode: 'NORMAL' | 'VI_ACTIVE' | 'VI_RECOVERY'
  modeSince: string
  recoveryStep?: number
  reasonCodes: string[]
}

Audit rule:


8) Monitoring checklist

Track per symbol bucket:

  1. Slippage p95 during VI_ACTIVE vs baseline
  2. Reject/fill ratio around VI transitions
  3. Post-VI first-5-min markout distribution
  4. Number of repeated VI cycles per day
  5. Opportunity-cost drift from over-defensive behavior

Bad smell:


9) Fast rollout plan

  1. Shadow mode: classify VI states, no behavior change
  2. Paper policy mode: simulate state-based caps/ramp
  3. Canary symbols: liquid names first
  4. Bucket rollout: by ADV/liquidity class
  5. Weekly tuning: recovery horizon, ramp pace, clip caps

References


One-line takeaway

In KR live execution, VI is not an edge case—it is a state transition you must model explicitly, or your router will keep making “locally reasonable” decisions in globally wrong market mode.