Ticker-Change Chain Resolution
Install and import
npm install fintech-algorithmsimport { 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
{
"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
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.
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