> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sandmark.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Reading the result

> Statistics, the equity curve, positions, trades and warnings.

A `json` result has six parts. Amounts are in coin unless the field name says `usd`; returns and rates are
decimals (`0.089` is 8.9%).

| Field | What it holds |
| - | - |
| `strategy` | A plain-English description of what ran, generated from the spec rather than its name. |
| `stats` | Performance statistics for the whole run. |
| `equity` | The equity curve, one point per decision time. |
| `positions` | One row per structure opened, with its P\&L and why it closed. |
| `trades` | One row per leg fill, with prices, greeks and IV at entry and exit. |
| `warnings`, `diagnostics` | Data-quality and sample-size flags. |

## strategy

Check this first: it confirms the engine understood your spec.

```json theme={null}
{
  "headline": "Short call",
  "legs": [{ "sentence": "Short 20 delta call, front monthly (last Friday) at least 20 days out" }],
  "lifecycle": [
    "enter whenever flat",
    "close the position when the structure's premium falls -75% below entry",
    "close the position when the call leg's delta rises above 0.45",
    "close the position when days to expiry falls below 2"
  ],
  "sizing": "1 contracts, fixed",
  "costs": "filled at mark, 0.03% taker fee, capped at 12.5% of premium"
}
```

## stats

**total\_return, cagr** `number`

Return over the run, and annualised.

**volatility, sharpe, sortino, calmar** `number`

Annualised volatility of daily returns, and the usual risk-adjusted ratios.

**drawdown** `object`

`max_drawdown`, `avg_drawdown`, `longest_underwater_days`, and the dates the worst drawdown started
(`max_drawdown_start`) and bottomed (`max_drawdown_trough`).

**trades** `object`

Per-leg statistics: `count`, `winners`, `losers`, `win_rate`, `avg_pnl`, `avg_win`, `avg_loss`, `best`,
`worst`, `profit_factor`, `avg_holding_days` and `total_fees`.

**structures** `object`

The same statistics per position. For multi-leg strategies this is the figure that matters: a condor whose
short legs win and long legs lose is one winning position, not a 50% win rate.

**yearly\_returns** `object`

Return per calendar year, keyed by year.

**start, end, duration\_days, initial\_equity, final\_equity** `mixed`

The span actually reported. With `trim_to_first_trade` on, `start` is the first trade, not your requested
`start`.

## equity

```json theme={null}
{ "timestamp": "2026-05-01T08:00:00+00:00", "equity": 0.9997, "equity_usd": 77088.7,
  "cash": 1.0111, "positions_value": -0.0114, "spot": 77111.9, "open_positions": 1 }
```

`equity = cash + positions_value`. `equity_usd` is `equity × spot`.

## positions

One per structure, with the rule that closed it in `reason`, or `expiry` and `end_of_run`:

```json theme={null}
{ "position": "BTC 20-delta covered call-00001", "entry_time": "2026-05-01T08:00:00",
  "exit_time": "2026-05-18T08:00:00", "legs": 1, "expiry": "2026-05-29T08:00:00",
  "net_premium": 0.0114, "fees": 0.000588, "pnl": 0.008513, "reason": "take_profit_75" }
```

## trades

One per leg, with the instrument actually traded:

```json theme={null}
{ "instrument": "BTC-29MAY26-84000-C", "type": "C", "strike": 84000, "quantity": -1.0,
  "entry_price": 0.0114, "exit_price": 0.0023, "pnl": 0.008513, "fees": 0.000588,
  "entry_dte": 28.0, "exit_dte": 11.0, "holding_days": 17.0,
  "entry_delta": 0.212, "exit_delta": 0.084, "entry_iv": 0.358, "exit_iv": 0.354,
  "reason": "take_profit_75", "position": "BTC 20-delta covered call-00001", "tags": ["call"] }
```

Prices are in coin per contract, as Deribit quotes inverse options.

## warnings and diagnostics

Treat these as part of the answer.

| You might see | What it means |
| - | - |
| `only 14 positions: ratio estimates are dominated by noise below ~30` | Too few positions for Sharpe, win rate and the other ratios to be reliable. Widen the window. |
| `multi-leg strategy ...: per-position win rate is 85.2% against 45.4% per leg` | Read `structures`, not `trades`, for win rate. |
| `40 bar-marks were carried forward because the contract had no row` | Some contracts had no mark at a decision time, so the last mark was reused. A handful is normal; many means the strategy trades illiquid strikes. |

`diagnostics` counts the same things as numbers: `fills_total`, `fills_degraded` and `fills_degraded_pct`
(fills priced from a fallback), `stale_marks`, `structure_unresolved` (times the structure couldn't be built,
such as a missing strike or expiry) and `bars_before_first_trade`.

> [!TIP]
>
> A run with `fills_degraded_pct` above a few percent, or many `structure_unresolved`, is telling you the
> market couldn't have supported the strategy as specified. Move strikes closer to the money or choose a more
> liquid expiry.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.