VEEMANDocs
DocumentationSupportOpen Dashboard

Getting started

  • Introduction
  • Quick start
  • Core concepts

Importing data

  • Supported formats
  • How import works
  • Splitting a file
  • Troubleshooting

Building your portfolio

  • Workspace & equity
  • Weights & capital
  • Weekday filter
  • Library
  • Variants & comparison
  • History (undo/redo)
  • Shared spaces

Analytics

  • Metrics reference
  • Charts (deep-dive)
  • Monthly P&L
  • Correlations
  • Strategy comparison
  • Monte Carlo
  • Equity Control
  • Optimization
  • Veeman AI

Reference

  • Keyboard & command palette
  • Exporting data
  • Settings

Technical

  • Architecture
  • API reference
  • Security
  • Your data & privacy
  • Risk disclosure
← PreviousMetrics referenceNext →Monthly P&L

Charts (deep-dive)

The Workspace shows the trajectory. The deep-dive charts show what the trajectory hides — the shape and stability of the returns behind it.

Distribution of daily P/L

The percentile histogram shows the full shape of one entity's daily P/L — what a single Sharpe number can't tell you: how fat the tails are, whether losses cluster, and how symmetric (or not) the strategy is. A long left tail is a warning that average statistics flatter the strategy. Pick a strategy (or the portfolio) from the selector and its dollar P/L is drawn as equal-width bins.

A bins toggle sets the resolution — 20, 40, 60 or 80 bins (default 60). More bins resolve the true shape of the mass; fewer smooth it into a coarse silhouette. The bin width scales automatically so the bars always tile the selected range with no gaps.

A range toggle controls what the bins span:

  • P1–P99 (default) — the bins run from the 1st to the 99th percentile, a zoom on the typical day that ignores the extreme 1% on each side (those days fold into the edge bins, and a note reports how many). Bin width is (P99 − P1) / bins: a strategy whose P1 is −2,000 and P99 is +3,000 split into 60 bins gets ~$83-wide bins. This opens on the central mass so a single freak day doesn't squash the shape from the start.
  • Min–Max — the bins run from the worst single day to the best single day, so a strategy whose biggest winning day is +20,000 actually has bins reaching +20,000. Nothing is hidden: every extreme is a visible bar. The bin width is (Max − Min) / bins. This is the real distribution — read it knowing that one freak day can stretch the axis and squash the central mass to the left.

Two outlier toggles (< P5 and > P95) go a step further: where the range toggle only reshapes the bins and folds the extremes into the edge bars, these actually remove the outlier days from the view. < P5 drops the days below the 5th percentile (the negative outliers), > P95 drops those above the 95th (the positive outliers). They are independent, so you can hide one tail, the other, or — with both on — isolate the P5–P95 body and see only the everyday days. The cut points are the P5/P95 of the full distribution, so they stay fixed no matter what you hide, and a note under the chart reports how many days each toggle removed. When a tail is clipped, the bins span exactly to its P5/P95 edge; the untouched side still follows the range toggle above.

The readout above the chart lists the true Min and Max alongside P5, P25, the median, P75, P95, the bin width and the number of observations — so the real extremes are never out of sight even in the trimmed or clipped view. Bars are tinted by sign — green where the bin is a gain, red where it is a loss — and five percentile flags (P5, P25, P50, P75, P95) are drawn as markers across the bars.

Distribution moments

A second readout row carries the shape of the distribution — the numbers a percentile ladder alone doesn't give you:

  • Mean and Std. dev. (in $) — the average daily P/L and its dispersion.
  • Skewness — the asymmetry. Negative means a long left (loss) tail; a strongly negative skew warns that average statistics flatter the strategy.
  • Excess kurtosis (kurtosis − 3) — the tail weight. Above ~1 the tails are fatter than a normal distribution's, so extreme days are more likely than a Gaussian would suggest.
  • CVaR 95% (in $) — the mean of the days at or below the 5th percentile: the average loss on the worst 5% of days. It pairs with the P5 in the readout above, which is exactly the 95% VaR in dollars — P5 is the threshold, CVaR the average of the tail beyond it.

Skewness and kurtosis are dimensionless, so they read the same in dollars or percent. The moments are computed on the full traded-day series, independent of the range and outlier toggles above — clipping the outliers reshapes the bars but must not silently deflate the kurtosis or CVaR you are reading.

