# `DeltaCalc.StressScenario`
[🔗](https://github.com/ZenHive/delta_calc/blob/v0.3.0/lib/delta_calc/stress_scenario.ex#L1)

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` |

# `account`

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

Account inputs for stress scenarios.

# `cascade_result`

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

Cascade liquidation outcome under a price shock.

# `position`

```elixir
@type position() ::
  DeltaCalc.PortfolioMargin.position()
  | %{optional(:id) =&gt; term(), optional(:symbol) =&gt; term()}
```

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

# `shock_result`

```elixir
@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`

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

# `apply_shock`

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

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

# `cascade`

```elixir
@spec cascade(account(), DeltaCalc.Decimal.input()) :: cascade_result()
```

Liquidate positions iteratively when shocked equity is below maintenance margin.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
