← Back to examples

IV vs RV Analysis

Compare model-free implied volatility with realized volatility and vol-response z-scores.

1. Compute Model-Free IV

from floe import compute_variance_swap_iv

near = compute_variance_swap_iv(near_term_options, spot, 0.05, now_ms)
print(near.implied_volatility)

2. Interpolate to Constant Maturity (Optional)

from floe import compute_model_free_iv

interpolated = compute_model_free_iv(
    near_term_options,
    spot,
    0.05,
    now_ms,
    far_term_options,
    1,
)

print(interpolated.implied_volatility)

3. Compute Realized Volatility from Ticks

from floe import PriceObservation, compute_realized_volatility

obs = [
    PriceObservation(price=600.10, timestamp=float(now_ms - 300000)),
    PriceObservation(price=600.25, timestamp=float(now_ms - 240000)),
    PriceObservation(price=599.80, timestamp=float(now_ms - 180000)),
    PriceObservation(price=600.50, timestamp=float(now_ms - 120000)),
    PriceObservation(price=601.10, timestamp=float(now_ms - 60000)),
    PriceObservation(price=600.90, timestamp=float(now_ms)),
]

realized = compute_realized_volatility(obs)
print(realized.realized_volatility)

4. Track the IV-RV Spread

spread = near.implied_volatility - realized.realized_volatility
print(spread)

5. Vol Response Z-Score

from floe import (
    VolResponseConfig,
    build_vol_response_observation,
    compute_vol_response_z_score,
)

series = [
    build_vol_response_observation(0.21, 0.18, 600.4, now_ms - 2000, 0.20, 600.0),
    build_vol_response_observation(0.22, 0.19, 600.9, now_ms - 1000, 0.21, 600.4),
    build_vol_response_observation(0.23, 0.20, 601.2, now_ms, 0.22, 600.9),
]

result = compute_vol_response_z_score(series, VolResponseConfig(min_observations=3))
print(result.signal, result.z_score)