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
← PreviousTroubleshootingNext →Weights & capital

Workspace & equity

The Workspace (/analysis) is where your live session comes together: the aggregated equity curve, a KPI strip, and a vertical funnel into every analysis module.

How strategies aggregate

Each strategy is a daily P/L series. In the default fixed regime the portfolio curve is built by summing the weighted daily P/L across strategies, then accumulating it on top of the initial capital:

portfolio_daily_pl(d) = Σ  weight_i × strategy_i_daily_pl(d)
equity(d)             = initial_capital + cumulative_sum(portfolio_daily_pl up to d)

This is additive (P/L dollars are summed), not compounded — so the shape of the curve comes directly from your trades, and the initial capital sets the baseline they build on.

Strategies can also be switched, one by one, to dynamic sizing (risk- or margin-based per-trade contracts); fixed and sized legs mix freely in the same portfolio. The composition rules — daily risk budget, compounding, margin — are detailed in Weights, sizing & capital.

Per-strategy curves too

Alongside the combined curve, each strategy has its own equity line (its weighted P/L — or its sized realized P/L — on the same capital base), so you can see who contributes what. Its metrics — the rail tooltip and the detail panel (Sharpe, CAGR, Max DD, win rate…) — are measured on that same real equity, so they reflect the active weight, dynamic sizing and compounding, not a standalone one-contract figure. With compounding on, a leg's contract count follows the whole account, so its per-strategy metrics depend on the rest of the book and shift as you change the other strategies. An excluded strategy is measured on its own (single-leg build) since it isn't part of the portfolio.

A dynamically-sized leg under compounding is sized against the whole account (its contracts grow with total capital), so its percentages — drawdown, volatility, VaR/CVaR, CAGR, return — are measured on the capital it actually risks (the running account), not on the fixed starting capital: otherwise the leg's real dollar swings, divided by the small initial base, would blow past −100% and read as nonsense. Its dollar figures (net P/L, max drawdown in $) stay the real contribution. Under fixed sizing or with compounding off nothing changes — the equity stays on the initial capital base.

The strategies rail

The left rail lists every strategy in the current session. Below the Add / Details actions, a master toggle (Enable all / Disable all) shows or hides every strategy at once.

The tabs at the top of the rail choose which composition you are working on: Current is the live session, and each variant is a parallel scenario. Everything described in this section — rows, groups, sorting, adding, detail panels — works identically on a variant's tab, writing to that variant and leaving your live session untouched.

The Add action opens a menu rather than jumping straight to a file picker. Load CSV sits at the top to import a new file; below it the menu offers what you have already saved — the strategies in your library and any saved backtests from Research — so you can drop one into the current session in a single click. When you have nothing saved yet the menu simply points you to Load CSV. Either way the chosen strategy is appended to the session you are already working in; entries already in the portfolio are marked and cannot be added twice.

The menu stays short as your library grows. Up to eight saved entries it lists them all; beyond that it lists only the ones you used most recently, so it never turns into an endless scroll.

Its last line, Browse the library…, opens the full picker (it is there as soon as you have two saved entries): the same search, tag filters and sort keys as the Library module, each row carrying its period, source and summary metrics, plus tick boxes — pick several strategies and they all enter the portfolio in one go, in one recalculation.

The master toggle's checkbox mirrors the overall state — filled when all are visible, a dash when only some are, empty when none are; the visible/total count in the section header updates accordingly.

Each row has inline controls:

  • Visibility — the dot toggles whether the strategy is included in the aggregated curve and metrics.
  • Sizing regime — the small ×/% toggle switches the strategy between fixed contracts and dynamic sizing. In fixed mode the ± stepper sets the weight (its P/L multiplier). In sizing mode the stepper is replaced by a compact criteria chip (e.g. 2% · SL 100%); clicking it — or switching to % — opens the criteria panel: basis (risk or margin), stop loss (% of premium or $ per contract), per-trade Cap %, optional min/max contracts. The panel commits atomically: nothing recomputes until you press Apply.
  • Costs — the $ chip opens a panel to subtract manual commissions + slippage from that strategy's P/L (for gross exports with no costs baked in). Toggle it on, pick a basis (per contract, per trade, or per day — only the ones the strategy's data supports are enabled) and enter round-turn dollars per unit. When active the chip shows the total (e.g. $4.50/ct) and the net P/L flows into every metric. It commits atomically on Apply. See Metrics · manual costs.
  • Weekday dots — M T W T F switch individual weekdays on or off for that strategy.
  • Rename — the pencil button turns the name into an inline field; press Enter to confirm, Escape to cancel. Renaming only affects the live session; if the new name collides with another strategy it is disambiguated with a numeric suffix. (Double-clicking the name opens the detail panel.)
  • Delete — the trash button removes the strategy from the session (undoable from the Timeline). On a row that is part of a selection it removes the whole selection — see below.

Select rows to edit several at once

Click anywhere on a strategy's row to select it — the row lights up with an accent bar down its left edge. Hold Cmd/Ctrl and click to add or remove individual rows from the selection, or hold Shift and click to take the whole range between the row you last clicked and this one. A counter above the list shows how many rows are selected, with a Clear action; clicking empty space in the list clears it too.

While one or more rows are selected, a change you make to contracts, the sizing regime and its criteria (Cap %, stop loss, margin, min/max) or manual costs on any selected row is applied to every selected row in a single step. This is the fast way to, say, set the same Cap % or the same per-contract commission across a group of strategies at once.

Only the parameters you actually changed are written. The sizing and cost panels open pre-filled with the values of the row you clicked, but those values are just what the panel is showing you — they are not the edit. If you select three strategies, open the sizing panel and set Max contracts to 10, that is the only thing that lands: every strategy keeps its own Cap %, its own stop loss and its own regime. Three cues make the scope readable before you commit:

  • An accent dot appears next to each parameter you have touched — those are the ones that will be written.
  • A parameter whose value is not shared by the selected strategies shows mixed instead of a number, rather than passing off the clicked row's value as everyone's. Type into it and it becomes yours; leave it and it stays untouched on every row.
  • The footer spells out the edit — Applies Max contracts to 3 strategies. Everything else is left as is. — and Apply stays disabled until there is something to write.

