This dashboard shows the live performance of a real Interactive Brokers account managed by TradeQuantiX Systematic Trading Portfolio. All returns, positions, drawdowns, and trades reflect actual executions. Nothing here is backtested, paper-traded, or simulated.
Data is pulled directly from IBKR via their Flex Query API and refreshed daily. The benchmark is SPY (S&P 500 total return). Metrics are computed on time-weighted returns net of commissions and financing costs.
| Metric | Portfolio |
|---|---|
| Returns | |
| WTD | +0.1% |
| MTD | +3.7% |
| QTD | -2.6% |
| YTD | +16.8% |
| 1Y | +46.7% |
| 3Y CAGR* | +32.9% |
| 5Y CAGR* | — |
| Risk Metrics | |
| Sharpe (All)† | +1.66 |
| Volatility (All)† | 18.0% |
| Sortino (All)† | +2.38 |
| Calmar (All)† | +1.69 |
| Drawdowns | |
| Current Drawdown | -2.6% |
| Days in Current Drawdown | 27 |
| Max Drawdown (QTD) | -8.7% |
| Max Drawdown (YTD) | -14.9% |
| Max Drawdown (All)† | -19.4% |
| Interest & Drag | |
| Commission Drag‡ | 3.16% |
| Borrow Cost‡ | 0.94% |
| Margin Interest‡ | 1.14% |
| Total Cost Drag‡ | 5.24% |
*3Y and 5Y are annualized CAGR; if full history unavailable, extrapolated from earliest available data | †Full-period, annualised (risk metrics), peak-to-trough (drawdowns), risk-free rate = 0 | ‡Annualised cost as % of NAV
Portfolio is leveraged — using margin for 2.5% of positions.
| Market | Allocation |
|---|---|
| ASX | 45.6% |
| TSX | 28.6% |
| US | 25.8% |
| # | Ticker | Market | Strategy | Alloc % | PnL % |
|---|---|---|---|---|---|
| 1 | GNP | ASX | Momentum | 3.63% | +211.2% |
| 2 | SRG | ASX | Momentum | 3.64% | +178.6% |
| 3 | SDE | TSX | Other | 1.57% | +177.2% |
| 4 | MAL | TSX | Trend | 0.97% | +125.7% |
| 5 | EIF | TSX | Other | 1.11% | +124.5% |
| 6 | RMI | ASX | Trend | 0.92% | +120.0% |
| 7 | EXE | TSX | Trend | 2.54% | +116.8% |
| 8 | SLS | ASX | Trend | 1.39% | +101.1% |
| 9 | WMX | ASX | Trend | 0.01% | +100.0% |
| 10 | TEA | ASX | Momentum | 0.84% | +75.6% |
| # | Ticker | Market | Strategy | Alloc % | PnL % |
|---|---|---|---|---|---|
| 1 | DVA | US | Momentum | 0.31% | -24.2% |
| 2 | A1M | ASX | Trend | 0.85% | -24.0% |
| 3 | ASPN | US | Trend | 0.66% | -22.6% |
| 4 | TSU | TSX | Trend | 0.61% | -18.8% |
| 5 | DDOG | US | Momentum | 0.80% | -13.9% |
| 6 | KLTR | US | Trend | 0.74% | -11.9% |
| 7 | MM1 | ASX | Trend | 1.07% | -11.6% |
| 8 | QTRH | TSX | Trend | 0.49% | -11.1% |
| 9 | CVS | US | Momentum | 0.48% | -10.7% |
| 10 | INTC | US | Momentum | 0.48% | -10.4% |
These insights are AI-generated and may be incorrect.
Week of 2026-08-10
Cumulative time-weighted return (TWR) since inception, excluding the effect of cash deposits/withdrawals.
Calendar-year time-weighted returns for the portfolio and SPY, with excess return vs the benchmark. The current year is marked YTD and reflects a partial year.
| Year | Portfolio | SPY | Excess vs SPY |
|---|---|---|---|
| 2026 (YTD) | +16.8% | +13.1% | +3.7% |
| 2025 | +60.9% | +17.7% | +43.2% |
| 2024 | +12.6% | +24.9% | -12.3% |
Calendar grid of monthly time-weighted returns (%). Rows = years, columns = months. Green = positive, red = negative, intensity = magnitude. Quickly reveals seasonality patterns and which months/years drove performance.
50-day and 100-day rolling compound annual growth rate. Shows the annualised return the portfolio would have earned if the most recent window's performance continued for a full year. Rising lines = accelerating returns; falling = decelerating.
10,000 simulated equity paths by resampling actual daily returns with replacement. The 10 best (green) and 10 worst (red) outcomes are shown alongside the actual path (white). Illustrates the range of outcomes luck alone could produce given the same daily return distribution.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Preserves vol clustering so simulated paths look realistically streaky.
Monte Carlo projection using only prior-year data, anchored at Jan 1 of the current year. The green line shows actual YTD performance building into the projection bands — a live accuracy check of the model. Drag the horizon slider to extend the projection anywhere from 3 to 24 months forward from the anchor.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Projection bands widen honestly around clustered vol. Precomputed at 24 months; slider replays any horizon with no recompute.
Distribution of annualised compound returns (CAGR) from 5,000 bootstrapped paths of historical daily returns at a chosen horizon (1–30 years). Each simulation compounds resampled daily returns forward. CAGR is used (not raw terminal %) because long-horizon compounded distributions have astronomical tails that obscure the median; the annotation shows the equivalent cumulative return for each percentile. Drag the horizon slider to replay the same set of sims sliced at different anniversaries — wider spread at longer horizons is honest terminal-wealth uncertainty, not a bug.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. One 30-year simulation per sim; per-year checkpoints let the slider replay any horizon with no recompute.
Each bar = daily return divided by its trailing 25-day rolling volatility (a z-score). Values beyond ±2 are unusually large moves relative to recent vol. Helps spot abnormal days that may signal regime shifts or outsized events.
Histogram of daily % portfolio returns (TWR). VaR 5% (Value at Risk) = the 5th-percentile daily return — on 95% of trading days, the return was better than this value.
Histogram of compounded weekly portfolio returns (%). Smooths out daily noise to show the "real" distribution shape. Green/red bars = positive/negative returns. Normal distribution overlay for reference.
Survival function: P(daily return > x). At any point on the curve, the Y value is the probability that a random trading day had a return exceeding the X value. Steeper drop near zero = most days cluster around flat. Fat right tail = occasional large gains; fat left tail = occasional large losses.
How far below the all-time high the portfolio is at any point. 0% = at a new high. Deeper troughs mean larger peak-to-trough losses. Compare with benchmarks to see if drawdowns are shallower or deeper than the market.
Realized drawdown statistics for the portfolio and SPY computed over the same aligned daily-returns window since inception. Lower is better for every row in this table — green in the "Diff" column means the portfolio drew down less, was underwater for fewer days, or recovered faster than SPY.
| Metric | Portfolio | SPY | Diff vs SPY |
|---|---|---|---|
| Max Drawdown | 19.43% | 18.76% | +0.67% |
| Longest DD (days) | 71 | 87 | -16 |
| Time in Drawdown | 79.80% | 79.20% | +0.60% |
| Avg Recovery (days) | 10 | 8 | +2 |
Shows how many consecutive trading days the portfolio has been below its high-water mark during each drawdown episode. Taller bars = longer periods spent underwater before recovering. Useful for understanding the patience required to hold through drawdowns.
Percentage of all trading days spent in drawdown vs at all-time highs. "At Highs" = days where the portfolio set a new all-time high (cumulative return ≥ previous peak).
Probability that a randomly selected day has a drawdown worse than a given level. Read as: "X% of the time, the portfolio was down more than Y%." Steeper drop-offs mean drawdowns are concentrated at shallow levels; a fat tail means deep drawdowns are more common than expected.
Left axis (bars): how many trading days per year the portfolio spends at or beyond each drawdown threshold. Right axis (line): average number of trading days you wait before the threshold is hit. Deeper drawdowns happen less often and require more patience — this quantifies the opportunity cost of waiting.
Each cell shows how many drawdown episodes of a given depth (rows) took a given number of days to recover (columns). Brighter cells = more frequent. Read across a row to see: "When the portfolio was down X%, how long did recovery typically take?"
When the portfolio is at a given drawdown level, how much further does it typically fall before hitting the trough? Bars show the median additional decline; whiskers show the 25th–75th percentile range. If you're at -5% and the median additional drop is 2%, expect to see -7% before recovery begins.
Heatmap of median forward returns when entering at different drawdown depths. Rows = holding period (1W to 6M), columns = drawdown depth bucket. Warmer colours = higher forward returns. Shows which drawdown levels historically produced the best entry points.
Expected value = probability of reaching a drawdown threshold × median forward return from that level. The peak of this curve is the optimal drawdown entry point — it balances "good entry price" against "actually happens often enough." The dashed lines show the probability and median return components separately. Drag the forward-horizon slider to see how the optimal entry depth shifts with the holding period (from 1 week to 12 months).
Median forward returns (5, 10, 20 trading days) after the portfolio posts N consecutive losing days. Longer losing streaks often precede stronger recoveries. Use this to gauge whether adding capital after a rough patch has historically been rewarded. Count labels show sample size for each bucket.
Probability of experiencing a consecutive losing streak of N days or longer. The red dashed line marks your current streak length. Steeper drop-offs mean long streaks are rare; a flat tail means drawdown persistence is a real risk.
Distribution of the worst drawdown seen inside a rolling-forward window from 10,000 bootstrapped 60-month paths of historical daily returns. Median line = the max DD you should expect in a "typical" horizon of that length. The 90th- and 99th-percentile lines mark the tail. The white line shows the portfolio's current drawdown and where it ranks in the distribution — is this DD normal, or genuinely bad? Drag the horizon slider to replay any horizon from 1 month to 5 years.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Critical here: iid resampling systematically UNDER-estimates max DDs because it destroys the vol clustering that produces real drawdowns. Per-month checkpoints let the slider replay any horizon with no recompute.
For every drawdown episode observed across 10,000 bootstrapped years, how many trading days did the portfolio spend underwater — from the first day below peak until it recovers to a new high? Bars show median episode duration by DD depth bucket (includes both decline and recovery phases); whiskers span the 25th–75th percentile. The gold marker highlights the bucket the current DD falls in — turning a scary drawdown into a probability distribution.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Keeps clustered DD episodes intact so recovery-time buckets reflect realistic path dynamics.
From 10,000 bootstrapped forward paths at the slider-selected horizon: probability of finishing the period down by at least X% (Terminal), and probability of touching a drawdown of at least X% at some point during the period (Intra-Period). Intra-period probabilities are always higher — you might touch −20% and recover to finish flat. Brutally honest tail-risk framing. Drag the horizon slider below the table to replay from 1 month to 60 months (5 years); zero recomputation, instant refresh.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Tail-loss probabilities depend on preserving vol clustering. One 60-month bootstrap runs once; each horizon slice is a prefix of the same paths.
| Loss Threshold | P(Terminal ≤ −X%) | P(Intra-Period ≥ X%) |
|---|
From the portfolio's current level, probability of reaching a new all-time high within 30 / 60 / 90 / 180 / 252 trading days. Runs 10,000 bootstrapped forward paths and counts how many touch the prior peak inside each horizon. During a drawdown this turns "will this ever recover" into a probability with a timeline. When the portfolio is already at ATH, all horizons trivially read 100% — the caption calls that out.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Grinding uptrends and vol clusters are preserved so recovery timing stays realistic.
Runs 10,000 bootstrapped 252-trading-day years and computes three drawdown statistics per simulation — annual max DD, longest DD length in days, and % of days spent below prior peak. Reports the realized value on your most recent 252 trading days alongside the bootstrap distribution's median and 95% CI. If your realized max DD sits far outside the CI, this year has been abnormal relative to your own return distribution.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Drawdowns are inherently clustered; iid sampling systematically underestimates every statistic in this table.
| Metric | Realized | Bootstrap Median | 95% CI Low | 95% CI High | CI Width |
|---|
Across 10,000 bootstrapped 252-trading-day years, each sim's max-DD trough day is bucketed by severity (Mild / Moderate / Severe) and by calendar month of the year (M1–M12). Cells show the conditional probability P(trough occurs in this month | this severity bucket). Existing DD charts show how deep and how long — this shows when. Useful for cash-reserve and hedging seasonality: is your DD risk uniform across the year, or does it concentrate?
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Preserves clustered DD episodes so trough-timing distribution is realistic.
Among 10,000 bootstrapped 252-day years, filter to sims that finished positive, then histogram the worst intra-period drawdown (MAE — Maximum Adverse Excursion) each of those winning years endured. Even paths that end green typically visit a nontrivial trough at some point. Reframes DDs as "the price of admission for a positive year" rather than as failure signals. Median MAE-among-winners line marks the typical toll.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Preserves clustered drawdown episodes so MAEs remain realistic in shape.
Suppose the portfolio just drew down by X%. What's the probability of reclaiming the prior peak within Y months? Cells show P(recovered) across 10,000 bootstrapped forward paths. Rows = starting DD depth (5%–40%); columns = time horizons (3mo–36mo). Lets you stress-test drawdown depths well beyond anything actually lived through, using only your own return distribution.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Recovery timing depends on preserving grinding-uptrend and stalled-vol dynamics.
Downside symmetric of the "Probability of New All-Time High" chart. From the portfolio's current level, block-bootstrap 10,000 forward paths and record the FIRST trading day each sim's running drawdown (from its own rolling peak) touches or exceeds the threshold. Bars show P(hit −X% DD by day N) at horizons 30d / 60d / 90d / 6mo / 1y / 2y / 3y / 5y. Answers WHEN a threshold breach hits — not just IF. Drag the threshold slider in 1% increments from 5% to 30% drawdowns.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. DD-breach timing depends on preserving vol clusters; iid would systematically UNDER-estimate breach probability at every threshold. One 5y bootstrap runs once; each threshold slice is derived from the same paths.
The "time-in-pain" complement to max-DD charts — a shallow DD can still be brutal if you spend 60% of the year underwater. For each sim in a 10,000-path block-bootstrap, count days where path[t] < running peak, divide by the horizon length. Histogram shows the per-horizon distribution; vertical lines mark median, 25th/75th percentile, and 90th. Your realized underwater fraction across full portfolio history is shown for context. Drag the horizon slider to replay any horizon from 1 to 36 months — the underlying 36-month bootstrap runs once, each horizon is a checkpoint on the same paths.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Underwater fraction depends on how losses cluster into contiguous DD episodes; iid would produce artificially LOWER fractions because scattered losses recover to peak frequently while clustered losses stay below peak for extended runs.
The FREQUENCY of pain, distinct from the DEPTH of pain shown by max-DD charts. Every time the equity curve makes a new high, the interval since the previous high is recorded. Chart overlays two histograms: your historical peak-to-peak intervals (blue) and the same distribution generated by 10,000 block-bootstrap forward paths (purple). Median, 90th, and 99th percentile reference lines mark typical vs long-tail intervals. "Days since last ATH" annotation tracks the currently-open interval (a lower bound; the true interval isn't known until the next ATH prints).
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Peak-to-peak intervals are driven by clustering of losing/winning days into runs; iid would understate long intervals by breaking up the runs that generate multi-month gaps between ATHs.
Forward projection of the longest run of consecutive losing days you should brace for. Complements the historical loss-streak-exceedance chart with a look ahead. Block-bootstrap 10,000 3-year forward paths runs ONCE; each horizon on the slider is a checkpoint on the same paths (longest streak so far is monotone-nondecreasing in horizon). Histogram shows the per-horizon distribution; vertical lines mark median, 90th, and 99th percentile. Your current open streak and realized max streak from history are annotated for context. Drag the horizon slider to replay any horizon from 1 to 36 months.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Streak length is a directly clustered phenomenon; iid would produce artificially SHORTER streaks because it destroys the day-to-day sign persistence that generates long runs of losers in real markets.
How much can you safely withdraw each month? For each monthly withdrawal rate (as % of starting NAV, held constant in dollar terms — so the answer is scale-invariant: same curves whether starting NAV is $10K or $10M), we simulate 10,000 forward paths of daily returns with a monthly-lump withdrawal at the start of each trading month (Bengen/Trinity convention). A path fails ("ruin") the moment NAV literally hits zero — the account runs out of money. Not-growing / slowly-declining paths still count as survivors as long as NAV > 0 at every point in the horizon. The four curves show P(survival) over 3Y / 5Y / 10Y / 50Y as you crank the withdrawal rate higher. Read the SWR directly: where each curve crosses the dashed 95% or 99% reference line is your Safe Withdrawal Rate for that horizon at that confidence level.
Reading the hover — "median NAV (survivors)": your NAV starts at 1.00× (= 100% of starting capital). At each x-value, hover shows the median ending NAV — expressed as a multiplier of starting capital — across only the paths that survived (didn't hit zero) at that horizon. So 1.50× means the median survivor ended with 50% MORE money than they started with. 0.60× means the median survivor lost 40% along the way but stayed above zero. 2.00× means they doubled. This tells you how much cushion / wealth remains in typical surviving paths — survival % says "will I not go broke," median NAV multiplier says "if I don't go broke, roughly what's left."
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Sequence-of-returns risk depends on clustering; iid resampling would systematically UNDERSTATE ruin probability.
How much wealth is left at the end? The SWR curve above tells you the probability of not running out of money. This chart tells you what your ending NAV looks like — as a multiple of starting capital — after a chosen horizon under a fixed monthly withdrawal rate. Four rates spanning very safe → moderately aggressive (0.25%, 0.5%, 1%, 2% of starting NAV/mo). Each curve is a Cumulative Distribution Function (CDF) over 5,000 forward paths: read the y-value at x=1.0× to see "% of paths that ended with less than starting capital." Ruined paths sit at NAV=0, so the leftmost value of each curve = ruin fraction at that rate. Drag the horizon slider to replay the chart at any horizon from 1 to 50 years, and use the NAV threshold slider below it to lock in a specific NAV multiplier — a pink vertical line appears at that value on the chart, and the readout panel shows the exact P(terminal NAV ≤ threshold) for each of the four rates.
How to read the CDF: the curve is P(terminal NAV ≤ X) plotted against X. Steep segments = lots of paths concentrated in that NAV range. Flat segments = few paths there. Where the curve starts above y=0 tells you the ruin fraction — e.g. a curve that starts at y=30% means 30% of paths went to zero. The vertical dashed line at 1.00× is breakeven (survived without gaining or losing capital); anything left of the line = shrunk. Legend shows ruin % and median terminal NAV for each rate at the selected horizon.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Same reason as the SWR curve: sequence-of-returns clustering drives terminal wealth dispersion; iid would understate the left tail. Each sim runs the full 50-year horizon; NAV is snapshotted at every anniversary so the slider replays previously-computed distributions with no recomputation.
Realized headline risk metrics for the portfolio and SPY computed over the same aligned daily-returns window since inception. Direction of "better" differs by metric — Sharpe/Sortino/Calmar/Skewness reward higher values, Volatility and Excess Kurtosis reward lower. Green in the "Diff" column means the portfolio wins on that metric.
| Metric | Portfolio | SPY | Diff vs SPY |
|---|---|---|---|
| Sharpe (annualised) | 1.69 | 1.36 | +0.32 |
| Volatility (annualised) | 18.47% | 15.90% | +2.57% |
| Sortino (annualised) | 2.42 | 2.05 | +0.38 |
| Calmar | 1.76 | 1.21 | +0.55 |
| Skewness (daily) | -0.51 | 0.97 | -1.48 |
| Excess Kurtosis (daily) | 4.25 | 21.15 | -16.89 |
Annualised standard deviation of daily returns over rolling windows (10, 50, 100 days). Higher values = more volatile periods. Useful for spotting regime changes — when vol spikes, risk is elevated.
Rolling annualised Sharpe ratio (risk-free rate = 0). Measures return per unit of total risk. Values above 1.0 = strong risk-adjusted returns; below 0 = losing money. Two windows (50-day, 100-day) show short- and medium-term trends.
60-day rolling Sharpe (line) with the shaded 5th–95th percentile band from 200 bootstrap resamples of each rolling window. Answers "is the rolling Sharpe I'm reading statistically meaningful, or noise within CI?" When the band is wide relative to the line, the point estimate is unreliable (short sample within window). When zero is inside the band, the Sharpe is not distinguishable from zero at 90% confidence.
Sampling method: IID bootstrap — each day resampled independently within each 60-day window. Block bootstrap is not used here: the resample is confined to a short window, so a 9-day block length would yield only ~6 blocks per resample and artificially narrow the CI.
Runs 10,000 bootstrapped 252-trading-day years and computes six headline risk metrics per simulation — Sharpe, annualised volatility, Sortino, Calmar (on a 1-year sim), skewness, and excess kurtosis. Reports the realized value on all your daily returns alongside the bootstrap median and 95% CI band. If your realized Sharpe sits outside the CI you're either enjoying an abnormally good year or an abnormally bad one relative to your own long-run distribution. If zero sits inside the CI for Sharpe/Sortino, the risk-adjusted return is not statistically distinguishable from zero.
Sampling method: Block bootstrap — Politis-Romano stationary, mean block length ≈ n1/3 days with per-sim ±2 perturbation. Vol clustering must be preserved to get honest CIs on Vol, Sortino, and Calmar.
| Metric | Realized | Bootstrap Median | 95% CI Low | 95% CI High | CI Width |
|---|
How extreme the current rolling Sharpe is relative to its own history, shown for 25-day and 50-day windows. Values below −1.5σ signal the portfolio is deeply underperforming its own baseline — historically a mean-reversion point and a potential time to add capital. Uses an expanding window for stable z-scores.
Like Sharpe but only penalises downside volatility (risk-free = 0). A higher Sortino means strong returns with limited downside moves. More relevant than Sharpe for portfolios with asymmetric return profiles (e.g., more small gains than large losses).
Annualised return ÷ max drawdown over 50-day and 100-day rolling windows. Measures how much return is earned per unit of worst-case loss. Higher = better. Unlike Sharpe, Calmar focuses on tail risk (actual losses) rather than overall volatility.
CVaR (Conditional Value at Risk, also called Expected Shortfall) is the average loss on the worst N% of days within each rolling window — it goes beyond VaR by showing how bad the bad days actually are. CVaG (Conditional Value at Gain) is the mirror image: the average gain on the best N% of days. The blue "Spread" line shows CVaG − |CVaR| — when it's above zero, the portfolio's best days are larger than its worst days (positive tail asymmetry). When it dips below zero, losses on bad days are dominating gains on good days. Drag the tail-threshold slider to sweep N from 1% (extreme tails, small sample) to 10% (moderate tails, dense sample).
60-day rolling skewness (left axis, blue) and excess kurtosis (right axis, orange). Negative skew = more frequent large losses than gains. Positive skew = fatter right tail. Excess kurtosis > 0 = fatter tails than a normal distribution (more extreme days). Negative skew + rising kurtosis = danger zone (left tail fattening). Background is shaded green when skew > 0 & kurtosis < 3, red when skew < 0 & kurtosis > 3.
Long, short, net, and gross exposure as a percentage of NAV over time. Net = Long − Short (directional bias). Gross = Long + |Short| (total capital at work). Rising gross with flat net = adding hedged positions; rising net = becoming more directionally exposed.
Number of distinct open positions held each day, reconstructed from trade entry/exit history. Shows how concentrated or diversified the portfolio is at any point in time.
Each dot is one trading week. X-axis = 8-week rolling annualized volatility (%), Y-axis = that week's compounded return (%). Green = positive week, red = negative. The regression line and R² show whether higher volatility periods tend to produce larger or smaller returns.
Shannon entropy of the discretized daily return distribution over a rolling 60-day window (purple, left axis), overlaid with cumulative return (green, right axis). High entropy = returns are spread unpredictably across many bins (noisy, random). Low entropy = returns are concentrated in fewer bins (structured, repeatable edge). Entropy dropping while cumulative return rises = the portfolio is finding a narrow, exploitable pattern. Entropy rising while performance flattens = the return process is becoming noisy and unstructured.
60-day rolling Hurst exponent estimated via rescaled range (R/S) analysis. H > 0.5 = trending regime (returns are persistent — up days tend to follow up days). H < 0.5 = mean-reverting regime (returns tend to reverse). H ≈ 0.5 = random walk (no memory). The 0.5 reference line marks the boundary between trending and mean-reverting behavior.
Each dot plots today's return (Y) against yesterday's return (X). The regression line and R² reveal whether returns are serially correlated. A flat line with low R² = returns are roughly independent day-to-day (random). A positive slope = momentum tendency; negative slope = mean-reversion tendency.
Each dot plots the forward 3-day realised vol against the prior 10-day trailing vol (non-overlapping windows, log returns). A positive slope and high R² = volatility is "sticky" — elevated vol regimes predict continued high vol. This is the well-known volatility clustering effect.
Velocity (green) = 10-day EMA of daily returns in bps — are you making money faster or slower? Acceleration (orange) = rate of change of velocity. Jerk (purple dotted) = rate of change of acceleration — spikes flag inflection points where your P&L trajectory is about to shift direction.
Z-score of rolling mean return vs historical grand mean at 10-day (cyan), 30-day (yellow), and 60-day (magenta) windows. Values above +2 or below -2 indicate statistically unusual momentum — your recent performance is significantly different from your long-run average.
Percentage of realized trades that were profitable, computed on rolling 20-trade and 50-trade windows. The dashed line shows the overall win rate across all trades. A win rate above 50% combined with a profit factor > 1 indicates a positive edge. Requires trade data.
Rolling average winning trade size (green) vs average losing trade size (red) as a percentage of position value, across 20-trade and 50-trade windows. When avg win > avg loss, winners are larger than losers — a key edge indicator.
Expected profit per trade as % of position value = (win_rate × avg_win%) − (loss_rate × avg_loss%). Positive expectancy means the portfolio has an edge. Computed on rolling 20-trade and 50-trade windows.
Resamples the closed-trade P&L list (as % of position cost basis) with replacement 10,000 times to get the 95% confidence interval on each headline trade statistic. Answers the honest question: "given how few trades I've closed, could my win rate secretly be 45% instead of 55%?" The Realized column shows the value computed on your actual closed trades — benchmark this against the CI band and the bootstrap median. If the CI on Expectancy or Profit Factor straddles zero (or 1.0 for PF), the edge is not yet statistically distinguishable from luck.
Sampling method: IID bootstrap — trades are the sampling unit and are treated as independent (block bootstrap over trades has no meaningful notion of contiguous blocks).
| Metric | Realized | Bootstrap Median | 95% CI Low | 95% CI High | CI Width |
|---|
Survival function (exceedance probability) for winning and losing trade sizes as % of position value. Shows the probability that a winner/loser exceeds a given size. Steeper drop = more concentrated around small values; fat tail = occasional large wins/losses.
Overlapping histograms of winning trade sizes (green) vs losing trade sizes (red), both as absolute % of position value. Shows the shape of the win and loss distributions — if the green distribution extends further right than the red, winners are typically larger than losers.
Survival function: P(holding period > N days). Shows the probability that a trade is held longer than N days. Steep early drop = most trades are short-duration. Fat tail = some positions are held for extended periods. Median and mean holding periods marked for reference.
Quantile-quantile plot comparing actual daily returns to a theoretical normal distribution. Each blue dot is one quantile of your daily returns plotted against the corresponding quantile of a normal distribution with the same mean and variance. If returns were perfectly normal, all dots would sit on the orange diagonal reference line. Dots below the line in the left tail = larger losses than normal predicts (fat left tail). Dots above the line in the right tail = larger gains than expected (fat right tail). The shaded orange envelope is the 5–95% range from 10,000 iid bootstrap resamples of your own returns — dots falling outside the envelope are statistically distinguishable from sample-size noise; dots inside are consistent with random sampling variability.
Sampling method: IID bootstrap — each resample draws n returns independently with replacement. Appropriate because we're characterising sampling variability under the null of no serial dependence, which is exactly what the QQ compares against.
Overlaid line chart comparing the absolute magnitude of the worst N days (red) vs best N days (green) by rank. Rank 1 = most extreme day for each side. Wherever green is above red = right tail is fatter at that rank. Drag the N slider to look at anywhere from the 10 most extreme days (narrow, big-move focus) to 100 (deep into the body of the distribution).
Survival function for up days (green) and down days (red) separately, based on equity curve daily returns. X-axis = return magnitude %. Y-axis = P(return exceeds x) among that day type. Steeper curve = returns concentrate at small magnitudes. Fat tail = frequent large moves. Comparing the two curves shows whether big up days or big down days are more common at each magnitude threshold.
Cumulative total return of portfolio (cyan) vs SPY (orange) since inception. Both start at 0%. Shows how your portfolio has grown relative to the broad market benchmark over time.
Portfolio returns normalized to 1x leverage by dividing each day's return by that day's gross exposure. If you're running 150% exposure, the day's return is divided by 1.5; at 50% exposure, divided by 0.5. This strips out the leverage effect and shows what your returns would look like at constant 1x exposure — a true apples-to-apples comparison against SPY.
Your daily return minus (rolling 60-day beta × SPY return), cumulated over time. This strips out every dollar the market gave you for free and shows your pure skill equity curve. If this line is flat, your returns are entirely market-driven.
Rolling 60-day OLS regression of portfolio daily returns against SPY. Alpha (green) = annualised intercept (your skill after removing market exposure). Beta (blue, right axis) = market sensitivity. Alpha > 0 means you're generating returns beyond what beta explains.
The question: Your realized alpha (annualised return above what SPY's beta explains) is a specific number. But could random luck alone produce a return that good even if the strategy had no real edge? This chart tests that.
How to read it: The gray histogram is the "no-edge world" — the distribution of alphas you'd expect to see across 10,000 simulated portfolios that have zero true alpha (but the same beta and noise level as yours). The white vertical line is your actual realized alpha. If the white line sits deep in the tail of the gray histogram (far to the right of the bulk), luck is a poor explanation — your alpha is statistically significant. If the white line is inside the bulk, luck can explain it.
The verdict box (top-right corner): The one-sided p-value = "chance of a random-luck portfolio matching or beating your alpha." Lower is better. Green = REAL edge (p<5%, 95%+ confidence); yellow = SUGGESTIVE (p 5-20%); red = LUCK plausible (p≥20%). Two-sided p-value asks the same about magnitude in either direction (relevant if you have negative alpha).
Sampling method: IID residual bootstrap (Efron-Tibshirani). Naïvely shuffling portfolio returns while keeping SPY fixed would destroy beta and produce a null centered on the raw portfolio mean — not on zero. Residual bootstrap fixes this: it imposes alpha=0 as the null while preserving beta_hat and the marginal noise structure.
Distribution of the ratio portfolio_terminal ÷ spy_terminal after N paired trading months, across 3,000 bootstrapped sims. Ratio > 1 = portfolio beat SPY in that simulated window. Vertical line at 1.0 = the "you tied SPY" reference. The annotated P(outperform SPY) is the probability of beating SPY in a random forward window drawn from your own historical joint distribution. Drag the horizon slider to slice the same set of sims at any month from 1 to 60.
Sampling method: Paired block bootstrap — Politis-Romano stationary blocks with same-index draws for portfolio and SPY, preserving same-day correlation. One 60-month simulation per sim; per-month checkpoints let the slider replay any horizon with no recompute.
Rolling Pearson correlation between portfolio and SPY daily returns. The 20-day window (cyan) captures short-term regime shifts. The 50-day window (orange) shows the structural relationship. Correlation near 0 = market-neutral. Spikes toward 1.0 during stress = hidden beta exposure.
Ratio of portfolio cumulative growth to SPY cumulative growth over time. Rising line = outperforming SPY. Falling line = underperforming. A value of 1.10 means the portfolio has grown 10% more than SPY since inception.
Rolling 60-day capture ratios vs SPY. Up-capture (green) = your avg return on SPY-up days as a % of SPY's avg up-day return. Down-capture (red) = same for SPY-down days. Capture ratio (gold, right axis) = up/down. Ideal: high up-capture, low down-capture, ratio > 1.
SPY daily returns bucketed into deciles (D1 = worst 10% to D10 = best 10%). Blue bars = your portfolio's average daily return in each regime. Grey bars = SPY's average. Flat portfolio bars = market-neutral. Upward slope = long-biased. Smile shape = convex (ideal).
Standard deviation of your daily returns within each SPY decile. Dashed line = SPY's overall volatility. Lower bars in down regimes = better risk control.
Mean / std dev of your daily returns within each SPY decile. Dashed line = SPY's overall Sharpe. Positive bars in down regimes = risk-adjusted alpha even when the market drops.
Your average daily return across different market environments. X-axis = SPY 20-day rolling volatility quintile. Y-axis = SPY 20-day rolling return quintile. Green = you profit, red = you lose. Reveals which macro regimes suit your strategy best.
Two overlaid histograms of your daily returns: green = days when SPY was up, red = days when SPY was down. Ideally your down-day distribution is tighter (limited losses) and your up-day distribution is fatter (capturing upside).
Scatter of your daily returns vs SPY daily returns. Grey = normal days. Red = worst 10% SPY days (left tail). Green = best 10% SPY days (right tail). Clustering and spread reveal how your portfolio behaves during different SPY regimes.
Rolling 60-day ratio of |95th percentile return| to |5th percentile return|. Values > 1 = positive skew (fatter right tail). Cyan = portfolio, orange = SPY. If your tail ratio consistently exceeds SPY's, you have better upside/downside asymmetry.
Both drawdown series overlaid. When drawdowns coincide = market-driven losses. When your drawdown deepens while SPY is flat = idiosyncratic blowup worth investigating. Cyan = portfolio, Orange = SPY.
Your drawdown minus SPY's drawdown over time. Positive (green fill) = you're in a shallower hole than SPY. Negative (red fill) = you're deeper. Shows active drawdown risk — when this is deeply negative, your losses are exceeding what the market explains.
Exceedance curves comparing portfolio and SPY daily returns. For up-days: P(return > x). For down-days: P(|return| > x). Heavier right tails on up-days (good) and lighter right tails on down-days (good) indicate favorable return asymmetry vs the benchmark.
Exceedance curves of drawdown magnitude. Shows P(drawdown > x%) for portfolio vs SPY. If your curve sits below SPY's, your drawdowns are shallower more often — better risk management. Where they cross reveals the drawdown depth at which one dominates the other.
Heatmap of monthly excess return (portfolio − SPY) by year and month. Green = outperformed, red = underperformed. Shows seasonality patterns and how the magnitude of over/underperformance evolves over time.
Consecutive trading days of outperformance (green, positive) or underperformance (red, negative) vs SPY. Long positive streaks = persistent alpha. Long negative streaks = periods where your strategy diverged unfavorably from the market.
Portfolio (cyan) and SPY (orange) equity curves with background colored by SPY market regime. Regime is determined by SPY price relative to its 50-day and 200-day simple moving averages: green = bull (above both), red = bear (below both), yellow = choppy (mixed). Shows how the portfolio performs across different market environments.
Cumulative commissions as % of NAV. Weekly cost = Σ(commission_$ / NAV_$) × 100 per week. Bars show weekly totals; the red area = running cumulative sum. Annualised = (cumulative / trading_days) × 252.
Cumulative stock borrow / short-selling costs as a percentage of NAV. These fees are charged by the broker for borrowing shares to sell short. Higher costs typically come from hard-to-borrow names or elevated short interest.
Cumulative cost of borrowing on margin from the broker. Monthly charges are shown as bars; the line tracks cumulative cost as a % of NAV. This is the interest paid for using margin (leverage), separate from stock borrow fees.
Cumulative return contribution of each strategy category expressed as % of portfolio NAV.
Peak-to-trough drawdown for each strategy category. Shows the worst decline from the high-water mark within each type — useful for identifying which strategies are driving portfolio drawdowns.
Rolling 20-day cumulative return contribution per strategy category. Shows which strategies are carrying performance at any given time. Positive area = adding to returns, negative = dragging.
Rolling 20-day order count (entries + exits) per strategy category. Each round-trip trade generates at least two orders. Higher turnover strategies are more active — compare with the equity curve to see if more activity translates to better returns.
Rolling 20-day average notional order value (entries + exits) per strategy category as a percentage of portfolio NAV. Includes both buy and sell sides, so this reflects total capital turnover, not net exposure.
Year-to-date return contribution by strategy category as a share of total portfolio return. Shows which strategies are driving overall performance.
Monthly return heatmap showing performance of each strategy category over time. Green = positive, Red = negative. Spot seasonal patterns in strategy performance.
Every trade's PnL as a percentage of position size (cost basis), shown as a dot with jitter. Diamond marks the mean. Shows the full spread and outliers without hiding individual data points.
Gross profits divided by gross losses per strategy category. A profit factor above 1.0 means the strategy is profitable overall. Higher = better risk/reward. The dashed line marks the breakeven threshold at 1.0.
Every trade's holding period shown as a dot. Diamond marks the mean. Reveals clustering patterns and outlier durations across strategies.
Rolling expectancy per strategy (expanding window: 5→10 trades) = (win_rate × avg_win%) − (loss_rate × avg_loss%), where PnL is expressed as % of position value (cost basis). Positive = edge, negative = bleeding. Shows which strategies are currently hot or cold.
Percentage of trades that were profitable per strategy category. The dashed line marks 50%. A high win rate alone doesn't guarantee profitability — compare with profit factor and avg win/loss size.
Average winning trade size vs average losing trade size per strategy (as % of position value / cost basis). Shows payoff asymmetry — ideally avg win exceeds avg loss. Green = avg win, Red = avg loss.
Longest consecutive winning and losing streaks per strategy category. Long loss streaks indicate drawdown persistence. Long win streaks suggest momentum in edge capture.