Price-shock scenario engine for a portfolio-margin position book.
Applies signed mark-price moves, evaluates per-position margin and liquidation
under the netted book model, and simulates cascade liquidations when equity
falls below maintenance margin. All margin and liquidation math delegates to
DeltaCalc.PortfolioMargin.
API Functions
| Function | Arity | Description | Param Kinds |
|---|---|---|---|
cascade | 2 | Simulate cascade liquidations under a price shock until the book stabilizes or is flat. | account: value, shock_pct: value |
apply_shock | 2 | Apply a signed uniform price-move percentage and return per-position post-shock state. | account: value, shock_pct: value |
Summary
Types
Account inputs for stress scenarios.
Cascade liquidation outcome under a price shock.
Portfolio-margin position input, with optional caller-supplied identifier.
Result of applying a uniform price shock to the book.
Per-position state after a price shock.
Functions
Return post-shock equity and per-position margin plus portfolio liquidation status.
Liquidate positions iteratively when shocked equity is below maintenance margin.
Types
@type account() :: %{equity: DeltaCalc.Decimal.input(), positions: [position()]}
Account inputs for stress scenarios.
@type cascade_result() :: %{ shock_pct: Decimal.t(), liquidated_positions: [term()], margin_call: Decimal.t(), survives?: boolean() }
Cascade liquidation outcome under a price shock.
@type position() :: DeltaCalc.PortfolioMargin.position() | %{optional(:id) => term(), optional(:symbol) => term()}
Portfolio-margin position input, with optional caller-supplied identifier.
@type shock_result() :: %{ shock_pct: Decimal.t(), equity: Decimal.t(), positions: [shocked_position()], portfolio_margin: Decimal.t(), liquidation_price: Decimal.t() | nil, portfolio_liquidated?: boolean() }
Result of applying a uniform price shock to the book.
@type shocked_position() :: %{ id: term(), side: DeltaCalc.PortfolioMargin.side(), quantity: Decimal.t(), mark_price: Decimal.t(), margin: Decimal.t() }
Per-position state after a price shock.
Functions
@spec apply_shock(account(), DeltaCalc.Decimal.input()) :: shock_result()
Return post-shock equity and per-position margin plus portfolio liquidation status.
@spec cascade(account(), DeltaCalc.Decimal.input()) :: cascade_result()
Liquidate positions iteratively when shocked equity is below maintenance margin.