Two knobs travel in pairs, because the engine reads them that way: the stop loss in % and in $ are alternative forms of the same stop (the dollar amount wins when both are set), so touching either writes both. The same goes for the margin source and its manual value.

Switching a strategy from fixed contracts to dynamic sizing is the one case where a partial edit makes no sense: a fixed-contract leg has no sizing configuration to preserve, so it receives the whole panel as its new configuration. Selected strategies that are already sized are unaffected by that — they still only get what you touched. The footer says how many rows are in that situation.

In the costs panel, Apply to all is deliberately different: it is a uniform pose, and it forces the complete cost configuration onto every strategy in the session, selection or not.

Deleting works on the selection too. The trash button on a selected row removes every selected strategy, in one step: the button's tooltip says so before you click it, and the confirmation names the count and lists them — Delete 3 strategies? — so you can check the selection is the one you meant before it goes. It is a single action in the Timeline, so one undo brings the whole block back. The trash on a row that is not selected still removes only that row, and leaves the selection alone.

Selecting a row is not the same as showing it: it never changes visibility (use the dot, or the master Enable / Disable all toggle, for that), and the weekday dots stay per-row. Apart from the trash described above, interacting with a row's own controls (the dot, the sizing or cost chip, the weekday dots, rename) acts on that control alone and leaves the selection untouched.

Arrange the strategies

The order of the rail is yours, and it is saved with the portfolio: the chart legend, the detail panel and the composition sheet of a PDF export all follow it. (The strategy table under the charts keeps its own column sorting — that is a table, and its headers are the way you sort it.)

There are two ways to set it, and they work on the same single order:

  • Sort in the rail header applies a criterion in one shot: name (A→Z or Z→A, with digits read as numbers so S2 comes before S10), contracts, CAGR, Sharpe, max drawdown, drawdown p95, number of trades or start date. Clicking the same criterion again flips the direction. Strategies with no data for a criterion — a daily-equity export has no trade count — sort to the bottom rather than to the top. If the current order already matches a criterion the button lights up and the menu marks it, so you can read how the list is sorted without opening anything.
  • Drag a row up or down to place it by hand. A glowing line shows where it will land, and dragging a row that is part of a selection moves the whole selection as a block. Without a mouse, Alt + ↑/↓ moves the focused row one place.

Sorting is an action, not a mode: it rewrites the order once and leaves you free to fine-tune it by dragging. That is also why the highlight disappears the moment you move a row by hand — the list no longer matches any criterion, and saying otherwise would be a lie.

With groups in play, sorting works inside each sleeve: the sleeves keep their own order and never interleave, which is exactly how the rail draws them. Dragging is the one gesture that crosses that line — where you drop a row decides both its position and which sleeve it belongs to, in a single step.

The sleeves themselves are reorderable too, and it is a separate gesture: grab the handle that appears on a group header when you hover it, and drop the sleeve where it should sit. The whole frame moves with its contents, and the order of the strategies inside it never changes. Without a mouse, ⋯ → Move the group up / down and Alt + ↑/↓ on a focused group header do the same thing.

Note

Reordering never changes a single number: the portfolio is a sum, and a sum has no order. It does not change the colours either — each strategy and each sleeve keeps the colour it was given when it first appeared, so moving rows or frames around never repaints the equity and drawdown charts.

Strategy groups

When a book grows past a handful of strategies, the rail can group them into named sleeves — "Iron Condors", "Verticals", "Overnight" — each with a single size knob.

There are three ways to build one, and they all end in the same place:

  • Group in the rail header — always available. It opens a panel that first asks where the strategies should go: a new group, or one of the sleeves you already have (each shown with its current member count). Then tick the strategies and confirm. The same panel opens from a group's ⋯ → Edit strategies with that sleeve already chosen.

    The ticks are always the sleeve's final composition: ticking a strategy that sits in another group moves it (the row says so), and unticking a member takes it out — the way to remove a single strategy without dissolving the whole group.

  • Select and group — click a row, then Cmd/Ctrl-click to add rows or Shift-click to take a range, and press the same Group button. It reads the context: with rows selected it groups them straight away (the button shows the count, so you can tell before clicking), with nothing selected it opens the panel. One button, one place to look.

  • Drag a row onto a group header to move it in — it lands at the top of that sleeve — or drop it between two loose rows to take it out. Dropping between two members of a sleeve does both at once: it joins the sleeve and takes that position. Dragging a row that is part of a selection moves the whole selection. (Drag and drop needs a mouse — on touch, use the panel.)

The group appears as a header row with its members indented underneath.

The size knob

The stepper on the group header scales the exposure of every strategy inside it at once. It is a multiplier, not a rewrite: the individual weights are left untouched, so the ratios inside the group stay exactly as you set them, and returning the knob to 1 restores the starting configuration exactly.

Concretely, with strategy A at 2 contracts and B at 3, a group set to 2 trades them as 4 and 6 — the 2:3 balance is preserved. Rows in a scaled group show the effective value next to the editable one (2 → 4), so the number you read is always the one that actually trades, while the stepper keeps editing the base.

What the knob multiplies depends on each member's regime, because the size lever is different:

  • Fixed contracts — it multiplies the contract count. The result is exact.
  • Dynamic sizing — it multiplies the per-trade allocation (Cap %), since in that regime the contract count is computed per trade and the weight is ignored.

On dynamically-sized legs the multiplier is approximate

For a sized strategy, a knob at 2 roughly doubles the exposure but not exactly the contracts: the count is truncated to whole contracts, and the daily risk budget, the min/max contract bounds and the margin cap can all bite. On fixed-contract legs the multiplication is exact.

An effective allocation above 100% of capital is capped at 100% and the sizing diagnostics below the charts say which strategy was clamped, so a knob that has stopped multiplying never passes silently.

Organising with groups