Exposure: the contracts behind the numbers

Every dollar figure in the readout — Min, P5, the median, CVaR, the standard deviation — is measured on the leg at the size it currently carries in the Workspace, not on a single lot. A strategy set to 10 contracts has a distribution ten times wider than the same strategy at 1: nothing is wrong, the numbers are simply denominated in the exposure you chose. So each selector pill carries its exposure as a badge (×10 for a fixed-contract leg, cap 3.0% for a dynamically sized one, the leg count for the portfolio), and a line under the selector spells out what the drawn distribution is standing on. If a leg belongs to a group, the group scale is shown too, together with the effective contracts it produces.

Hovering a pill (tapping the caret on touch) opens the exposure knob, and the knob is the ± contracts editor of the Workspace rail — fixed-size legs only. Changing it does not touch the session: the histogram redraws locally and Apply to Workspace writes the new size to the live session in a single write (only the contracts, one Timeline entry however many strategies you changed), while Discard drops it. An amber strip lists everything not yet applied.

The preview is exact rather than an approximation: the leg contributes contracts × series, so scaling its equity by new / current is precisely what the server would recompute — manual costs included, since they are netted per contract before the multiplier. From 0 contracts there is nothing to rescale (the leg is flat), so that one case only resolves by applying.

Two cases have no knob at all:

  • Dynamically sized legs (risk / margin) open a read-only panel: sizing mode and current Cap %, nothing to edit. Their lever is the Cap, not the contracts (weight is ignored by the engine there) — and the Cap is not previewable, because P/L is not linear in it: contracts are whole numbers, min/max clamps bite, the daily loss budget interferes and the sizing capital compounds with realised P/L. A knob that can't show you what it changes doesn't belong in a what-if panel, so the Cap is set in the Workspace and the histogram simply states the exposure it drew at.
  • The portfolio pill previews only when every visible leg is on fixed contracts. With a dynamically sized leg in the mix, the aggregate isn't a linear sum any more (the sized legs' allocation depends on the running capital, which includes the other legs' P/L), so the aggregate stays at the session values until you apply.

Daily P/L, traded days

The histogram and its moments are built on daily P/L (equity[i] − equity[i-1]) over the days the entity actually traded (P/L ≠ 0) — weekends and idle no-position days are dropped, so a selective strategy doesn't pile a spike on the $0 bin and drag its median, quartiles and deviation toward zero. Days where a strategy traded more than once are summed into that day's value: trade-level P/L is aggregated to daily totals at import, so the histogram bins trading days, not individual trades. For the same tail risk expressed as a percent return on capital, see the account VaR / CVaR on the Metrics page.

Stability over time

Rolling windows of Sharpe and volatility show whether the edge is steady or drifting. A Sharpe that was earned entirely in one regime — and faded afterwards — looks very different here than in the single headline figure.

Business-day windows

Unlike the distribution above, the rolling Sharpe and volatility keep every business day (weekends dropped, but idle no-trade days kept). These are time-based, annualised metrics on the 252-trading-day convention: an idle day legitimately weighs on time-based performance, and dropping it would break the ×√252 annualisation. The windows are counted in trading days.

What to look for

A robust strategy tends to show a roughly stable rolling Sharpe and volatility. Big step-changes often mark a regime the strategy depended on, or a structural break worth investigating.

Time under water

The underwater view plots how far below the prior peak equity sits, over time — and therefore how long recoveries take. Two strategies with the same max drawdown can feel completely different if one recovers in weeks and the other stays under water for months.

Market convexity

