LabHub

Blog

Trading Back Office and Settlement Systems — The Data Journey Across Front, Middle, and Back

한국어English日本語

Introduction

When people say trading systems, they usually picture the glamorous front office — order execution, algo trading, the order book. But after a fill, there is a much longer journey before money and securities actually move: position updates, PnL calculation, confirmation, clearing, settlement instructions, ledger postings, and reconciliation. The middle office and back office systems own that journey.

The back office is unglamorous, but it is the area where an outage is immediately a financial incident. A settlement that slips by one day creates counterparty risk and penalties; an unresolved reconciliation break becomes a finding in the audit and the regulatory examination. This article follows a single equity, bond, or derivatives trade from execution through every system it touches until final settlement and accounting postings, and examines the controls and batches at work along the way. We also cover Korean market infrastructure context (Korea Exchange, Korea Securities Depository, and the Bank of Korea BOK-Wire+ system).

This article is a technical resource, not investment advice.

FO/MO/BO and the System Map

Trading division systems at brokers and banks are traditionally split into three zones.

+--------------------------------------------------------------------+
| FRONT OFFICE (FO)            "creates the trade"                    |
|  - OMS (order mgmt) / EMS (execution mgmt) / algo engines           |
|  - pricing, quoting, market data                                    |
|  - trader blotter (intraday activity)                               |
+---------------------------+----------------------------------------+
                            | execution events
                            v
+--------------------------------------------------------------------+
| MIDDLE OFFICE (MO)           "controls the trade"                   |
|  - trade capture / enrichment - accounts, fees, settlement details  |
|  - limit monitoring (position/credit/VaR), risk reporting           |
|  - real-time PnL, intraday position management                      |
|  - confirmation, affirmation (institutional clients)                |
+---------------------------+----------------------------------------+
                            | confirmed trades
                            v
+--------------------------------------------------------------------+
| BACK OFFICE (BO)             "finishes the trade"                   |
|  - settlement instruction generation, links to CSD/CCP/custodians   |
|  - ledger postings, accounting interface, fees and taxes            |
|  - reconciliation (positions/cash/trades), break management         |
|  - corporate actions, reporting, regulatory filings                 |
+--------------------------------------------------------------------+

The core principle is segregation of duties. The people who originate trades (FO) and the people who validate and settle them (MO/BO) must be separated in both the org chart and system entitlements. An architecture in which an FO trader can edit settlement data in the back office system is, by itself, an audit finding.

Order to Execution to Clearing to Settlement: Flows by Product

The end-to-end flow as a sequence:

 Trader        OMS/EMS      Exchange/OTC    MO (capture/      Clearing      BO            Depository/
   |             |             |            confirm)          house         (settlement)  accounts
   |--order----->|--route----->|              |                |             |             |
   |             |<--fill------|              |                |             |             |
   |             |--fill feed--------------->|                |             |             |
   |             |             |              |--enrich/check->|             |             |
   |             |             |              |--send confirm-> (cpty)       |             |
   |             |             |              |                |<--clearing--|             |
   |             |             |              |                |--netting--->|             |
   |             |             |              |                |             |--instruct-->|
   |             |             |              |                |             |<--settled---|
   |             |             |              |                |             |--post/recon-|

Clearing and settlement structures differ by product.

AspectListed equitiesBondsListed derivativesOTC derivatives
Execution venueExchange (KRX)Mostly OTC plus inter-dealer government bond marketDerivatives market (KRX)Bilateral contracts
ClearingKRX CCPMostly bilateral, some CCPKRX CCPSome mandatory CCP clearing (IRS etc.)
Settlement cycleT+2 (KRX equities)Typically T+1, deal-dependentDaily mark-to-market (margin)Per contract terms (CSA collateral)
Settlement methodDVP via depositoryDVPCash net settlementCash/collateral transfers
Key riskSettlement failsFails, counterpartyMargin shortfallsCounterparty credit, collateral disputes

Design implication: split the trade model into a product-agnostic core (trade identifier, parties, quantity, amounts, dates) and product-specific extensions (underlying, expiry, and margin for derivatives; accrued interest for bonds). Above all, separate the dates — trade date, intended settlement date, actual settlement date — from day one. Untangling them later is painful.

Position and PnL Management — Real-Time PnL and EOD Valuation

Position keeping is conceptually simple: accumulate execution events per account and instrument. The hard part is PnL, which splits into two kinds.

Realized PnL
  = profit fixed at the moment of sale
  = (sale price - cost basis price) x quantity sold   [cost basis: moving average etc.]

Unrealized PnL
  = book profit on open positions
  = (current valuation price - cost basis price) x open quantity

Intraday PnL
  = change versus the prior-day official valuation
  = realized PnL today + (today price - prior close price) x open quantity
    + PnL on positions opened today