The group header also carries:

  • Collapse — the caret folds the sleeve away. On a long book this is where the ordering pays off: three folded groups read at a glance where fifteen loose rows do not.
  • Reorder — the handle on the left of the header (it appears on hover, from two groups up) drags the sleeve to a new place in the rail: the frame travels with everything inside it, and the members keep their relative order. Dropping it on another group header puts it before or after that sleeve depending on which half you release over; dropping it below the last group parks it just above the ungrouped rows. On touch — where drag and drop does not exist — ⋯ → Move the group up / down writes the same order, as does Alt + ↑/↓ with a group header focused.
  • Visibility — the checkbox includes or excludes every member at once, and shows a dash when only some of them are visible.
  • Isolate (solo) — shows this sleeve's strategies and hides everything else, so you can read the group on its own.
  • Hide / Show the strategies — mutes the sleeve without disturbing the rest.
  • Merge into one strategy — turns the sleeve into a single independent strategy (see Merging a sleeve below).
  • Dissolve — deletes the group only. No strategy is ever removed: the members simply become ungrouped again, with their base weights intact. If the knob was not at 1, their exposure returns to the base value.
  • Delete group and strategies — the other way out of a sleeve, right below Dissolve: it removes the frame and every strategy inside it from the session. The confirmation names the group, counts the strategies and lists them, and it is a single action in the Timeline, so one undo brings the whole sleeve back. On an empty group it behaves exactly like Dissolve — there is nothing inside to remove. The saved library is never touched.

Groups are part of the portfolio recipe: they are saved with it, frozen into variants, carried by the shareable CSV, and undoable from the Timeline. A strategy belongs to at most one group, and groups do not nest.

A group reads like a strategy

Hovering a group's name opens the same panel a strategy gets: the sleeve's equity and drawdown sparklines plus its Sharpe, CAGR, win rate, max drawdown and DD p95 — so you can ask "is this sleeve pulling its weight?" without unfolding it.

Double-clicking the name goes further and opens the group's detail panel: the cumulative equity and drawdown charts of the whole sleeve, the full institutional metric set (Sortino, Calmar, volatility, profit factor, k-ratio, VaR/CVaR, drawdown durations, daily statistics) and the list of its member strategies. It mirrors the per-strategy detail panel field for field, so a sleeve and a strategy can be read side by side.

Renaming a group lives in its ⋯ menu, alongside the other sleeve actions.

The sleeve's equity is the sum of its visible members' contributions. Hiding a strategy takes it out of its group exactly as it takes it out of the portfolio, and a fully hidden group has no equity to measure (the panel says so rather than showing zeros).

A contribution, not a standalone

With compounding on, each member is sized against the whole account, so a group's metrics describe what that sleeve contributed to this book — not what it would have done on its own. They therefore move when you change the other strategies. This is the same convention as the per-strategy metrics described at the top of this page.

Merging a sleeve into one strategy

A group already reads like a strategy. ⋯ → Merge into one strategy makes it one: the sleeve's curve becomes a new, independent strategy in the rail, which you can then save to the library, rename, weight, compare, export, or carry into another portfolio like any other leg.

The new strategy carries the group's daily P/L exactly as the sleeve reports it — the visible members, with their weights, the group's size knob, any dynamic sizing, the manual costs and the weekday filters already applied. Its Sharpe, CAGR, drawdown and win rate therefore match the numbers the group header was showing, to the last decimal. Costs are not re-applied on top: they are already inside the series.

The panel asks the one question that changes the session:

  • Keep the group and its strategies — everything stays where it is and the new strategy joins the rail muted. That is deliberate: active, it would add its P/L to the members that are still in the portfolio, counting the same money twice. When you want to switch over, turn it on and hide the group — the portfolio total is identical either way.
  • Consolidate into the new strategy — the merged members leave the session and the new leg takes their place, active. The portfolio does not move by a dollar; the empty frame is pruned.

Either way it is a single entry in the Timeline, so one undo puts the whole sleeve back, members and frame included.

A merge is a snapshot

From the moment it exists, the merged strategy is a fixed daily series: it no longer follows the members' knobs, and changing the group afterwards does not change it. Two consequences worth knowing before you press:

  • Dynamically sized members are frozen at the contracts computed right now. The merged leg is a fixed-weight strategy — it will not re-size as the account grows. Its dollars stay identical, but under compounding its percentages are re-based: a sized sleeve measured them against the capital actually employed, a fixed leg measures them against its own equity, so Sharpe, CAGR and drawdown % can shift slightly after the merge.
  • The per-trade book does not survive the merge. Once sizing is applied, the members' trades no longer describe the merged series, so it is dropped rather than kept misleading — and with it goes the margin. The merged leg uses no margin and cannot itself be sized on premium or margin.

Only the visible members are merged, since they are what makes the sleeve's numbers. Muted members are therefore never deleted: consolidating leaves them in the session, ungrouped.

Groups on the chart

Once the session has a group, a groups button joins strategies and portfolio above the equity chart — the three sit in the order they aggregate: strategy → sleeve → portfolio. Turning it on draws each sleeve's cumulative equity on the equity chart and its drawdown on the drawdown chart, so you can see how the blocks of the book move against each other instead of reading fifteen individual lines.

Group lines are solid and thicker than the per-strategy ones, and use their own colours — the same ones that mark the sleeve in the rail — so the two levels never get confused. They follow everything else on the chart: the time range, dollars/percent mode and align starting capital (each sleeve rebases with its own regime, proportional only when it contains dynamically-sized legs under compounding). Hovering a sleeve highlights its equity and its drawdown together.

Which levels are on is remembered: turn on strategies, walk over to Metrics or Monte Carlo and come back, and the chart is still drawn the way you left it — the choice survives reloads and new sessions too, since it is how you read a book rather than part of any one portfolio. A remembered groups choice simply lies dormant in a book with no sleeves and lights up again as soon as one exists.

The correlation matrix can also switch to one row per group, which is where sleeves pay off most on a large book.

Groups vs. multi-selection

