Quantitative Finance · Book 15 · Technology

Research, Data and Risk Platforms

Research, Data and Risk Platforms · Technology

6Reference Data and Symbology Services

In January 2022 the ticker META belonged to an exchange-traded fund. At the end of that month the fund changed its ticker to METV, and on 9 June 2022 a large company that had traded as FB for ten years began trading as META, keeping the same identifier number for its shares. A system that keyed its history by ticker now held, under one symbol, half a year of a fund followed by the history of a different issuer, and nothing warned it: both were valid prices of a security that really did trade as META on those days. This chapter builds the service that prevents that (firm.refdata): it keeps every fact every vendor ever delivered about an instrument, bitemporally; maps every external symbol to a permanent identifier as of a date and as known at a time; assembles a golden copy with the provenance of each value; serves corporate actions as events whose meaning can change before they happen; and keeps the firm’s counterparties the same way. A synthetic universe with planted ticker reuse, a vendor that misses a rename and a mistyped lot size measures what each piece is worth.

6.1 What the reference-data service serves

One Quant Book 1 (chapter 28) defined reference data as everything about an instrument that is not a price, and symbology as the set of identifiers it is known by; One Quant Book 7 (chapter 4) built a security master of permanent identifiers and ticker changes for research. The platform needs the same facts as a service, read by every system of the map of chapter 1: the tick store to name its partitions, trading to know a lot size and a tick, risk to find an instrument’s underlying, post-trade to find its ISIN and settlement currency.

Definition 6.1 (Reference-data service)

A reference-data service is the system of record for instruments, legal entities and corporate actions: it ingests the facts delivered by data vendors and exchanges, keeps every version of each with the time it was valid and the time it became known, reconciles the sources, and answers every other system’s questions about them as of a date and as known at a time.

The reference-data service: vendors’ facts and the corporate-action feed are kept bitemporally under permanent identifiers; a golden copy is assembled field by field with the source of each value, disagreements go to a conflict report, and every consumer asks the service rather than a copy of a vendor file.
Figure 6.1. The reference-data service: vendors’ facts and the corporate-action feed are kept bitemporally under permanent identifiers; a golden copy is assembled field by field with the source of each value, disagreements go to a conflict report, and every consumer asks the service rather than a copy of a vendor file.

The chapter’s universe has 110 listings over 500 trading days: 100 at the start, 10 listed later. Each has a permanent external key (its ISIN in the synthetic data), a ticker, a name, a lot size and a tick. Twelve listings change ticker; five of their old tickers are later given to five of the new listings, as META passed from a fund to a company. Twenty listings split, each announced 10 to 30 days before the split takes effect; one announced split is cancelled.

6.2 Vendors, conflicts and the golden copy

No single source is right about everything. Vendors differ in coverage, speed and care: one receives exchange notices directly and updates tickers the same day, another is better on names and legal details; each makes mistakes the other does not. Two vendors deliver the chapter’s facts. Vendor A is prompt, but mistypes one listing’s lot size (10 instead of 100) for six days before correcting it. Vendor B learns two ticker changes two days late, and misses one rename entirely until three days after its old ticker has been given to a new listing: for 146 days it maps that ticker to the listing that no longer uses it.

Definition 6.2 (Golden copy)

The golden copy of an instrument is the record the reference-data service assembles from its sources, field by field, by stated rules (a precedence of sources per field, validation, manual overrides), with the source of each value kept as its provenance; it is what every consumer reads, while the vendors’ own records are kept beside it.

    def golden(self, pid: int, field: str, valid, known):
        order = self.precedence.get(field, tuple(sorted(self.vendors)))
        for vendor in order:
            x = self.value(vendor, pid, field, valid, known)
            if x is not None:
                return x, vendor
        return None, None

    def conflicts(self, field: str, valid, known) -> list:
        out = []
        for pid in sorted(set(self.keys.values())):
            vals = {v: self.value(v, pid, field, valid, known)
                    for v in sorted(self.vendors)}
            vals = {v: x for v, x in vals.items() if x is not None}
            if len(set(vals.values())) > 1:
                out.append((pid, vals))
        return out