Real-time PnL belongs to the middle office: join the execution stream with the market data stream and aggregate per trader, desk, and book. EOD (end-of-day) valuation, by contrast, is the official number owned by BO and risk. All positions are revalued at closing prices (under fair value standards), and these numbers feed the accounting ledger and regulatory reporting.

# Skeleton of an EOD valuation batch (conceptual)
from decimal import Decimal

def eod_valuation(positions, closing_prices, fx_rates, base_ccy="KRW"):
    results = []
    for pos in positions:
        price = closing_prices.get(pos.instrument_id)
        if price is None:
            # Unpriceable instruments must go to an exception queue —
            # never default them to zero
            results.append(valuation_exception(pos, reason="NO_PRICE"))
            continue
        mv_local = Decimal(pos.quantity) * price.clean_price
        if pos.instrument_type == "BOND":
            mv_local += Decimal(pos.quantity) * price.accrued_interest
        fx = fx_rates.get((pos.currency, base_ccy), Decimal("1"))
        mv_base = mv_local * fx
        unrealized = mv_base - pos.cost_basis_base
        results.append(make_valuation(pos, mv_local, mv_base, unrealized,
                                      price_source=price.source))
    return results

Operational points:

The Risk Middle Office — Limits and VaR

The other pillar of the middle office is risk control.

Confirmation and Reconciliation — Confirms, Affirms, Break Management

The most important control right after execution is trade confirmation: verifying that our record of the trade matches the counterparty record.

Any mismatch found in confirmation or reconciliation is registered as a break and tracked until resolved.

Break lifecycle:
  detected --> assigned (owner designated)
     --> investigating (cause code classification)
     --> resolved (correcting entry / counterparty fix / price fix ...)
     --> closed (approver sign-off)

  Key metric: open break count x aging x amount
  High-value breaks older than 3 days auto-escalate

Settlement Systems — DVP, KSD, BOK-Wire+

Settlement is the moment securities and cash actually move. The core concept is DVP (Delivery versus Payment): delivery of securities and payment of cash are made mutually conditional, eliminating principal risk where only one leg completes. Under the BIS CPMI classification there are three DVP models.

ModelSecuritiesCashCharacteristics
DVP model 1Gross, trade by tradeGross, trade by tradeMinimal principal risk, high liquidity needs
DVP model 2Gross, trade by tradeNet settlementSecurities immediate, cash netted at close
DVP model 3Net settlementNet settlementBest liquidity efficiency, high system dependence

Korean market infrastructure:

From the back office system perspective, settlement processing consists of:

confirmed trade
   --> generate settlement instruction
       - apply counterparty SSI (Standing Settlement Instructions)
   --> transmit instruction (KSD link / via custodian over SWIFT for global)
   --> track matching status (matched against counterparty instruction?)
   --> monitor settlement date (intended vs actual)
   --> settlement confirmed --> finalize ledger postings
   --> on fail: settlement fail handling flow (below)

SSI master data quality determines the settlement STP (straight-through processing) rate. If settlement account details per counterparty, currency, and product are wrong, that trade is guaranteed manual work.

SWIFT Message Flows — MT and MX

SWIFT messages are the standard for cross-border settlement and global custody links. Messages commonly used in securities settlement:

PurposeMT (legacy)MX (ISO 20022)
Receive securities against paymentMT541sese.023 (RvP)
Deliver securities against paymentMT543sese.023 (DvP)
Settlement confirmationMT545 / MT547sese.025
Status and processing adviceMT548sese.024
Holdings statementMT535semt.002
Transaction statementMT536semt.017
Customer credit transferMT103pacs.008
Bank-to-bank funds transferMT202pacs.009

Example flow — receiving a foreign currency bond through a global custodian (RvP):

 Asset mgr / broker BO     Global custodian            Local CSD / sub-custodian
       |                        |                          |
       |--- MT541 (receive) --->|                          |
       |                        |--- local instruction --->|
       |                        |<-- matching/status ------|
       |<-- MT548 (status) -----|                          |
       |<-- MT545 (confirm) ----|     (on settlement)      |
       |                        |                          |
       |<-- MT535 (EOD holdings)|                          |

Operational note: MT fields are loose, so conventions differ by institution. Even for the same MT548, status code usage varies by custodian, so you need per-counterparty parsing rules agreed at onboarding. The ISO 20022 transition (ongoing in the securities space) mitigates this with structured codes.

Ledger Postings and the Accounting Interface

Every trade ultimately becomes accounting entries. The back office system carries a posting rules engine that translates trade events into accounting events.

Example postings by event (equity buy, simplified):
  Trade date (T):    DR securities receivable   xxx   CR payable          xxx
  Settle date (T+2): DR securities held         xxx   CR receivable       xxx
                     DR payable                 xxx   CR cash             xxx
  EOD valuation:     DR/CR valuation PnL        xxx   CR/DR valuation adj xxx

Design principles:

Corporate Actions Processing