They complement each other. Selection is the throwaway gesture: pick any rows, apply one change to all of them, done. A group is the durable version: a name, a place in the rail, and a knob that stays. Use selection for a one-off edit across unrelated strategies, a group for a sleeve you will keep tuning.

Once at least one strategy uses dynamic sizing, a Sizing control appears in the workspace header with the portfolio-level parameters (daily risk budget, compounding — see Weights, sizing & capital), plus the sizing diagnostics under the KPI strip. The charts card always carries a Trades band — the complete portfolio trade log — for every portfolio, fixed or sized (see below).

The KPI band

The band at the top of the chart card has four primary cells, each with a headline value and a small context subline underneath:

  • Total Value — the final equity of the aggregated curve (initial capital plus net P/L). The subline shows the total return versus the initial capital (net P/L ÷ initial capital, with an up/down arrow) together with the CAGR.
  • Max DD — the worst peak-to-valley decline in percent, with the MAR ratio (CAGR ÷ max drawdown) as subline.
  • Sharpe — with the Sortino as subline.
  • Win Rate — the share of profitable days, with the Profit Factor as subline (its dot is green when the factor is above 1, red when below).

Everything is recomputed live as you change weights, capital or filters. The full table with formal definitions is on the Metrics page.

By default the band describes the whole history — even when strategies have different inception dates, so a book where one strategy runs from 2020 and others join in 2022 is measured across the full span (the earlier stretch is not silently dropped). To read the figures for a framed period instead, turn on align starting capital and pick a window (see below): the band then recomputes every figure over that window alone, and a small framed-period marker appears above the cells.

Sizing diagnostics

Under the KPI band, whenever the allocation engine has something to say, sits a single line: a short summary — Sizing · 7 at the contract cap · 1 at the contract floor · 340 trades reduced by the margin cap — and a Details link. It is deliberately one line: those constraints qualify the figures right above them, so the fact that they exist has to be visible at a glance, while the explanations belong in a panel rather than in front of the chart.

The line's tone tells you whether it needs you:

  • Amber, with a warning mark — at least one warning: something has to be fixed. A strategy allocating no contracts, a missing per-contract risk input, a constraint the computation could not honour.
  • Neutral, with an info mark — only notes: declared consequences of your own settings. A contract cap that binds is intended; it is reported because a Contracts column sitting flat is otherwise indistinguishable from a stuck calculation, not because anything is wrong.

Details opens the diagnostics panel, in three blocks:

  • Warnings — one line per message, the actionable ones first.
  • Declared contract limits — the explanation stated once, then a table with one row per strategy: which limit bound it (cap or floor), how many of its trades the limit decided, the share of the book that represents, and the P/L effect (below). See the trades on a row drills into those very trades — date, time, wanted → taken contracts, risk with its share of capital, per-contract P/L, P/L, the trade's own P/L effect, committed margin (when those trades carry margin data) and running capital — so every figure in the summary is verifiable row by row rather than taken on trust. A ⊘ there means the margin cap trimmed that trade further, so its final contracts sit below the declared cap and the margin shown is the trimmed one. The margin column carries no total: margin is a concurrent quantity of the day, so adding it across trades from different dates would not describe anything real.
  • Margin cap — the cap's own messages plus the full reduced-trades list (see Margin employed).

What the limit cost

The wanted → taken pair is the size capital and the daily risk budget had allocated, next to the size the limit allowed — 47 → 10 says at a glance what the cap did. From it comes the P/L effect: the trade's outcome at the allowed size minus its outcome at the wanted size, carrying the same manual-cost convention as the P/L column. It is signed: negative means the limit cost you, positive means it saved you — a cap biting on a losing trade avoids loss, which is often exactly why it is there. The per-strategy figure in the table is the exact sum of its trades' figures, so the drill-down reconciles with the summary by construction.

It is not the P/L you would have made

The effect is arithmetic trade by trade, not a re-simulation. Under compounding a different size would have changed the account, and therefore every later size; and a bigger size would have been trimmed harder by the margin cap. Read it as the order of magnitude of what the limit moved — not as an alternative result you can bank on by raising the cap.

For the same reason the effect attributed to a limit stops at the limit: when the margin cap trims a trade further, that extra slice stays in the reduced-trades list with its own excluded P/L, so nothing is counted twice.

The risk column pairs the dollar risk with its share of the capital at that moment — it is what makes the floor's message checkable, since that message claims the risk exceeds the declared Cap %.

In the Trades band, a trade whose size was decided by a declared limit carries a small amber dot next to its contract count, with the reason on hover — the signal sits on the number that motivates it.

Dollars or percent

Switch the analysis mode between:

  • Dollars — the curve and figures in account currency.
  • Percent — equity as a percentage return on the initial capital, handy for comparing shapes independently of capital.

The log toggle above the chart (a logarithmic Y axis, useful when the curves span several orders of magnitude) applies to dollars mode only. In percent mode the plotted value is a return that starts at 0 and can sit at or below break-even, and a logarithmic axis has no position for zero or negative numbers — so those points would drop out and the lines would fragment. The toggle is therefore disabled in percent mode; switch to dollars for a clean log view. This is most visible with percentage sizing and compounding, where the curves linger near break-even.

Autosave & the status bar

Whenever the session has unsaved work, the status bar shows a quiet draft saved · hh:mm next to the session name. That is the autosave: every change is mirrored into a draft on your account within a couple of seconds, so closing the tab or a backend restart never costs you the work — reopen the app and you are back exactly where you were, still flagged as unsaved.

Two things it deliberately does not do:

  • It never writes over a saved portfolio. The amber unsaved tag and the Save button keep meaning what they meant: filing your work in the library stays your decision.
  • It does not carry the History timeline. Undo/redo steps live with the in-memory session; after a restart the timeline restarts from the restored state. Anything worth keeping should be frozen as a variant.

If you open the app from another browser — where the session id isn't stored locally — the draft shows up under Resume on the dashboard as an in progress card, alongside your saved portfolios and backtests. Full details in Core concepts.

Working on a shared portfolio

