Skip to main content

hypercall_margin/portfolio/
mod.rs

1//! Portfolio Margin (SPAN-style) computation.
2//!
3//! Evaluates portfolios under stress scenarios combining spot and vol shocks.
4//! The worst-case weighted loss becomes the scanning risk. Contingency add-ons
5//! (option floor, gamma kicker for near-expiry shorts) are layered on top.
6//!
7//! ## Scenario Grid
8//!
9//! 13 core scenarios (spot: +/-4%, +/-8%, +/-12%; vol: +/-15%, +/-25%, +/-35%, +/-45%)
10//! plus 4 tail scenarios (spot: +/-25% at 0.60 weight, +/-40% at 0.35 weight).
11//!
12//! ## Margin Formula
13//!
14//! ```text
15//! IM = max(scanning_risk, option_floor) + gamma_overlay
16//! MM = IM * 0.85
17//! equity = cash + executed_option_UPNL + executed_perp_UPNL
18//! ```
19
20pub mod config;
21pub mod contingency;
22pub mod equity;
23pub mod evaluator;
24pub mod recovery_planner;
25pub mod settlement_pool;
26pub mod snapshot;
27pub mod span;
28
29pub use config::{
30    PortfolioMarginConfig, PortfolioMarginContingencyConfig, PortfolioMarginGridConfig,
31    PortfolioMarginScenario, PortfolioMarginSymbolOverride,
32};
33pub use contingency::ContingencyMargin;
34pub use recovery_planner::{
35    plan_pm_recovery, PmRecoveryAction, PmRecoveryOpenOrder, PmRecoveryOptionPosition,
36    PmRecoveryPerpPosition, PmRecoveryPlan, PmRecoveryPlannerInput, PmRecoveryReason,
37    PmRecoveryTrigger, RECOVERY_PRIORITY_VERSION,
38};
39pub use settlement_pool::{
40    classify_liquidity_gap, pool_capacity_usdc, pool_target_usdc, pool_utilization,
41    short_option_oi_usdc, utilization_apr, validate_pool_config, PmAccountSettlementFacts,
42    PmFixtureOptionKey, PmFixturePosition, PmLiquidityClassification, PmMarketMarks,
43    PmSettlementFixture, PmSettlementModelError, PmSettlementObligation, PmSettlementPoolConfig,
44    PmSettlementPoolSnapshot,
45};
46pub use snapshot::{
47    account_cash_decimal, market_state_from_snapshot, snapshot_from_account,
48    PortfolioMarginMarketState, PortfolioMarginOptionExposure, PortfolioMarginOptionKey,
49    PortfolioMarginOptionMarketState, PortfolioMarginPerpExposure, PortfolioMarginSnapshot,
50    PortfolioMarginUnderlyingMarketState, PortfolioMarginUnderlyingSnapshot, SnapshotComponentKind,
51};
52pub use span::{
53    compute_extended_risk_grid_from_snapshot, compute_risk_grid_from_snapshot,
54    compute_span_margin_at, empty_portfolio_margin_details, generate_scenarios,
55    has_portfolio_positions, ExtendedRiskGrid, InstrumentRiskRow, ScenarioPnl,
56};