Skip to content

OpenInterestFlow

Preview on the public Rust client. The analytic ships in the engine and is reachable today through the Python wheel and the TypeScript / Node addon; a per-analytic builder on the public Rust thin client (kairos::Client) is tracked on the roadmap. The output tick schema below is stable.

What it computes

Per-contract change in reported open interest. The analytic tracks the open-interest reading the engine publishes for each option contract and emits one tick on every open-interest snapshot, carrying:

  • open_interest (current reading)
  • prev_open_interest (the prior reading)
  • oi_change = open_interest − prev_open_interest
  • oi_change_pct = oi_change / prev_open_interest

The first snapshot per contract has no prior reading to difference against, so it carries warming = true, oi_change = 0, and a NaNoi_change_pct. Consumers gate on warming rather than NaN-probing the relative-change field.

Methodology

Day-over-day open-interest tracking per the CBOE TradeAlert open-interest feature set. Open interest is the count of outstanding contracts for an option series; its day-over-day delta separates fresh positioning (rising open interest) from position unwinding (falling open interest). The relative change normalises the absolute delta against the prior reading so small and large series are comparable.

Inputs

  • The per-contract open-interest snapshot the engine sources from live feed. Open-interest readings ride on the per-contract option subscription, so the analytic consumes them directly without a separate subscription.

Unlike a trade or a quote, an open-interest snapshot carries no condition-eligibility gating: it is a reference reading the engine publishes verbatim.

Output schema (OpenInterestFlowTick)

The field / type / description table below is regenerated from the OpenInterestFlowTick Rust source by docs-site/scripts/inject-doc-tables.ts on every npm run docs:build. Do not hand-edit between the sentinels.

FieldTypeDescription
contractContractResolved contract metadata. Subscribers identify the security by (symbol, expiration, right, strike) on this field — the wire-level contract id is engine-internal and is not surfaced here.
datei32Trading-session date (YYYYMMDD).
ms_of_dayi32Milliseconds since midnight at the snapshot.
open_interesti64Current open-interest reading.
prev_open_interesti64Prior open-interest reading (the value before this snapshot's update). Equal to open_interest on the first observation.
oi_changei64open_interest - prev_open_interest. 0 on the first observation.
oi_change_pctf64(open_interest - prev_open_interest) / prev_open_interest. NaN when prev_open_interest is zero or on the first observation.
warmingbooltrue on the first snapshot per contract — there is no prior reading, so oi_change is 0 and oi_change_pct is NaN. Consumers gate on this flag instead of NaN-probing oi_change_pct; open_interest is always valid. Mirrors the warming convention the volume-anomaly analytic uses for its first emissions.

Configuration (OpenInterestFlowRequest)

Regenerated from the OpenInterestFlowRequest Rust source — see the note above.

FieldTypeDescription
contractsSecurityFilterContracts the subscription tracks.

Operational characteristics

  • Per-tick latency. O(1) — one integer subtract and one divide.
  • Allocation discipline. The per-contract analytic instance holds only the last open-interest reading; no hot-path allocations.
  • Emission cadence. One emission per open-interest snapshot per contract.
  • Replay parity. Deterministic given identical input tick order.

Example

Preview. This analytic ships in the engine and is reachable today through the Python wheel and the TypeScript / Node addon. A per-analytic builder on the public Rust thin client (kairos::Client) is tracked on the roadmap — bare-string symbol filters passed to the analytic accessor will match the other analytics already exposed there. The output tick rows are stable and documented above.

Proprietary. All rights reserved.