When the portfolio you loaded lives in a shared space, the workspace behaves the same in every respect but one: you take a turn on that portfolio while you work on it. If someone else holds it, a band appears above the workspace saying who and for how long, with Take control.

Nothing is blocked by a turn: it warns so you find out before doing the work twice. What actually protects the work is the save itself, which is refused if someone saved in the meantime and offers you Reload or Save as a copy.

Your draft stays private either way. Autosave never writes into the space.

Starting a new session

The New session button at the top right of the workspace header (next to Export) starts over from scratch. It opens a short menu, because new work does not only arrive as CSV — pick where the new session comes from:

  • Load CSV — one or more files from your computer, exactly as on the upload page.
  • From the library — a saved portfolio, or one or more saved strategies. A portfolio already is a whole session (it carries its capital, mode and weights), so it opens on its own and cannot be ticked together with anything else; loose strategies can be picked several at a time and start the session together.
  • From a backtest — one or more backtests saved in Research, which come in as strategies. This entry only appears when the Research section is enabled.

Whatever you choose becomes a brand-new session: the current one is discarded and replaced, its draft is discarded with it, and the variants registry is emptied — every variant is a snapshot of the portfolio you are replacing, so keeping them would leave another portfolio's curves overlaid on the new one, with the metric deltas measured against them. Saved portfolios and saved strategies in your library are untouched: that is where work you want to keep belongs.

Because that replaces whatever is on the desk, if the current session has unsaved work (a raw upload, or a saved portfolio with changes), it asks whether to save it before continuing. The same dialog tells you how many variants are about to go, when there are any:

  • Save and continue — a raw upload is saved to your library (you give it a name); a portfolio is updated in place. Then the new session opens.
  • Don't save — the current session is lost and the new one opens straight away.
  • Cancel — nothing happens.

When the current session is already a saved portfolio with no pending changes, there is nothing to save, so it opens the new session directly. To add strategies to the existing session instead of replacing it, use Add in the strategies rail; to refresh an existing portfolio with an updated CSV while keeping its customisations, use Update data.

The Library header carries its own New portfolio button. That one is a different gesture: it files a new portfolio into the library from CSVs without touching the session you have open.

Drawdown attribution

The drawdown panel under the equity chart normally draws one coral curve: the portfolio's decline from its running peak. Turn on the strategies toggle above the chart — the same one that splits the equity into a line per strategy — and the drawdown splits with it, into one band per strategy, in that strategy's colour.

Each band is that strategy's P/L since the portfolio's current peak. This is an exact decomposition, not an approximation. On any day the portfolio drawdown is its equity minus its running peak; portfolio equity is initial capital plus the sum of the strategies' contributions; and the capital cancels in the difference. So, day by day:

  • portfolio drawdown = the sum of the bands.

Read it as who is digging the hole. A band below zero is a strategy losing ground since the peak. A band above zero is a strategy that made money while the book was underwater, offsetting the others — which is why the panel can extend above the zero line when that happens.

The coral portfolio curve follows the portfolio toggle, exactly like the aggregated equity above it, so the two toggles compose:

  • portfolio + strategies — the bands with the portfolio total drawn over them.
  • strategies alone — the bands only. The cumulative curve is the sum of what is already on screen, so it is not drawn, and the tooltip drops its row.
  • portfolio alone — the familiar single coral area.

With the total hidden the bands do not change meaning: they are still measured from the portfolio's peak and still sum to the book's drawdown. It is simply not drawn.

Hovering gives the total first, then each strategy's contribution, deepest first, with its share of the drawdown. Those shares can exceed 100% when some strategies offset: a book where one leg digs 130% of the hole while another fills 30% of it back is telling you something the aggregate curve alone cannot. Above the panel, a badge names the worst day in the window — its date, the portfolio drawdown, and the three deepest contributors.

Contribution, not standalone drawdown

A band is not the strategy's own drawdown. It is measured from the portfolio's peak, not the strategy's, so a strategy that peaked on a different day reads differently here than it does on its own. That is the point: this panel answers how much of this decline each strategy is responsible for. For the drawdown a strategy has against its own peak, hover its row in the rail.

The panel follows the rest of the chart: the range selector, dollars or percent, and align starting capital (with align on, the peak resets to the start of the window and the bands reset with it).

Margin employed

Below the drawdown sits a bar histogram of the margin employed — how much capital the portfolio ties up as broker margin, one bar per trading day (days with no trades leave a gap). The bars share the same date axis as the equity and drawdown above, so you can line up a margin spike with what the account was doing. For each day it sums the margin requirement of the trades opened that day (margin is committed when a trade opens) across the visible strategies, scaled by each strategy's weight (the same weighting that builds the equity), so doubling a strategy's weight doubles the margin it contributes:

margin(d) = Σ  weight_i × margin_requirement_i(trades opened on day d)

For strategies in dynamic sizing the contribution is the allocated one instead — contracts × per-contract margin per trade, on the same open-date convention.

Two threshold guides overlay the bars, both referenced to that day's equity (falling back to the initial capital when the day's equity is missing or non-positive): a dashed amber line at 80% — the safety threshold — and a solid red line at 100% — the hard limit, since margin above the account's equity means the broker could not have carried those positions and the day would not have been tradable. In dollars mode the guides are curves that follow the equity (80% and 100% of each day's account value, drawn as steps); in percent mode they collapse to the horizontal 80 and 100 lines. The Y axis always extends to the 100% guide, so the gap between the bars and the limit is readable at a glance. Bars are tinted by state: violet when utilisation is at or below 80%, amber between 80% and 100%, red above 100%; the tooltip adds the utilisation rate (in dollars mode) and a matching note when a day crosses either threshold.