Dividends, bonus issues, stock splits, mergers, call and put exercises — corporate actions (CA) are the most error-prone area of the back office.

When an Outage Is an Incident — The Settlement Fail Runbook

A settlement fail is the state where securities or cash did not move on the intended date. Causes include securities shortfall (seller side), insufficient funds, instruction mismatch, and SSI errors.

Settlement fail runbook (summary):

1. Detect (on settlement date, as early as possible)
   - dashboard of intended vs matched/settled status
   - alert on unmatched instructions before settlement date
     (unmatched at T+1 = warning signal)

2. Classify (cause codes)
   - instruction mismatch (UNMATCHED) / securities shortfall (LACK)
     / insufficient funds (MONY)
   - our fault vs counterparty fault — liability drives penalties

3. Immediate actions
   - mismatch: re-verify terms with counterparty, send corrected instruction
   - securities shortfall: explore borrowing, negotiate partial settlement
   - funds shortfall: escalate to treasury, source intraday liquidity

4. Notify stakeholders
   - client (institutional) / trading desk / compliance and risk
   - if the fail creates a chain, analyze impact on downstream settlements

5. Aftermath
   - record fail costs and penalty settlements
   - root cause analysis -> SSI cleanup, process improvement items
   - monthly report on repeat counterparties and repeat causes

Regimes that levy cash penalties on fails, like the settlement discipline rules under the EU CSDR, have spread — so fail monitoring is directly tied to cost reduction.

Designing the Reconciliation Batch

Reconciliation is the heart of the back office. At minimum three kinds must run daily.

  1. Position reconciliation: internal books vs depository/custodian holdings (MT535)
  2. Cash reconciliation: internal cash ledger vs bank/custodian statements (MT940/camt.053)
  3. Trade reconciliation: FO system vs BO system for the day (internal systems)
# Skeleton of a position reconciliation batch (conceptual)
from collections import defaultdict
from decimal import Decimal

KEY = ("account_id", "instrument_id")  # reconciliation key
TOLERANCE = Decimal("0")               # zero tolerance for positions

def reconcile(internal_rows, external_rows, as_of_date):
    internal = aggregate(internal_rows)   # key -> quantity
    external = aggregate(external_rows)
    breaks = []
    for key in internal.keys() | external.keys():
        iq = internal.get(key, Decimal("0"))
        eq = external.get(key, Decimal("0"))
        if abs(iq - eq) > TOLERANCE:
            breaks.append({
                "as_of": as_of_date,
                "key": key,
                "internal_qty": iq,
                "external_qty": eq,
                "diff": iq - eq,
                "classification": classify(key, iq, eq),  # auto cause guess
            })
    return breaks

def classify(key, iq, eq):
    # auto-classification heuristics: pending settlements, CA timing,
    # unbooked securities lending, etc.
    # leave unknowns as UNKNOWN for human investigation
    ...

Design principles:

A Data Model Sketch

+----------------+      +------------------+      +-------------------+
|    TRADE       |      | SETTLEMENT_      |      |   POSITION        |
+----------------+      | INSTRUCTION      |      +-------------------+
| trade_id PK    |--+   +------------------+      | account_id        |
| order_id FK    |  +-<-| trade_id FK      |      | instrument_id     |
| account_id     |      | si_id PK         |      | as_of_date        |
| instrument_id  |      | direction (R/D)  |      | quantity          |
| qty / price    |      | ssi_id FK        |      | cost_basis        |
| trade_date     |      | expected_date    |      | (daily snapshots) |
| settle_date    |      | matched_status   |      +-------------------+
| status         |      | settled_at       |
| version        |      +------------------+      +-------------------+
+----------------+                                |  RECON_BREAK      |
       |                +------------------+      +-------------------+
       +------------->  | POSTING          |      | break_id PK       |
                        +------------------+      | recon_type        |
                        | posting_id PK    |      | as_of_date        |
                        | trade_id FK      |      | key (acct/instr)  |
                        | event_type       |      | diff_amount       |
                        | debit_account    |      | status / aging    |
                        | credit_account   |      | assigned_to       |
                        | amount / ccy     |      | resolution_code   |
                        | posted_at        |      +-------------------+
                        +------------------+

The crucial feature of the trade table is versioning. Amendments and cancels are stacked as new version rows, never edits, with a view that always points to the latest effective version. Settlement instructions and postings must be traceable to the trade version that generated them — that is what keeps amendment handling consistent.

Pitfalls and Anti-Patterns

Build Checklist

Closing Thoughts

The value of back office systems is invisible on a good day. When everything flows STP, nobody talks about the back office. But on the day a settlement fails, a reconciliation breaks, or the auditors arrive — what protects the organization is a well-designed data model, immutable history, automated reconciliation, and a rehearsed runbook. If you build trading systems, make the last mile of the data journey as solid as the glamorous front — or more so.

References

Comments

No comments yet.

Sign in to leave a comment