Listing 6.1. The golden copy (the first source in the field’s precedence that has a value, with its name as provenance) and the conflict report (every instrument whose sources disagree). code/firm/refdata/firm_refdata.py

Table 6.1 counts, over the 52 492 instrument-days of the universe and as known each day, how often each source and the golden copy are wrong, and how often the service reports a conflict. With vendor A first for tickers the golden copy is never wrong about a ticker, and the conflict report shows every day vendor B was wrong except the three days it had no value at all. The lot size shows the other side: vendor A is first for lots too, so the golden copy copies its typo for all six days. Precedence chooses whose errors the firm inherits; the conflict report is what catches them, since both sources had a value and they differed on each of those days.

fieldvendor A wrongvendor B wronggolden copy wrongconflicts reported
ticker (A first)01530150
lot size (A first)6066
Table 6.1. Instrument-days, out of 52 492 and as known each day, on which each source and the golden copy disagree with the truth, and on which the service reports a conflict between the two vendors. Data: pl_refdata.golden_quality.

The lot typo also shows why the service is bitemporal rather than a table that is updated. Vendor A’s typo is a fact valid from day 100, delivered on day 100; its correction is another version of the same fact, still valid from day 100, delivered on day 106 (Figure 6.2). Asked about day 103 as known on day 103, the service answers 10, the lot a trading system actually used that day; asked about day 103 as known on day 106 or later, it answers 100, the truth. An updated table can give only the second answer, and every order sized with 10 becomes inexplicable.

Vendor A’s lot size for listing 7, bitemporally: horizontally the date a value is valid for, vertically the time it was known. The typo is valid from day 100 and known from day 100; its correction is valid from the same day and known from day 106. A question names a point: about day 103 as known on day 103 the answer is the typo, 10, the value systems used that day; as known from day 106, the corrected 100.
Figure 6.2. Vendor A’s lot size for listing 7, bitemporally: horizontally the date a value is valid for, vertically the time it was known. The typo is valid from day 100 and known from day 100; its correction is valid from the same day and known from day 106. A question names a point: about day 103 as known on day 103 the answer is the typo, 10, the value systems used that day; as known from day 106, the corrected 100.

Method 6.3 (Running a golden copy)

(1) State a precedence of sources for each field, from their measured accuracy and speed on that field. (2) Keep every source’s value, never only the winner. (3) Report every disagreement to an operations queue the same day, with the values and their sources, and resolve it by evidence (an exchange notice, the issuer). (4) Record a manual override as a source of its own, with its author and reason. (5) Measure each source against the resolved truth, and revise the precedence.

6.3 Symbol resolution through time

Definition 6.4 (Symbol resolution)

Symbol resolution is the mapping of an external symbol (a ticker, a vendor code) to the permanent identifier of the instrument that carried it on a given date, as the firm knew it at a given time.

Both times matter. The valid date answers “which company was META on 3 January 2022?” — a fund. The knowledge time answers “what did the firm believe on the morning it traded?” — which, for a vendor that learned of a change late, may differ from the truth. resolve takes both (Listing 6.2), and the service stores every fact in Book 7’s bitemporal store under an effective-date index, so that “the value in effect on a date” is the last fact valid at or before it, in the version known at the time asked.

class _Effective:
    """Effective-dated values in a firm.pit store: the value in effect on `valid` is the one
    of the latest valid date at or before it, each as known at `known`."""

    def __init__(self):
        self.store = Store()
        self.valids: dict[tuple, list] = {}

    def put(self, entity, field, valid, known, value) -> None:
        v = self.valids.setdefault((entity, field), [])
        if valid not in v:
            bisect.insort(v, valid)
        self.store.put(entity, field, valid, known, value)

    def get(self, entity, field, valid, known):
        v = self.valids.get((entity, field), [])
        for i in range(bisect.bisect_right(v, valid) - 1, -1, -1):
            x = self.store.asof(entity, field, v[i], known)
            if x is not None:
                return x
        return None