The chart shows the thresholds; the sizing engine can also enforce them. With the margin cap active (80% by default, set per session from the workspace header), the day's sized trades are evaluated in open-time order against the margin in force at that moment — including what is still tied up by positions opened on earlier days and not yet closed — and a trade whose required margin would push the total above the cap is reduced to the maximum contracts the remaining margin allows at that moment, down to 0, meaning the trade is simply not opened; the P/L of the trimmed part is excluded from the calculation. Min 1 contract does not override this: the floor is a size preference, the cap is account capacity — see Weights & capital. The sizing diagnostics under the charts then carry the reduced-trades list — date, strategy, open time, planned and final contracts, required margin, the margin already committed at that moment, the day's limit and the excluded P/L — so you can audit exactly what the cap trimmed. Bars above a threshold therefore come from fixed-contract strategies (whose size is yours) or from days whose non-reducible margin — fixed legs plus positions carried over — the cap could not resolve; details in Weights & capital.

A small badge pinned to the top-right shows the median and mean margin across the trading days in view — the typical amount of capital tied up when the book is on — plus a legend for the two threshold guides and, when any day in view exceeds 100%, a red counter with the number of such non-tradable days. Idle days are excluded from the median/mean (they would drag the median to zero); the badge recomputes as you change the time range.

It reads straight from the trade-level data (the Margin Req. column of Option Omega exports, and any margin column the mapping engine kept from a per-trade CSV), so it appears only when your strategies carry that column — otherwise the panel shows a quiet no margin data note. It follows the same range selector as equity and drawdown (all three move together) but ignores align starting capital, since margin is a physical amount of capital committed, not a running P/L. In dollars mode it is the margin in account currency; in percent mode it is the utilisation rate — margin as a percentage of that day's equity — so you can read at a glance how much of the account is locked up at each moment. The denominator is the day's equity, not the initial capital: with compounding on, contract counts (and margin) grow with the account, and dividing by the initial capital would inflate the rate as the account grows instead of measuring the actual share of capital in use.

Time range

Above the chart, the range selector narrows the equity and drawdown views to a window — both charts always move together. The presets are 1M, 3M, 6M, YTD, 1Y and ALL (the whole history). Each is counted back from the last data point, not from today. The active window is echoed in the card header, next to the title (for a custom window, as its date range).

The custom button (calendar icon) opens a small picker with a from and to date, so you can frame any exact span. Both bounds are inclusive and clamped to the session's available dates; leave one side untouched to extend the window to the first (or last) point. A date typed by hand outside that span (a stray year, or a from later than the to) is pulled back to the nearest available date — the picker warns you and corrects the field, so the window can never end up empty. Picking any preset again clears the custom window.

On its own the range is a pure zoom: every figure in the app keeps reading the full history. Turn on align starting capital (see below) and the range becomes the portfolio's reading calendar instead — the KPI band, the Metrics ledger, the Monthly P&L grid, the Weekday breakdown, the per-strategy register and Strategy comparison all recompute over the framed window alone. The range and the checkbox reset (to ALL, unticked) whenever you load a different portfolio or restore a variant.

Align starting capital

By default the range selector only zooms into a window: the equity still carries the profit and loss accumulated before the window, so a curve framed on the last 6 months can start far above the initial capital. The align starting capital checkbox changes that — it replays the selected window as if every strategy had begun trading at its first day.

Concretely, when the checkbox is ticked each curve (the aggregated portfolio, the per-strategy lines, the benchmark and any pinned variant) is rebased so that:

  • it starts again from the initial capital on the first day of the window (in percent mode, from 0%), and
  • the drawdown is recomputed from that point, with the peak reset to the window start — so it measures the worst decline within the window only, not against an older historical high.
  • the KPI band above the chart re-scopes to the window — Total Value, return, CAGR, Max DD, Sharpe, Sortino, win rate and profit factor are all recomputed over the framed period alone (a framed period marker labels the band). It is the metrics twin of the rebased curve, so the numbers and the chart always agree. This is why the metrics scoping is tied to this checkbox: without it the range selector is a pure zoom and the figures stay full-history.
  • the Metrics ledger re-scopes too — both in the funnel below and on its own page — over the same window and with the same rebase, with a band above the figures naming the active period. So the deep metrics never disagree with the KPI band or the curve.
  • the Monthly P&L grid re-scopes as well, to the same window: only the framed months are listed, the two edge months are partial, and the cells add up to exactly the net profit the ledger reports for that period.
  • the per-strategy register (the Strategies section of the funnel) re-scopes leg by leg: metrics, covered dates, trade count and risk tail describe the framed window, with each strategy's equity re-anchored by its own factor — the same one its line uses on the chart. The visible legs' window profits therefore still add up to the portfolio's.
  • the Weekday breakdown re-scopes: the table and the per-day curves count only the framed days (no rebase there — those statistics are one-contract dollars, so clipping is the whole story).
  • Strategy comparison re-scopes as a block — radar, table, rebased curves and pairwise ρ all move to the same window, because panels covering different stretches would not be a comparison.

What does not re-scope: the strategy rail and its detail modal, which stay on the full history on purpose — they describe the strategy you own, not the period you are inspecting.

The period bar

Scroll past the chart and the checkbox goes with it, so a screen full of figures would be left with no date on it. From the first deep-dive section down, a slim period bar stays pinned under the navigation and answers the only question that matters there — which period are these numbers about? It has two faces:

  • Framed (accent) — the range and its exact dates, plus the modules below read this period only. A Full history button steps back out.
  • Full history (neutral) — shown when a range is selected on the chart but align starting capital is off. It says so in as many words: the 6M range only zooms the chart; the figures below still cover the full history. That state used to be silent, and it is the one that misleads — the chart frames six months while the table underneath reports four years. An Apply to figures button ticks the checkbox without scrolling back up.

With no range selected there is nothing to declare and the bar does not appear. On the standalone module pages, where each page is one module and there is no chart to disagree with, the same statement appears as a band above that module's figures instead.

The rebase asks one question, and asks it of every strategy separately: had the account been k times smaller, would this trade have returned k times less?

  • A fixed-contract leg → no. One contract is one contract, whatever the balance: the P/L would have been identical. Its contribution is carried over untouched.
  • A dynamically-sized leg under compounding → yes. Contracts are a percentage of the running capital, so a third of the account means a third of the contracts. Its contribution is scaled by initial_capital ÷ equity(window start).

