KIS+KRX Corporate-Action & Symbol-Lifecycle Reliability Playbook

2026-02-25 · finance

KIS+KRX Corporate-Action & Symbol-Lifecycle Reliability Playbook

Date: 2026-02-25 (KST)

TL;DR

Most live-trading failures are not model failures — they are instrument-lifecycle failures:

This playbook turns KIS + KRX operational reality into a deterministic control layer for Vellab.


1) Why this deserves its own risk module

For KR live execution, corporate actions and listing-status changes are not edge cases. They are recurring sources of:

  1. reject storms (invalid price/qty/session)
  2. ghost exposure (fills against stale assumptions)
  3. broken PnL attribution (split-adjusted history vs unadjusted live fills)
  4. monitoring blind spots (symbol looked valid yesterday, not now)

Treat lifecycle handling as pre-trade risk, not postmortem cleanup.


2) Event taxonomy (operator-centric)

Model events by operational impact, not legal wording.

2.1 Price/quantity remapping events

Execution impact:

2.2 Identity/continuity events

Execution impact:

2.3 Tradability state events

Execution impact:


3) Data planes you need (minimum viable)

Use at least three independent planes:

  1. Reference plane (daily/periodic):
    • KIS stock info files + broker/reference metadata
    • KRX data snapshots for status/market structure context
  2. Announcement plane (event-driven):
    • KIND disclosures and trading-halt/resume notices
  3. Runtime plane (intra-day sanity):
    • quote/trade stream anomalies (sudden non-tradable signatures, repeated rejects)

If any plane disagrees, route symbol to DEGRADED and require explicit reconciliation.


4) Internal symbol lifecycle state machine

Define a state machine in execution core:

ACTIVE -> PRE_EVENT -> FROZEN -> TRANSITION_APPLY -> RESUME_CHECK -> ACTIVE

terminal branch:

... -> RETIRED

State semantics

Do not use ad-hoc flags. Make transitions explicit and auditable.


5) Order-safety rules at boundaries

5.1 Freeze windows

When event time is known (or suspected), enforce preconfigured freeze windows:

5.2 Compatibility checks on re-open

Before re-enabling routing:

5.3 Reject-storm breaker

If symbol-level rejects exceed threshold in short window:


6) Position/PnL integrity policy

6.1 Dual-price policy in storage

Store both:

Never overwrite raw fills with adjusted values.

6.2 Bitemporal symbol master

For each instrument record keep:

This avoids hindsight leakage in replay and makes incident reconstruction possible.


7) Vellab implementation blueprint (practical)

7.1 Core tables

7.2 Services

7.3 Hard invariants

  1. No order submission unless state == ACTIVE
  2. No direct routing by raw symbol string (must resolve canonical ID)
  3. Every state transition must be persisted with reason and source

8) Monitoring & alerts

Minimum metrics:

Recommended alerts:


9) Incident runbook (15-minute version)

  1. Contain: set symbol FROZEN
  2. Collect: latest reference snapshot + announcement + reject samples
  3. Compare: identify mismatch dimension (status/code/price-rule/session)
  4. Patch: apply event + alias mapping + metadata refresh
  5. Verify: dry-run validator on candidate orders
  6. Resume: controlled reopen (small-size policy), then full enable
  7. Postmortem: add failing pattern to lifecycle regression tests

10) One-line takeaway

In live KR trading, alpha can survive bad fills; it rarely survives broken symbol lifecycle handling — build lifecycle control as a first-class risk system.


References (starting points)