Listing 6.2. Effective-dated facts in a bitemporal store: the value in effect on a date is that of the latest valid date at or before it, in the version known at the time of the question. code/firm/refdata/firm_refdata.py

Proposition 6.5 (Today’s mapping is not a history)

Resolving a symbol at every past date with the mapping in effect today returns the instrument that carries the symbol today. It differs from point-in-time resolution exactly on the dates when the symbol belonged to another instrument or to none: before a rename to it, after a rename away from it, and before a reuse of it.

Proof. Today’s mapping is a constant function of the date; point-in-time resolution follows the symbol’s history. They agree on a date if and only if the symbol’s holder on that date is today’s holder. ∎

On the chapter’s universe, sampling every fifth day, resolution with the last day’s mapping names a different listing than point-in-time resolution on 384 of 10 493 ticker-days, 3.7%. Figure 6.3 follows one ticker through its life: it belongs to one listing until day 33, to none until day 176, and then to the listing that reused it.

What ticker T056 resolves to on each day: point in time through the golden copy, with today’s mapping, and in vendor B’s records alone. The first holder renames on day 33 and a new listing takes the ticker on day 176; today’s mapping attributes the whole period to the reuser, and vendor B keeps the ticker on the first holder until day 179. Data: fig_refdata.py.
Figure 6.3. What ticker T056 resolves to on each day: point in time through the golden copy, with today’s mapping, and in vendor B’s records alone. The first holder renames on day 33 and a new listing takes the ticker on day 176; today’s mapping attributes the whole period to the reuser, and vendor B keeps the ticker on the first holder until day 179. Data: fig_refdata.py.

As of September 2026 — A ticker that changed hands

Meta Platforms announced on 31 May 2022 that its Class A common stock would trade on Nasdaq under the ticker META from before the open on 9 June 2022, replacing FB, with its CUSIP number unchanged. The META ticker had belonged to the Roundhill Ball Metaverse ETF, which changed its ticker to METV at the end of January 2022 (press reports, consulted September 2026).

Remark 6.6 (Which identifier to key on)

Tickers are reused; national and international security numbers (the ISIN of ISO 6166) change with some corporate actions and are shared by an instrument’s listings on several venues; the Financial Instrument Global Identifier is assigned once, never changed and never reused. The firm keys everything by its own permanent identifier and stores every external one as a dated attribute, as One Quant Book 7’s security master does.

6.4 Corporate actions as a service

A corporate action is known before it happens, and what is known can change: a split is announced, confirmed, sometimes amended or cancelled. A service that stores only the final record of each action cannot say what a strategy knew on the day it traded.

Definition 6.7 (Corporate-action event, instrument lifecycle event)

A corporate-action event is the reference-data record of a corporate action: its kind (split, dividend, merger, spin-off), its terms, its effective date and its status (announced, confirmed, amended, cancelled), each change of status a new version with the time it became known. An instrument lifecycle event is any dated change to an instrument’s reference data: listing, rename, change of lot or tick, corporate action, delisting, expiry.

    def add_action(self, event: str, pid: int, kind: str, ratio: float, effective,
                   status: str, known) -> None:
        """A new version of event `event`: announced, confirmed or cancelled; the latest
        version known wins."""
        versions = self._actions.setdefault(pid, {}).setdefault(event, [])
        versions.append((known, kind, ratio, effective, status))
        self._actions[pid][event].sort(key=lambda r: r[0])

    def actions(self, pid: int, known) -> list:
        out = []
        for event, versions in self._actions.get(pid, {}).items():
            live = [r for r in versions if r[0] <= known]
            if live:
                _, kind, ratio, effective, status = live[-1]
                out.append((event, kind, ratio, effective, status))
        return sorted(out, key=lambda r: (r[3], r[0]))

    def factor(self, pid: int, start, end, known) -> float:
        """Price adjustment factor for splits effective after `start` and at or before `end`,
        as known: a price at `start` divided by this factor is comparable with prices at
        `end`."""
        f = 1.0
        for _event, kind, ratio, effective, status in self.actions(pid, known):
            if kind == "split" and status == "confirmed" and start < effective <= end:
                f *= ratio
        return f
