Appearance
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_interestoi_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.
| Field | Type | Description |
|---|---|---|
contract | Contract | Resolved 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. |
date | i32 | Trading-session date (YYYYMMDD). |
ms_of_day | i32 | Milliseconds since midnight at the snapshot. |
open_interest | i64 | Current open-interest reading. |
prev_open_interest | i64 | Prior open-interest reading (the value before this snapshot's update). Equal to open_interest on the first observation. |
oi_change | i64 | open_interest - prev_open_interest. 0 on the first observation. |
oi_change_pct | f64 | (open_interest - prev_open_interest) / prev_open_interest. NaN when prev_open_interest is zero or on the first observation. |
warming | bool | true 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.
| Field | Type | Description |
|---|---|---|
contracts | SecurityFilter | Contracts 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.