KRX–NXT Cross-Venue Session Cutover & Auction-Safe Routing Playbook

2026-02-25 · finance

KRX–NXT Cross-Venue Session Cutover & Auction-Safe Routing Playbook

Date: 2026-02-25 (KST)

TL;DR

In Korea’s multi-venue stock market regime (KRX + Nextrade/ATS), many execution failures come from session-boundary mistakes, not alpha errors.

This playbook turns official session constraints into code-level routing rules:

  1. Build a time-sliced venue eligibility matrix (KRX-only / NXT-only / dual)
  2. Enforce auction cutover locks around open/close auctions
  3. Separate best-execution logic from regulatory hard-block logic
  4. Keep a deterministic fallback when one venue is temporarily unavailable

1) Why this matters now

With Nextrade (ATS) operating alongside KRX, Korea effectively moved from single-venue assumptions to a cross-venue execution environment. The FSC explicitly frames this as a competition-based market structure with integrated oversight and best-execution obligations for securities firms.

Engine implication: if your router still assumes one continuous venue/day structure, you will leak errors at boundaries (open, close, off-hours transitions).


2) Source-backed market structure constraints

2.1 KRX base trading structure (retail-facing legal summary)

From 생활법령정보 (summarizing KRX rulebook references):

2.2 FSC ATS operating framework (KRX + NXT interaction)

From FSC press release (Feb 5, 2025 approval notes):

2.3 KIS Open API operational shape

From KIS sample repo (open-trading-api):


3) Executable session × venue eligibility matrix

Time block (KST) KRX NXT Router default policy
08:00–08:30 limited off-hours pre-market session-specific whitelist only
08:30–08:50 opening auction flow active pre-market conservative; avoid dual-routing assumptions
08:50–09:00 opening indicative-price phase suspended KRX-only lock
09:00–15:20 regular regular best-execution SOR (dual venue)
15:20–15:30 closing auction suspended KRX-only close-auction lock
15:30–15:40 post-close transition after-market starts NXT-only or policy-gated
15:40–16:00 post-close off-hours close-price at KRX after-market instrument/session eligibility gate required
16:00–18:00 KRX off-hours single-price after-market active but constrained by item overlap rules enforce item-level exclusivity rule
18:00–20:00 closed after-market NXT-only policy

Implementation note: do not encode this as static constants in strategy logic. Keep it in config (venue_session_policy.yaml) with versioning.


4) Router architecture pattern (safe split)

4.1 Two-stage decision path

  1. Regulatory/session hard filter (must-pass)
    • venue eligibility by time block
    • order type allowedness per venue/session
    • short-sale session constraint
    • symbol-level overlap restrictions
  2. Economic ranking layer (best-execution)
    • expected fill quality
    • fee/slippage estimate
    • queue/risk-adjusted urgency

Never allow stage 2 to override stage 1.

4.2 Deterministic fallback states

Define hard fallback modes:

Avoid fuzzy “try both and see” behavior at boundary seconds.


5) Cutover-safe order handling

5.1 Boundary freeze buffers

At session boundaries, add tiny deterministic freeze windows (e.g., few hundred ms to a few seconds depending on infra latency profile):

This reduces accidental submission into just-closed states.

5.2 In-flight order hygiene

At each cutover event:


6) Practical controls to add this week

  1. Session oracle service
    • single source of truth for market phase + venue state
  2. Reject-code taxonomy
    • make boundary failures observable (reject.venue_window, reject.shortsale_window, reject.symbol_overlap)
  3. Replay harness
    • run historical day replay with synthetic timestamps around 08:50, 09:00, 15:20, 15:30, 16:00
  4. Throttle partitioning
    • separate KIS REST/WS/token limiters by environment and function
  5. “No stale state” invariant
    • if session oracle age > threshold, enter SAFE_HALT

7) Minimal data contract for venue-aware routing

interface VenueState {
  tsKst: string
  phase:
    | 'PRE'
    | 'OPEN_AUCTION'
    | 'REGULAR'
    | 'CLOSE_AUCTION'
    | 'POST'
  krxTradable: boolean
  nxtTradable: boolean
  shortSellAllowedNxt: boolean
  symbolOverlapRestricted: boolean
  sourceVersion: string
}

interface RouteDecision {
  allowed: boolean
  venue?: 'KRX' | 'NXT'
  mode: 'DUAL_ACTIVE' | 'KRX_LOCK' | 'NXT_LOCK' | 'SAFE_HALT'
  reasonCodes: string[]
}

8) References


One-line takeaway

In KR multi-venue execution, alpha competes on milliseconds, but operational survival depends on clean session cutovers and venue-state correctness.