Listing 6.3. Corporate actions as versioned events: the latest version known at the time of the question decides, and only confirmed splits enter the adjustment factor. code/firm/refdata/firm_refdata.py

In the chapter’s corporate-action feed each split is announced, confirmed three days later, or cancelled. The adjustment factor between two dates is then a question with a knowledge time: for the first split (a four-for-one, announced on day 386, effective on day 412) the factor over the two years is 1 as known on day 385 or 386, and 4 from day 389; the cancelled split never enters it. A backtest that asks the factor with the knowledge time of each decision is point in time; one that asks with today’s knowledge is not, for any signal that uses price levels.

6.5 Counterparties, accounts and the rest

Instruments are half of reference data. The other half is the parties the firm deals with.

Definition 6.8 (Counterparty master)

A counterparty master is the reference-data record of the legal entities the firm deals with: for each, its legal entity identifier (One Quant Book 2, chapter 28), names, parent entity, jurisdiction and the agreements and accounts attached to it, effective-dated and bitemporal like instrument data.

Its first use is aggregation: limits and exposures are set on an ultimate parent, so the parent chain must be right on the date of the exposure and as known when the limit was checked. In the chapter’s example a fund is acquired by a bank’s subsidiary on day 250 and the firm learns it on day 260: asked on day 255 about day 255, the fund’s ultimate parent is itself; asked on day 262, the holding company. Both answers are correct, and a credit report produced on day 255 must be reproducible with the first one (chapter 25).

Example 6.9 (The basket that was not held)

A research note chooses 20 tickers on day 0 (five of which will be renamed and later reused, six of which will split) and asks for the basket’s buy-and-hold return over the 500 days. Point in time, with split factors, the answer is the truth: +23.5%+23.5\%. With today’s ticker mapping and unadjusted prices it is −16.6%-16.6\%, an error of 40.1 points: unadjusted splits alone cost 45.8 points (the right listings, unadjusted, return −22.3%-22.3\%), and today’s mapping alone adds 5.7 (split-adjusted, it returns +29.2%+29.2\%, the reusers’ returns in place of the intended listings’).

The return of the same 20-ticker basket computed five ways: the truth, point in time (equal to it), today’s mapping with split-adjusted prices, the right listings with unadjusted prices, and today’s mapping with unadjusted prices. Data: pl_refdata.basket_backtest.
Figure 6.4. The return of the same 20-ticker basket computed five ways: the truth, point in time (equal to it), today’s mapping with split-adjusted prices, the right listings with unadjusted prices, and today’s mapping with unadjusted prices. Data: pl_refdata.basket_backtest.

6.6 Tutorial: two vendors and a reused ticker

Goal. Build the service from two imperfect vendors and a corporate-action feed, measure the golden copy, and show what point-in-time resolution is worth to a backtest. End state: Table 6.1, Figures 6.3 and 6.4.

  1. Universe: pl_refdata.universe(): listings, renames, reuses, splits and prices.
  2. Deliver: build() feeds vendor A’s and vendor B’s facts and the corporate-action feed into firm.refdata, with the planted defects.
  3. Golden copy: golden_quality(rd, u) for the ticker and the lot size; rd.conflicts on the day of the first reuse.
  4. Resolution: mapping_differs and the life of ticker T056.
  5. Backtest: basket_backtest five ways.

What to change next. Put vendor B first for tickers and count the golden copy’s errors; add a manual override that fixes the lot typo on its second day and check that the override, not vendor A, is the value’s provenance.

6.7 Build: the reference-data service

Purpose. The system of record for instruments, corporate actions and counterparties: the tick store names partitions with it (chapter 4), the data-quality rules check against it (chapter 7), trade capture and post-trade read it (chapters 21–22).

