Variance risk premium, split into diffusive and jump legs.

FerroRisk measures the premium between implied and realized variance on one typed path — then decomposes it into the diffusive and jump/tail components that actually drive it.

Why this needs one shared risk path

!

A raw implied-minus-realized number hides whether the premium is diffusive carry or compensation for jump/tail risk.

!

Realized-vol inputs, tenor, and estimator choice have to agree with the implied side or the premium is meaningless.

!

A tradable signal needs a normalized read against a rolling baseline, not just a level.

How FerroRisk handles it

01

Measure realized variance

realized_vol over OHLC bars produces the realized leg on the same tenor and estimator the premium is quoted against.

02

Take the premium

variance_risk_premium(implied_vol, realized_vol, tenor, method) returns a typed VrpRead in both vol-point and variance units.

03

Decompose and normalize

A JumpDiffusionFit splits the premium into diffusive and jump legs via vrp_decomposition, and vrp_zscore scores it against a baseline mean and std.

What makes this FerroRisk-shaped

variance_risk_premium, vrp_decomposition, and vrp_zscore are public crate-root exports.

The jump-diffusion fit reuses the same Merton (1976) parameters the pricing engine already exposes.

Numerical edges fail loud with typed errors rather than returning a silently wrong premium.

Common concerns

Does it only return a single premium number?

No. VrpRead carries the premium in vol-point and variance units, and vrp_decomposition returns the diffusive and jump legs plus the jump share of the premium.

Which realized-volatility estimator is used?

You choose. The RvMethod passed to variance_risk_premium is recorded on the read, and the realized leg is computed with the same method so both sides agree.