fintech-algorithms

Ticker-Change Chain Resolution

Install and import

bash
npm install fintech-algorithms
ts
import { resolveTickerChain } from "fintech-algorithms/corporate-actions-and-security-master-data/identity-continuity/ticker-change-chain-resolution";

Signature

resolveTickerChain(input)

Worked example

executed Captured by running this function on the input its own test provides. Real output of real code — but not asserted against a published figure.

Input

input
{
  "issuers": [
    {
      "issuerId": "SYN-ISS-001"
    },
    {
      "issuerId": "SYN-ISS-002"
    }
  ],
  "instruments": [
    {
      "instrumentId": "SYN-INS-001",
      "issuerId": "SYN-ISS-001",
      "shareClassId": "SYN-CLS-A"
    },
    {
      "instrumentId": "SYN-INS-002",
      "issuerId": "SYN-ISS-002",
      "shareClassId": "SYN-CLS-COM"
    }
  ],
  "listings": [
    {
      "listingId": "SYN-LST-001",
      "instrumentId": "SYN-INS-001",
      "venueMic": "XNAS",
      "currency": "USD"
    },
    {
      "listingId": "SYN-LST-002",
      "instrumentId": "SYN-INS-001",
      "venueMic": "XLON",
      "currency": "GBP"
    },
    {
      "listingId": "SYN-LST-099",
      "instrumentId": "SYN-INS-002",
      "venueMic": "XNAS",
      "currency": "USD"
    }
  ],
  "assignments": [
    {
      "assignmentId": "SYN-ASG-100",
      "revision": 1,
      "status": "active",
      "listingId": "SYN-LST-001",
      "symbol": "ALP",
      "effectiveAt": "2020-01-02T14:30:00Z",
      "validTo": "2024-06-10T13:30:00Z",
      "announcedAt": "2019-12-18T15:00:00Z",
      "availableAt": "2019-12-18T15:05:00Z",
      "changeKind": "initial_listing",
      "sourceId": "SYN-SRC-XNAS-100"
    },
    {
      "assignmentId": "SYN-ASG-200",
      "revision": 1,
      "status": "active",
      "listingId": "SYN-LST-001",
      "symbol": "NXT",
      "effectiveAt": "2024-06-10T13:30:00Z",
      "validTo": "2025-01-10T14:30:00Z",
      "announcedAt": "2024-05-15T12:00:00Z",
      "availableAt": "2024-05-15T12:07:00Z",
      "changeKind": "administrative",
      "sourceId": "SYN-SRC-XNAS-200-R1"
    },
    {
      "assignmentId": "SYN-ASG-200",
      "revision": 2,
      "status": "active",
      "listingId": "SYN-LST-001",
      "symbol": "NXT",
      "effectiveAt": "2024-06-10T13:30:00Z",
      "validTo": "2025-01-15T14:30:00Z",
      "announcedAt": "2024-05-15T12:00:00Z",
      "availableAt": "2024-12-20T16:10:00Z",
      "changeKind": "administrative",
      "sourceId": "SYN-SRC-XNAS-200-R2"
    }
  ],
  "query": {
    "direction": "symbol_to_listing",
    "symbol": "NXT",
    "venueMic": "XNAS",
    "queryAt": "2024-07-01T15:00:00Z",
    "asOf": "2024-08-01T12:00:00Z"
  }
}

Call

resolveTickerChain(input)

Returns

object with 21 fields: status, direction, queryAt, asOf, symbol, listingId, instrumentId, issuerId, …

{
  "status": "resolved",
  "direction": "symbol_to_listing",
  "queryAt": "2024-07-01T15:00:00Z",
  "asOf": "2024-08-01T12:00:00Z",
  "symbol": "NXT",
  "listingId": "SYN-LST-001",
  "instrumentId": "SYN-INS-001",
  "issuerId": "SYN-ISS-001",
  "shareClassId": "SYN-CLS-A",
  "venueMic": "XNAS",
  "currency": "USD",
  "assignmentId": "SYN-ASG-200",
  "revision": 1,
  "changeKind": "administrative"
}

Showing 14 of 21 fields.

Diagrams

Ticker-Change Chain Resolution — article hero
Ticker-Change Chain Resolution — failure guard
Ticker-Change Chain Resolution — worked example

Calculation flow

Ticker-chain point-in-time resolution flow
flowchart TD
    A["Issuer, instrument, listing, and assignment records"] --> B["Validate keys, MIC and currency syntax, UTC instants, and foreign keys"]
    B --> C["Group versions by assignment ID"]
    C --> D["Select greatest revision available by asOf"]
    D --> E{"Latest visible revision active?"}
    E -->|No| F["Remove cancelled assignment"]
    E -->|Yes| G["Keep visible assignment"]
    F --> H{"Lookup direction"}
    G --> H
    H -->|Listing to symbol| I["Filter listing ID and effective interval"]
    H -->|Symbol to listing| J["Filter exact symbol, venue MIC, and effective interval"]
    I --> K{"Exactly one match?"}
    J --> K
    K -->|Zero| L["Reject gap or unavailable evidence"]
    K -->|More than one| M["Reject ambiguous overlap"]
    K -->|One| N["Validate full listing chain for overlaps"]
    N --> O["Return symbol assignment plus listing, instrument, issuer ID, class ID, venue, currency, source, and diagnostics"]
Symbol-assignment revision lifecycle
stateDiagram-v2
    [*] --> Announced
    Announced --> Available: source record ingested
    Available --> Scheduled: effective time not reached
    Available --> Effective: effective time reached
    Scheduled --> Effective: effective time reached
    Available --> Revised: later revision becomes available
    Scheduled --> Revised: later revision becomes available
    Effective --> Revised: correction becomes available
    Revised --> Scheduled: corrected active revision is future-effective
    Revised --> Effective: corrected active revision covers query time
    Revised --> Cancelled: latest visible revision cancels plan
    Cancelled --> [*]
    Effective --> Expired: exclusive valid-to reached
    Expired --> [*]

How it works

This page states the contract — how to call it correctly. The article explains the concept: why it works, and where it breaks.

Read the article →

References

  • ISO 10383 Market Identifier Codes — SWIFT as ISO 10383 Registration Authority, published through ISO 20022
  • ANNA ISIN Uniform Guidelines — Association of National Numbering Agencies (ANNA), ISO 6166 Registration Authority
  • ISO 6166:2021 — International Organization for Standardization
  • Financial Instrument Global Identifier Specification — Object Management Group
  • Nasdaq Symbol Directory Data Fields and Definitions — Nasdaq Trader
  • OTC Equity Daily List User Guide — Financial Industry Regulatory Authority (FINRA)
  • SEC approval of the NMS symbol-selection and reservation plan — U.S. Securities and Exchange Commission
  • Evidence decision