DeltaCalc.StressScenario (DeltaCalc v0.3.0)

Copy Markdown View Source

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

FunctionArityDescriptionParam Kinds
cascade2Simulate cascade liquidations under a price shock until the book stabilizes or is flat.account: value, shock_pct: value
apply_shock2Apply 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

account()

@type account() :: %{equity: DeltaCalc.Decimal.input(), positions: [position()]}

Account inputs for stress scenarios.

cascade_result()

@type cascade_result() :: %{
  shock_pct: Decimal.t(),
  liquidated_positions: [term()],
  margin_call: Decimal.t(),
  survives?: boolean()
}

Cascade liquidation outcome under a price shock.

position()

@type position() ::
  DeltaCalc.PortfolioMargin.position()
  | %{optional(:id) => term(), optional(:symbol) => term()}

Portfolio-margin position input, with optional caller-supplied identifier.

shock_result()

@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.

shocked_position()

@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

apply_shock(account, shock_pct)

@spec apply_shock(account(), DeltaCalc.Decimal.input()) :: shock_result()

Return post-shock equity and per-position margin plus portfolio liquidation status.

cascade(account, shock_pct)

Liquidate positions iteratively when shocked equity is below maintenance margin.