Skip to content

Risk Reversal Velocity

Family: Volatility

What it computes

Emits RiskReversalVelocityTick ticks carrying rr25_velocity, direction off chain.

Available on the live, historical, and replay drives.

Methodology

D(RR25)/dt annualized (5.9M sec/yr).

See the methodology overview for the citation index.

Inputs

Chain.

Key outputs

Rr25_velocity, direction. The full field set is in the tick table below.

Output schema (RiskReversalVelocityTick)

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

FieldTypeDescription
rootArc<str>Underlying symbol (interned).
expirationi32Expiration date (YYYYMMDD).
datei32Trading-session date (YYYYMMDD).
ms_of_dayi32Milliseconds since midnight at emission.
rr25_currentf64Current 25-delta risk-reversal under the OTC / Derman-Kani sign convention (call_25d_iv - put_25d_iv). Mirrors IvSkewLeg.
rr25_window_startf6425-delta risk-reversal at the oldest sample inside the rolling window — the velocity baseline.
velocity_per_minutef64Velocity in IV-per-minute: Δrr25 / Δseconds × 60. Sign follows the rr25 convention (positive = call-side skew dominant moving farther from put-skew baseline).
velocity_annualizedf64Velocity annualized to a 252-day / 6.5-hour calendar year: Δrr25 / Δseconds × 5_896_800. The same trading-session-second convention the volatility / historical_vol analytics use.
direction&'static strDirection label ("Steepening" / "Flattening" / "Stable") per the velocity sign + the configurable per-minute threshold.

Configuration (RiskReversalVelocityParams)

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

FieldTypeDescription
contractsSecurityFilterContracts the subscription tracks.
rateArc<dyn RateService>Risk-free rate provider — same Black-Scholes solver wiring as IvSkewParams.
annual_dividendOption<f64>Optional continuous dividend yield. None falls back to zero.
dividend_cache`std::sync::Arc<crate::reference_data::dividend_yield::
DividendYieldCache>`Engine-wired per-symbol dividend-yield cache. Seated at subscribe time by DefaultSpec via wire_dividend_yield. Consulted on the dispatch path only when annual_dividend is None — the per-tick lookup resolves the continuous-dividend carry yield q = D / S from the live underlying spot the analytic already holds (O(1), lock-light, non-blocking). An explicit annual_dividend override always wins.
venuesExchangeFilterExchange / venue admission policy.
emitEmitPolicyEmission policy. Defaults to [EmitPolicy::OnExchangeInterval] at one chain sweep per second per symbol: the per-expiration velocity ladder is a property of the whole chain snapshot, so the per-second event-time cadence carries the full signal without paying a chain sweep per inbound quote. OnEveryTick sweeps per admitted Quote (the per-leg [Self::emit_interval_ms] gate still caps the downstream per-expiration rate). OnClose stays silent: the velocity is the time-derivative of the rolling window, which a watermark does not advance.
target_deltaf64Wing-delta magnitude the picker targets. Default [DEFAULT_TARGET_DELTA] (0.25).
delta_tolerancef64Acceptance band around target_delta. Default [DEFAULT_DELTA_TOLERANCE] (0.05).
window_msi32Rolling window length in milliseconds. Default [DEFAULT_WINDOW_MS] (60_000 ms / 1 minute).
emit_interval_msi32Minimum interval between consecutive emissions per (symbol, expiration), in milliseconds. Default [DEFAULT_EMIT_INTERVAL_MS] (1_000 ms).
direction_thresholdf64Per-minute velocity threshold separating "Steepening" / "Flattening" from "Stable". Default [DEFAULT_DIRECTION_THRESHOLD] (0.001 IV / minute).
spot_cacheSpotPriceCacheShared spot price cache.
calendarArc<dyn MarketCalendar>Market calendar provider.

Example

Python

python
import kairos_thetadata as kt

client = kt.Client.connect(kt.Credentials.from_env())

def on_event(row):
    print(row)

sub = client.live().risk_reversal_velocity(["SPX"]).on_event(on_event)
sub.wait(timeout_seconds=60.0)

TypeScript

typescript
import { Client, Credentials } from "kairos-thetadata";

const client = await Client.connect(Credentials.fromEnv());

await client
  .live()
  .riskReversalVelocity(["SPX"])
  .onEvent((tick) => {
    console.log(tick);
  });

Rust

rust
// Cargo.toml:
//   kairos = "0.1"

use kairos::{Client, RiskReversalVelocityRow};

# fn run() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::connect(("me@example.com", "secret"))?;

let sub = client
    .live()
    .risk_reversal_velocity(["SPX"])
    .on_event(|row: &RiskReversalVelocityRow| println!("rr25_current={}", row.rr25_current))?;
// ... later ...
sub.unsubscribe();
# Ok(())
# }

Proprietary. All rights reserved.