Interface. RefData(precedence) with ingest(vendor, known, valid, key, field, value), pid, value, golden, conflicts, resolve(field, value, valid, known), add_action, actions, factor(pid, start, end, known); CounterpartyMaster with add, name, ultimate_parent.

Rules. Every fact is kept with its valid date and knowledge time, corrections are new versions, never edits; every external key maps to one permanent identifier forever; the golden copy names its source for each value; every disagreement is reported; only confirmed corporate actions adjust prices, as known at the time asked.

Acceptance tests. code/firm/refdata/tests/: permanent identifiers and effective values per vendor; precedence, provenance and conflicts; resolution through a rename and a reuse, and history asked today; a correction as a version; actions announced, confirmed and cancelled and the factor as known; a parent acquired and learned later.

Stretch. Manual overrides as a source; validation rules (a lot size must be a multiple of a round lot) that quarantine a value before it reaches the golden copy; the security master of Book 7 rebuilt from the service’s facts.

Sources and further reading

  • Meta Platforms, “Meta Platforms, Inc. to Change Ticker Symbol to ‘META’ on June 9”, press release, 31 May 2022; press reports of the Roundhill Ball Metaverse ETF’s ticker change, 2022.
  • Object Management Group, Financial Instrument Global Identifier (FIGI), openfigi.com; ISO 6166 (ISIN), described by the Association of National Numbering Agencies.

6.8 Exercises

Exercise 6.1 ★

Of 10 493 ticker-days sampled, 384 resolve to a different listing with today’s mapping. What share is that, and on which kinds of dates does it happen?

Solution

Solution of Exercise 6.1.

384/10 493=3.7%384 / 10\,493 = 3.7\%. It happens on the dates when the ticker belonged to another listing or to none: before a rename to it, after a rename away from it, and before a reuse of it (Proposition 6.5).

Exercise 6.2 ★

Meta’s press release said its CUSIP number would not change with its ticker. Why does that matter to a firm’s reference data, and why is the CUSIP still not the firm’s key?

Solution

Solution of Exercise 6.2.

The CUSIP stayed with the security through the ticker change, so a history keyed by it continues unbroken where one keyed by ticker breaks (or joins another issuer’s). It is still an external identifier: it changes with some corporate actions, is issued by one numbering agency for one market, and does not cover every instrument the firm trades; the firm keys by its own permanent identifier and stores the CUSIP, ISIN, FIGI and tickers as dated attributes.

Exercise 6.3 ★

The first split of the universe (four for one) is announced on day 386, confirmed on day 389 and effective on day 412. What is the adjustment factor over the two years as known on days 385, 386, 389 and 412?

Solution

Solution of Exercise 6.3.

1 on day 385 (nothing known), 1 on day 386 (announced but not confirmed), 4 from day 389 (confirmed), and 4 on day 412.

Exercise 6.4 ★★

Vendor A is first for lot sizes and mistyped one for six days. What does the golden copy serve on those days, what catches the error, and what rule would have stopped it reaching the golden copy?

Solution

Solution of Exercise 6.4.

The mistyped lot, 10, on all six days: precedence copies the preferred source’s errors. The conflict report catches it, since vendor B says 100 on each of those days. A validation rule would have stopped it: a lot size that changes by a factor of ten without a corporate action, or that is not a round lot of the listing’s market, is quarantined for review and the golden copy keeps the previous value meanwhile.

Exercise 6.5 ★★

A fund was acquired on day 250 and the firm learned it on day 260. What is its ultimate parent for day 255 as known on day 255, and as known on day 262? Which answer should a credit report printed on day 255 show when reproduced a month later?

Solution

Solution of Exercise 6.5.

As known on day 255: the fund itself (the acquisition was not yet known). As known on day 262: the holding company, through the bank. The reproduced report must show the first answer, what the firm knew when it printed the report; the second is a correction to report separately.

Exercise 6.6 ★★

Explain the two parts of the basket’s 40.1-point error of Example 6.9, and why they do not add up.