The rebased curve is then the sum of those re-anchored contributions:

equity(d) = initial_capital + Σ over legs   k × [ equity_leg(d) − equity_leg(window start) ]

That is not a third regime — it is the two classic ones written once. With every leg proportional the formula collapses to the plain multiplicative rebase initial_capital × equity(d) ÷ equity(start); with none, to the additive shift equity(d) − equity(start) + initial_capital.

Why per leg and not one rule for the whole portfolio. In a mixed book the two parts have to move differently. Applying a single rule to everything scaled the fixed part down along with the rest — measured error up to 52%, worst precisely when the fixed strategies dominate and one small sized leg flips the whole portfolio into the proportional regime. Recomposing leg by leg brings that to about 1%; what is left is cross-compounding (a sized leg sizes on capital that includes the fixed legs' profits), which only a full re-simulation of the window would close. As a bonus the per-strategy lines now add up to the aggregate curve, which under the old single rule they did not.

Contract limits change k, and not by a simple on/off. For a leg carrying a max contracts cap or a min contracts floor, k is not assumed — it is recomputed from the sizes. For every trade in the window the engine kept the size the capital wanted before the limits; that wanted size is scaled by the factor, the limits are re-applied exactly as the engine applies them, and k is the ratio of the resulting sizes to the real ones. Manual costs charged per trade or per day are fixed amounts and keep the leg at k = 1.

Recomputing matters because the two limits behave in opposite directions, so reading them as a flag gets both wrong:

  • a cap that is biting today may not bite at the reduced capital — the rebased size would fall below the cap, not sit on it;
  • a floor that is not biting today will bite at the reduced capital — the size stops at the minimum instead of scaling down.

Measured on a floor that only bit during the first months, with the window on the free stretch: judging from the whole history overstated the period's profit by +588%, and judging only from whether the limit bit inside the window understated it by −83%. Recomputing the sizes closes both.

The margin cap changes k too, whenever fixed legs hold margin. The cap's limit is a percentage of the day's capital, so it shrinks with a smaller account — but the margin committed by fixed-contract legs is a number of dollars and does not shrink at all. At reduced capital that constant base eats a larger share of the limit, so the cap bites earlier than a proportional reading suggests. The recomputation therefore re-applies the cap as well, against the room the smaller account would really have had:

room(f) = f × (day's limit − sized margin already committed) − fixed-leg margin

With no fixed-leg margin the room scales exactly by the factor and this changes nothing — that is the case where treating the cap as invariant was correct. With a fixed base it does: measured on a hybrid book with a binding cap, the framed period was reported up to +76% above a re-simulation of the same window; re-applying the cap brings that to about +11%, the remainder being the constant-factor approximation described below. As in the engine, the min contracts floor is no exception — against margin the question is whether the room exists, not what size you would prefer.

Group ("sleeve") lines and per-strategy lines use the same factors, and the chart is served those very factors by the server rather than guessing them, so every curve, the KPI band, the metrics, the monthly grid and the trades ledger describe the same period.

What this cannot do

The factor is constant across the window, while a rebased account would have compounded its own way inside it. The approximation is excellent when the position size does not explode within the period (1–3% in realistic books) and degrades when it does — on a synthetic window where the size multiplies by sixty, the residual is about 30%. Only re-simulating the window trade by trade would remove it. A binding cap is reported in the sizing diagnostics, naming the strategy and how many trades it limited — a Contracts column sitting flat on the cap is normal, and this says so out loud.

It works with every preset, the custom window and ALL (on ALL it is effectively a no-op, since the window already starts at the beginning of the history). Each pinned variant is recomputed over the same window by the same engine — leg by leg, with its own factors — so its curve and its metrics sit on the same calendar as Current instead of on its whole history. On the equity curve this is a display rebase; the Trades band instead re-anchors its running capital to the window start (and, for dynamically-sized legs, re-simulates the sizing from there), so its contracts, P/L and progressive capital reflect an account that truly began there.

What it answers

"How would the portfolio have gone if I had started from this point in history?" Pick YTD, 6M or any custom span, tick the box, and read the equity and drawdown as a fresh start from there.

Benchmark overlay

The benchmark toggle above the equity chart overlays a buy & hold market curve, so you can read your portfolio against the broad market. When active, a small switch lets you choose between two deliberately different references (the active one is labelled price only / total return):

  • SPX — the S&P 500 index (^GSPC), price only: it ignores dividends.
  • SPY — the SPY ETF, total return: dividends are reinvested. Over long horizons it sits clearly above SPX — the gap is exactly the dividend contribution.

It is a fair, same-starting-point comparison:

  • In dollars mode it answers "what if I had put the same initial capital into the market?" — the benchmark starts at your initial capital and scales with it: capital × price(d) / price(start).
  • In percent mode both curves start at 0%, and the benchmark is its cumulative return: (price(d) / price(start) − 1) × 100.

For SPX the price is the index's daily close; for SPY it is the dividend-adjusted close (total return). The data is daily (no intraday), sourced from Yahoo Finance. It refreshes automatically: the app keeps the series cached and re-fetches it on first use each day, so the line is always aligned to the last closed trading session. Prices only exist on trading days, so weekends and holidays carry the last value forward (the line stays flat, it does not drop to zero). With every strategy hidden, the benchmark still plots on its own over the session's date range.

SPX is price, SPY is total return

The whole point of offering both: SPX shows price appreciation only, while SPY reinvests dividends. Comparing them tells you how much of the market's return came from dividends.

Rolling and Trades bands

At the bottom of the charts card two collapsible bands complete the picture:

  • Rolling · moving windows — the distribution of returns over fixed-length sliding windows (1w, 2w, 1m, 3m, 6m, 1y — counted in operative days, i.e. days with non-zero P/L), with best/worst window paths. Available for every portfolio, fixed or sized; with compounding on, each window's base is its starting equity, otherwise the initial capital.

  • Trades · portfolio trade log — the complete trade log of the portfolio, always available for every portfolio (fixed, sized or hybrid): one row per trade, from every strategy, in chronological order. Each row carries its date, strategy, time, premium, contracts and realized P/L, and a capital column: the account's realized capital at the moment that trade opened — initial capital plus the P/L of the trades already closed by then. A position still open is not cash, so it does not appear there; on an all-intraday book the two readings coincide by the end of each day, on a multi-day book they do not. When at least one trade spans more than a session the log also shows a closed column: that is the date the trade pays, the date its P/L lands on the curve and in the metrics, and the day its margin is released. The premium is the per-contract premium of the structure, printed as a magnitude followed by its direction — 935.00 db for a debit paid, 305.00 cr for a credit collected — the same reading as the trade log in Research. The signed figure of the source file (credit positive, debit negative) is what the CSV export writes: there a number must stay a number. An em-dash means the file carried no premium for that trade (daily-only series). Next to the P/L sits P&L / ct, the P/L of a single contract: contracts × P&L / ct reproduces the row's P/L (net of any manual costs), which is how you check a row at a glance. It matters because in Option Omega CSVs the P/L column is the total of the position, not the per-contract figure — the engine divides it by No. of Contracts and reasons per contract from there, so a size cap of 3 yields three times this number, not three times the CSV cell. Dynamically-sized legs add the two sizing-only columns — the stop and the risk — while fixed legs, whose size is your multiplier, show an em-dash there; their contract count is the trade's real contracts times the fixed multiplier and their P/L is the trade's real P/L. The committed margin column is not sizing-only: margin is tied up the same way whether the size was chosen dynamically or fixed, so the column appears whenever any trade in the book carries margin data. When the whole portfolio is fixed the stop and risk columns are hidden, but the margin column stays as long as the CSVs carry a margin figure; only a fixed book with no margin data at all collapses to the essential set (date, strategy, time, premium, contracts, P/L and capital). The margin column shows the margin the trade commits — final contracts × per-contract margin for both sized and fixed legs (em-dash when the trade carries no margin data); a trade reduced by the margin cap is highlighted in amber, and the planned size with the full required margin sits in the reduced-trades list in the sizing diagnostics (the cap only trims dynamically-sized legs, never fixed ones). A trade the cap excluded outright — no free margin left for even one contract — shows a ⊘ on its zeroed contract count: it is the trade that never happened, so it belongs where the size is read, not in the margin column it no longer occupies. A trade whose size was decided by a declared contract cap or floor instead carries a small amber dot beside its contract count, with the reason on hover.

    Beside the per-trade margin, the cumulative margin column answers a different question: how much of the account is tied up at that moment. It is the portfolio's committed margin right after that trade opens — positions still open from previous days, plus everything that entered today up to that time — so it fills up as the session goes on and empties as positions close. It is also the figure the margin cap compares against its limit: when the column reaches the ceiling, the trades below it are the ones that come back reduced or excluded. Fixed legs count from their own execution time, not from the opening bell — a position entering at 15:30 does not take room away from a trade at 09:35 — so the printed figure is exactly the one the cap evaluated, mixed books included.

    The log is scoped to the chart's calendar: it follows the range selector above, showing the trades that close inside the visible window — the same convention the metrics use, so the P/L in the list and the P/L in the panel above it are the same number (on ALL it spans the whole history). The trade count and the CSV export track the same window; the export always writes the close date, even when the table hides the column.

    When align starting capital is on together with a window, the ledger is brought back to the initial capital at the window start, following the very same convention as the curve above it and the KPI band — the list must tell the story of the chart it sits under, not a parallel one. Each row therefore carries its own leg's factor, the same one the curve uses: a fixed-contract row is left alone, a proportional dynamically-sized row is rescaled by initial capital ÷ equity at the window start. Mixed books get both, side by side in the same list.

    Whichever factor applies, one rule holds on every row: a row never mixes two scales. Contracts, P/L, risk and margin move together by the same ratio, so contracts × P/L per contract always reproduces the row's P/L (net of manual costs) and margin per contract stays the true one. That is the only way a ledger can be read at all.

    • rescaled rows — contracts are the rounded equivalent size, and P/L, risk and margin follow those contracts rather than the raw factor: the window total therefore differs from the curve by a rounding, which is the price of never printing a row that lies. Premium, stop and P/L per contract are per-contract properties, hence unchanged. A leg whose size was already fractional (a fixed leg with a 0.6 multiplier) keeps its decimals — there the decimal is your multiplier, not an artefact of the rebase.
    • rows left alone — the real trade of the period, with only the running capital re-anchored. This covers fixed-contract legs, legs where rescaling is not legitimate (a binding max/min contracts limit, or manual costs charged per trade or per day) and windows where it is not representable (the scale would push sizes below one lot, typical of a fixed leg inside a portfolio that has grown a great deal — there nothing is rescaled at all). Real numbers unscaled beat scaled numbers that aren't real.
    • a fully fixed book, or dynamic sizing without compounding — the P/L does not depend on the size of the account, so the sizing engine is simply re-run over the windowed trades from the initial capital. Contracts and P/L come out identical to the historical ledger; only the running capital column restarts.

    A note above the table says which regime is active. The running capital tracks the rebased curve within a day of it: the curve is anchored to the equity at the close of the window's first day, while the ledger also lists the trades opened on that day.

    Because a large book can run to dozens of pages, the list carries a timeline scrubber above it (shown once there is more than one page): the bar spans the whole visible period, with year or month gridlines, and the highlighted band marks where the current page sits in time. Click or drag on the bar to jump straight to the page for that moment (arrow keys and Home/End work too when it is focused), instead of stepping page by page. Each page also shows its date span next to the row range in the footer, so you always know which slice of history you are looking at.

The funnel

The Workspace scrolls through linked sections — Metrics, Correlations, Monthly P&L, Weekday, per-strategy detail and the head-to-head strategy comparison — with the sidebar tracking where you are. Heavier modules (Charts, Monte Carlo) have their own pages.

Next: tune the mix with Weights, sizing & capital.