Every other chart on this page looks at the portfolio in isolation. This one plots it against the market: each dot is a trading day — the benchmark's intraday range on the x-axis, the portfolio's response on the y-axis. The move is the day's range from open to close (close − open), not the close-to-close return: an intraday book responds to how far the market travelled within the session, not to the overnight gap. A % / $ toggle puts both axes in the same unit (so you're never comparing a percentage against a dollar figure), and either way the two are anchored to the portfolio's own capital at the start of that day:

  • Percent — x is the index's intraday range (close − open) / open, y is the portfolio's daily return (its P/L over that day's capital). The capital cancels, so this view is capital-independent and the slope reads as a classic beta.
  • Dollars — x is the P/L that intraday range would have produced had you invested that day's portfolio capital in it (SPX/SPY), y is the portfolio's actual daily P/L. Both are the dollar move the same book would feel.

A quadratic least-squares fit y = a·x² + b·x + c is drawn through the cloud, and the sign of its curvature a is the headline:

  • Concave (a < 0) is a short-gamma signature — the book makes small, steady money in the middle and loses on both tails, worst of all on big down days. This is the classic shape of a premium seller.
  • Convex (a > 0) is long-gamma — flat-to-slightly-negative in calm markets, paying off when the market moves hard in either direction. This is the shape of a long-option or trend book.

The readout also shows the linear beta — the slope of a straight-line fit through the same cloud, computed on its own (not the quadratic's b coefficient) — dimensionless in both units: in percent it's the portfolio's return per +1% of index intraday range (≈ market beta), in dollars it's dollars of P/L per $1 of index range (a capture ratio). Alongside it are the fit's R² and the fit sampled at a −2% / 0 / +2% range day for a concrete read — in dollars that ±2% range is priced at your latest capital, so it reads as dollars on today's book. Below the chart, a stress-day table lists the days whose intraday range was at least ±1.5% (the range is always shown as a percentage there, since that's how the threshold is defined), with the realized portfolio response on each — the days where the convexity signature shows clearest — plus the hit rate (share of those stress days that still closed positive).

Day drill-down

Every dot is clickable — and so is every row of the stress-day table. Clicking one opens a day-detail panel: the benchmark's move, the portfolio's P/L, and one row per strategy that was in the market that day, worst P/L first, each with a diverging bar and its exact dollar P/L. This is the tail-forensics tool: pick the worst dot in the bottom-left of the cloud and see who was in the room — whether one strategy took the whole hit or several crowded the same tail.

Each traded row also shows the day's percentile rank inside that strategy's own traded-day distribution (midrank on ties): P05 means the day was among that strategy's 5% worst, P95 among its 5% best. The rank is what makes the dollar figure readable — a −$400 day is routine for a strategy whose P5 is −$2,000 and an all-time disaster for one that never lost more than $450. It is hidden (—) when a strategy has fewer than 20 traded days. Strategies with no position that day (an exact $0 P/L, the same rule the scatter uses to drop no-position days) are listed apart, since sitting a bad day out is a fact worth seeing too.

The per-strategy daily P/L is additive — each is the first difference of its own equity, and they sum to the portfolio's — so the rows sum exactly to the portfolio's P/L for that day: an exact attribution of a single day, on the same business-day basis as the scatter. Clicking the same dot (or row) again, or the ✕, closes the panel.

How the benchmark move is computed

The benchmark data comes from the same /benchmark endpoint the Workspace overlay uses (S&P 500 or SPY, toggled above the chart). Alongside the buy-and-hold curve, the endpoint ships the day's intraday range (close − open) / open from the raw (unadjusted) OHLC — a per-day quantity, so it needs no previous day. The range is what lands on the x-axis; the chart pairs it with the portfolio on the business-day basis — expressing both as returns (percent) or as the dollar P/L of the portfolio's same start-of-day capital (dollars), per the toggle. Non-trading days carry no real open/close and are dropped. If the OHLC feed is momentarily unavailable, the chart falls back to the close-to-close return reconstructed from the buy-and-hold curve.

No-position days are excluded

The equity curve is built on a full calendar and zero-fills the days a strategy didn't trade, so a selective strategy has many business days with an exact $0 P/L. Those are not market-response observations — a day the book had no position tells you nothing about its convexity — so this chart drops them (a booked trade is never exactly $0). Keeping them would pile hundreds of dots on the y = 0 line, flatten the fit, and make a big-move day the strategy sat out look like a $0 reaction. A note under the chart reports how many days were excluded, and the observation count is the number of days actually traded — the same traded-day basis the account VaR/CVaR on the Metrics page uses. It is only Annual volatility that keeps every business day, because it is a time-based annualised figure tied to the engine's bdate_range basis.

Pair it with Monte Carlo

These charts describe the path you got. To see the range of paths you might have got — and typical vs. worst-case drawdowns — run Monte Carlo.