Solution

Solution of Exercise 6.6.

Unadjusted splits turn each split into a fall of 1−1/r1 - 1/r in the price series (a four-for-one looks like −75%-75\%): on the right listings the basket returns −22.3%-22.3\% instead of +23.5%+23.5\%, 45.8 points. Today’s mapping replaces five intended listings by the listings that now carry their tickers, with their own returns from their own first day: split-adjusted, +29.2%+29.2\%, 5.7 points above the truth. Together they give −16.6%-16.6\%, 40.1 points below: the effects do not add because the unadjusted splits fall on the intended listings, some of which today’s mapping has replaced by listings with no split.

Exercise 6.7 ★★★

Coding. Put vendor B first in the ticker’s precedence and rerun golden_quality. How many instrument-days is the golden copy wrong, and why not 153?

Solution

Solution of Exercise 6.7.

150 instrument-days. Vendor B is wrong on 153, but on three of them it has no ticker at all for the new listing, and the golden copy falls back to vendor A, which is right.

Exercise 6.8 ★★★

Find the flaw. “Our backtests use prices adjusted with today’s corporate-action factors. That is safe: a split does not change a company’s value, so adjusting history for it cannot leak information.”

Solution

Solution of Exercise 6.8.

Returns computed from adjusted prices are fine, but a signal that uses price levels is not: with today’s factors, the price before a split is divided by a ratio that was not known then (not even announced), so a rule such as “price below $5” or “near a round number” sees prices the market never showed. Adjust with the factors known at each decision time, or use returns only.

6.9 Problem: The Ticker That Changed Hands

Problem 6.1

Weekend problem — two vendors and a basket

The chapter’s universe of 110 listings over 500 days, its two vendors, the corporate-action feed and the 20-ticker basket.

Part I — The facts.

  1. How many renames, reuses and splits does the universe hold, and how many splits are cancelled?
  2. What two times does every fact carry, and why both?
  3. What does vendor B get wrong, and for how long in the worst case?
  4. What does vendor A get wrong?
  5. Why does the service keep both vendors’ values rather than only the golden copy?

Part II — The golden copy.

  1. On how many instrument-days is each vendor wrong about the ticker, and the golden copy?
  2. Why is the golden copy wrong about the lot size on six days?
  3. How many conflicts does the service report for each field?
  4. Which two listings conflict on day 176, and why?
  5. What would you change in the precedence, and on what evidence?

Part III — Resolution and actions.

  1. On what share of ticker-days does today’s mapping name the wrong listing?
  2. Trace ticker T056 through the 500 days.
  3. What adjustment factor does the first split give, as known before and after its confirmation?
  4. What happens to the cancelled split?
  5. What is the fund’s ultimate parent for day 255, as known on day 255 and on day 262?

Part IV — The verdict.

  1. State the named result: the basket’s return point in time and with today’s mapping and unadjusted prices, and the two parts of the error.
  2. Which of the two errors would a researcher notice first, and which is more dangerous?
  3. What must a backtest ask the reference-data service, and with which times?
  4. What should the conflict report’s owner do with the 146-day disagreement?
  5. In one sentence: why must reference data be bitemporal?
Solution

