Overview

Strategies

The SpreadBuilder constructs multi-leg spreads across the standard taxonomy plus custom legs, over the live IV surface from FerroRisk, with per-leg constraints applied at construction time.

The standard taxonomy

FamilyDescription
VerticalsCall/put debit and credit spreads — directional, defined-risk.
ButterfliesLong, short, iron, and broken-wing butterflies.
CondorsIron and regular condors — range-bound premium structures.
Calendars & diagonalsTime spreads across expiries, with optional strike offset.
StranglesShort and long strangles for vol exposure.
CustomArbitrary multi-leg combinations with per-leg ratio support.

The eight screener strategies

The universe screener composes the construct/rank pipeline across a fixed set of named strategies per name:

  • BullCallDebit · BearPutDebit — directional debits.
  • BullPutCredit · BearCallCredit — directional credits.
  • IronCondor · ShortStrangle — premium-selling, range-bound.
  • CallCalendar · PutCalendar — time spreads.

Construction constraints

Feasibility is enforced at construction, not after ranking. A SpreadBuilder policy fixes the strategy and its per-leg constraints; infeasible combinations are pruned against the bid-ask grid before pricing:

use ferro_spread::{SpreadBuilder, SpreadStrategy};

let policy = SpreadBuilder::default()
    .strategy(SpreadStrategy::IronCondor)
    .iv_rank_floor(0.65)        // regime gate
    .target_pop(0.70)           // 70% probability
    .wing_width_pts(10.0)       // $-space wings
    .short_strike_delta(0.16);  // ~1σ tails

let condors = policy.construct(&chain)?;
// Empty Vec when iv_rank < floor — the gate is embedded
// in the policy, not in caller code.
Note

Regime gates like iv_rank_floor live in the construction policy, so a low-vol regime simply returns no condors rather than forcing the caller to special-case it.

Next