Solution of Problem 6.1.

  1. 12 renames, 5 reuses, 20 splits, one of them cancelled.
  2. The valid date (from when the fact is true) and the knowledge time (when the firm learned it): the first to ask about the past, the second to reproduce what was believed then.
  3. Two renames two days late, and one rename not until three days after the old ticker was reused: 146 days of a wrong ticker for one listing.
  4. A lot size of 10 instead of 100 for six days.
  5. The vendors’ values are the evidence for resolving conflicts, for measuring each source, and for rebuilding the golden copy under a new rule.
  6. Vendor A never, vendor B on 153 instrument-days, the golden copy never.
  7. Vendor A is first for lots and was wrong; the golden copy takes its value.
  8. 150 for tickers, 6 for lots.
  9. The listing that renamed on day 33 (vendor A: its new ticker; vendor B: still the old one), on the day its old ticker went to a new listing.
  10. Keep A first for tickers (it was never wrong on them), and add validation for lots rather than moving the precedence: A is right about lots everywhere but on those six days.
  11. 3.7%.
  12. Listing 56 until day 32, no listing from day 33 to day 175, listing 100 from day 176; vendor B keeps it on listing 56 until day 178.
  13. 1 before the confirmation on day 389, 4 after.
  14. It never enters the factor; the announcement and the cancellation stay in its history.
  15. The fund itself, as known on day 255; the holding company, as known on day 262.
  16. Named result. The 20-ticker basket returns +23.5%+23.5\% point in time, equal to the truth; with today’s mapping and unadjusted prices it returns −16.6%-16.6\%, 40.1 points wrong, of which unadjusted splits alone account for −45.8-45.8 points and today’s mapping alone for +5.7+5.7.
  17. The splits: a −75%-75\% day is visible at once. Today’s mapping is the more dangerous: the wrong listings’ prices are real and plausible.
  18. The listing of each symbol at each decision date and the adjustment factors, both as known at the decision time.
  19. Resolve it on the first day from an exchange notice, record the resolution, and raise vendor B’s performance on renames with the vendor.
  20. Because the firm must answer both what was true on a date and what it knew when it acted, and the two differ whenever a fact arrives late or is corrected.

6.10 Interview questions

Interview question 6.1 ★ developer, researcher

Why should a firm never key its data by ticker?

Solution

Solution of Interview question 6.1.

Tickers change and are reused: a history keyed by ticker splits one company’s past across symbols and joins different companies under one symbol. Key by a permanent identifier and keep tickers as dated attributes.

What the interviewer is looking for: Reuse and renames; a permanent key.

Interview question 6.2 ★★ developer

Two data vendors disagree about an instrument’s lot size. How should the reference-data service decide, and what should it keep?

Solution

Solution of Interview question 6.2.

By a stated precedence for that field, measured on each vendor’s accuracy, plus validation; report the conflict to operations and resolve it from evidence. Keep both vendors’ values, the winner’s provenance and any override, bitemporally.

What the interviewer is looking for: Precedence with provenance, conflicts reported, nothing discarded.

Interview question 6.3 ★★ researcher

How do corporate actions create look-ahead in a backtest, and how do you avoid it?

Solution

Solution of Interview question 6.3.

Adjusting past prices with factors known only later (a split announced after the decision) changes price levels the strategy saw, and a corporate action applied from its effective date though learned later puts knowledge in the past. Store actions as versioned events and ask for factors as known at each decision.

What the interviewer is looking for: Knowledge time of the adjustment.

Interview question 6.4 ★★ developer, risk

Why does a counterparty master need to be bitemporal? Give an example involving limits.

Solution

Solution of Interview question 6.4.

Limits are set on ultimate parents. If a counterparty is acquired, the exposure aggregates to a new parent from the acquisition date, but the firm learned it later: a limit check made in between was right with what was known, and must be reproducible that way, while the correction shows the exposure the firm actually had.

What the interviewer is looking for: Valid against knowledge time, applied to an aggregation.

Interview question 6.5 ★★★ developer

Design a reference-data service for a firm trading equities, futures and options in several countries: sources, identifiers, storage, golden copy, and how consumers query it.

Solution

Solution of Interview question 6.5.

Sources: exchanges’ reference files, two or more vendors, a corporate-action feed, a legal-entity source. Permanent internal identifiers with every external one (tickers per venue, ISIN, CUSIP, FIGI, vendor codes) as dated attributes; bitemporal storage; a golden copy per field with precedence, validation, overrides and provenance; a conflict queue; corporate actions as versioned events. Consumers query a service by identifier or symbol with a valid date and a knowledge time, never a copied file.

What the interviewer is looking for: Identifiers, bitemporality, golden copy with provenance, a query interface.

Terms defined in this chapter

See all 2333 terms in the glossary