11 Oct 2023 – 9 Oct 2026 · 752 sessions
Every fill, fee and position replayed from the opening state. It checks that the numbers add up to the book -- not the data, the fills' realism or the strategy.
| Check | Status | Observed | Expected | Difference | What was checked |
|---|---|---|---|---|---|
| Fills INPUT.FILL_UNIQUENESS | PASS | 147 | — | — | All 147 fills have a unique id, a signed non-zero quantity and a positive price. |
| Sessions INPUT.TIMESTAMP_ALIGNMENT | PASS | 752 | — | — | Returns, cash and positions describe the same 752 sessions, each once; every fill falls in one of them. |
| NAV from cash and positions NAV.SNAPSHOT_RECONCILIATION | PASS | 2401803.33 USD | 2401803.33 USD | 0.00 USD | Cash plus every position at its valuation price, against the opening value compounded by the engine's returns, on each of 752 sessions. They agree on every one. |
| Returns vs NAV RETURNS.NAV_RECONCILIATION | PASS | 0.006104139640 | 0.006104139640 | 0.000000000000 | Each session's return against the change in cash plus positions, external flows taken out at the end of the day. All 752 agree. |
| Cash replay CASH.LEDGER_REPLAY | PASS | -141.53 USD | -141.53 USD | 0.00 USD | Cash replayed from the opening state, the fills and the fees (each fill's fee from the run's fee model, which matches every order's charge) equals the cash recorded on all 752 sessions. |
| Position replay POSITIONS.LEDGER_REPLAY | PASS | 7393.000000 | 7393.000000 | 0.000000 | Every name's shares, replayed from the opening state and the fills, equal the recorded position on all 752 sessions; the figures are the shares held at the end. |
| Published totals PNL.REPORTED_SUMMARY_IDENTITY | PASS | 1401803.33 USD | 1401803.33 USD | 0.00 USD | The published realized plus unrealized PnL, less commission, plus other cash, against the profit the published returns imply, external flows taken out. This proves the published figures agree with each other; it replays no book. |
| Profit vs NAV PNL.PORTFOLIO_RECONCILIATION | PASS | 1401803.33 USD | 1401803.33 USD | 0.00 USD | Each name's change in value, less what its fills cost, less commissions, plus income and expense events, against the change in cash plus positions net of external flows, measured from the opening state. They agree. |
| Realized / unrealized PNL.REALIZED_UNREALIZED | PASS | 1331747.37 USD | 1331747.37 USD | 0.00 USD | Realized (1,331,747.37) and unrealized (87,934.19) PnL, before commission, match the ledger's first-in-first-out lots. |
| Commissions COST.COMMISSION_RECONCILIATION | PASS | 17878.23 USD | 17878.23 USD | 0.00 USD | The report's commission, 17,878.23, is the orders' total, each order once, and every order's charge is what the run's fee model gives for its fills. |
| Slippage counted once COST.SLIPPAGE_SINGLE_COUNT | PASS | 1401803.33 USD | 1401803.33 USD | 0.00 USD | Slippage is counted once: it is in the fill prices, the published net PnL is the book's to the cent, and the reconstructed 25,251.50 is shown as an estimate, never taken off. The reconstruction equals what the prices hold against their bars. |
| Instruments add up ATTRIBUTION.INSTRUMENT_SUM | PASS | 1401803.33 USD | 1401803.33 USD | 0.00 USD | The instruments' net PnL adds up to 1,401,803.33, against the book's PnL after commission, 1,401,803.33, and each name matches its ledger lots less its fees. |
| Sectors add up ATTRIBUTION.SECTOR_SUM | PASS | 1401803.33 USD | 1401803.33 USD | 0.00 USD | The sectors add up to the instruments' net PnL. |
| Trades are real closes ROUND_TRIP.SYNTHETIC_CLOSURES | PASS | 0 | 0 | — | All 76 closed trades close on an actual fill. The 3 positions held at the end are unrealized PnL (87,934.19), not trades. The ledger holds 4 open lots. |
| Gross vs net labels ROUND_TRIP.GROSS_NET_CONVENTION | PASS | 0 | 0 | — | Trade PnL is labelled before commission wherever the report shows it, and nothing gross is called net; commissions are taken off once, in the instruments' net PnL and the reconciliation. |
| Shown vs computed REPORT.DISPLAY_VS_CALCULATION | PASS | 0 | 0 | — | Every row of the published profit reconciliation is the calculated figure, rounded to the cent. |
report policy · tolerance 0.01 USD or 1e-10 of the amount · inputs 6e1e9d09339deca6 · accounting-integrity/v1
Main issues: 5 of 76 trades made 62% of the profit; no return beyond what the factors pay (alpha +15.2% a year, n.s.); one position is 34% of the book on a typical day.
| Check tap a row for details | Value | Verdict |
|---|---|---|
| I · Where the Return Came From | ||
Annual return vs S&P 500 EquivalentCompounded a year, over the same sessions. Below S&P 500 Equivalent's, holding S&P 500 Equivalent would have done better. Threshold: at least S&P 500 Equivalent's | 34.1% vs 21.7% | Holds up |
Against buy & hold, 10 namesThe strategy's Sharpe ratio against buying the same names on day one and holding them (both at 0%); annual return 34.1% against 31.6%. A timing rule that does worse per unit of risk than holding its own names adds nothing but trading. On the efficient frontier of the same 10 names (Sharpe over the one-month T-bill, as the frontier measures it): the strategy 1.26, equal weight 1.59, the best fixed mix, chosen in hindsight, 2.03. The strategy sits 10.4% a year below the frontier at its volatility. Threshold: Sharpe at least buy & hold's What to try: Check whether the entries and exits add anything over simply holding the names. The numbers: Performance → · CAPM and the Efficient Frontier → | Sharpe 1.47 vs 1.62 | Needs a look |
More than luck3
What to try: Check what the factors explain: a strategy that is mostly market beta is cheaper bought as an index. | +15.2% a year, n.s. Alpha after factors | Needs a look |
Rests on a few days or trades2
What to try: Run the same rule over a longer history: a result made by a handful of days or trades rarely repeats. | 62% Profit from the best 5 trades | Needs a look |
| II · What It Risked | ||
Max drawdown vs S&P 500 EquivalentThe strategy's deepest fall from a peak against S&P 500 Equivalent's over the same sessions. Deeper than S&P 500 Equivalent's, or than -35% whatever S&P 500 Equivalent did, needs a look. Threshold: no deeper than S&P 500 Equivalent's, nor than -35% What to try: Size positions smaller, or add an exit that cuts a loss before it compounds. | -25.7% vs -19.0% | Needs a look |
Up / down captureAgainst S&P 500 Equivalent: it takes more of the market's falls than of its rises. Threshold: up capture at least down capture What to try: Look at what it holds into falling months: an exit that reacts sooner, or a filter on the market. | 145% / 146% | Needs a look |
Longest time below a peakFrom a high to the day the strategy was back above it. Over 12 months needs a look: few would hold on that long. Threshold: at most 12 months | 6 months | Holds up |
Concentration in one name4
What to try: Run the same rule on a group of stocks -- a universe such as Q100US -- to see whether the rule made the money, or the stock. | 34% (max 53%) Largest position, typical day | Needs a look |
| III · How It Holds and Trades | ||
Winning trades · profit factor76 closed trades; median holding time 59 days. The profit factor is what the winning trades made over what the losing ones lost: under 1, the trades lose money on balance. Threshold: profit factor above 1 | 76% · 3.67 | Holds up |
Closed trades: enough to judge76 closed trades over 752 sessions. Under 30, a win rate, a profit factor or a luck test moves a lot with one trade more or less. Threshold: at least 30 | 76 | Holds up |
Profit still open at the endUnrealized PnL over all PnL, both before commission: 3 positions were still held when the backtest ended, $87,934 above what their shares cost at the last price, of $1,419,682 in all ($1,331,747 realized by the 76 closed trades). Over 30% means much of the result is a paper gain. Threshold: at most 30% of the profit | 6% | Holds up |
Max gross exposureThe book never held more than its capital: nothing borrowed, nothing to charge for. Threshold: at most 1.05x | 1.00x | Holds up |
| IV · Can It Be Traded | ||
Annual return, filled a bar laterWaiting one bar costs 10% of the return. Annual return 34.1% with fills at the signal bar's close, 30.6% at the next bar's open; the wait's effect on PnL is -$186,141.94. Threshold: waiting a bar costs under 20% of the return | 34.1% → 30.6% | Holds up |
Fill realism4 of 147 fills priced outside their bar's high-low range (3 above the high, 1 below the low). All of them cost the strategy, $359 in all, so the result is if anything understated. Typically the fixed slippage pushing a fill past a bar that closed at its high or low -- the engine's model, not the strategy's code. Limit orders or next-bar execution avoid it. Threshold: every fill inside its bar, at a size the bar could take | 4 of 147 outside the bar, against it | Holds up |
Costs' share of profit before costs1.11 pp a year: 35.2% before costs, 34.1% after. Threshold: under 25% of the profit before costs | 3% | Holds up |
Liquidity at $2.4mAt $2.4m, taking at most 10% of a day's volume. Threshold: every position sellable within a day at ≤ 10% of volume | all sellable within a day | Holds up |
Annual return is compounded (CAGR); volatility, Sharpe and Sortino count 252 sessions a year. The Sharpe ratio over the risk-free rate uses the one-month T-bill, 4.60% a year on average over the backtest -- the rate the factor analysis uses. QuantStats, beside this report, uses 0%; both are shown.
Interest on idle cash is not credited: the backtest earns nothing on cash. Had it earned the rate, the strategy's idle cash would have added about 0.15% a year, and its Sharpe ratio over the rate would be 1.26.
Buy & hold, 10 names buys the traded names in equal amounts on the first session and holds them to the end, on prices alone -- dividends are in neither it nor the strategy. The names were picked by the strategy, so this measures its timing, not its choice of names.
Every profit on this page is one of these. Realized is what the closed trades made -- each sale with the shares it closed, first in, first out; unrealized, what the shares still held are worth at the last price over what they cost. Both are before commission, and slippage is inside both, because it is inside the fill prices: Trading Costs reconstructs it and nothing takes it off again. The net profit is the change in the book, cash plus positions, and is checked against the start value compounded by the daily returns, which the engine records apart.
The interval and the probabilistic Sharpe ratio (PSR) allow for the skew and fat tails of the daily returns. Every version of a strategy that was backtested is a try: among N strategies with no edge at all, the best one shows a Sharpe ratio of about the second column by chance alone, and the third is the chance this one beats it -- the deflated Sharpe ratio. Tries are taken as independent. 95% is the usual bar.
The backtest cut in two at its middle session. A rule whose parameters were tuned on the whole period often works in one half only.
| Source | Amount |
|---|---|
| Realized: 76 closed trades, before commission | $1,331,747.37 |
| Unrealized: 3 positions still held, at the last price | $87,934.19 |
| Commission | -$17,878.23 |
| Other cash: dividends, interest, fees | $0.00 |
| Net profit: change in cash plus positions | $1,401,803.33 |
| Net profit from the daily returns | $1,401,803.33 |
| Difference | $0.00 |
| Measure | Value |
|---|---|
| Sharpe ratio at 0% | 1.47 |
| 95% interval | 0.34 to 2.60 |
| Chance the true Sharpe is above 0 (PSR) | 99% |
| Skew · excess kurtosis of daily returns | 0.30 · 4.13 |
| Sessions | 752 |
| Versions tried | Noise Reaches | Chance It Beats That |
|---|---|---|
| Tried once: above 0 | 0.00 | 99% |
| Best of 5 tries | 0.69 | 91% |
| Best of 10 tries | 0.91 | 83% |
| Best of 20 tries | 1.10 | 74% |
| Best of 50 tries | 1.32 | 60% |
| Metric | Oct 2023 – Apr 2025 | Apr 2025 – Oct 2026 |
|---|---|---|
| Annual return | 26.96% | 41.70% |
| Sharpe ratio at 0% | 1.10 | 2.00 |
| Max drawdown | -25.70% | -15.75% |
| Time in the market | 96% | 100% |
| Metric | Strategy | Buy & Hold, 10 Names | S&P 500 Equivalent |
|---|---|---|---|
| Total return | 140.18% | 127.16% | 79.52% |
| Annual return (compounded) | 34.13% | 31.65% | 21.66% |
| Annual volatility | 21.54% | 18.01% | 14.70% |
| Sharpe ratio over 4.60% risk-free | 1.26 | 1.36 | 1.09 |
| Sharpe ratio at 0% (as QuantStats) | 1.47 | 1.62 | 1.41 |
| Sortino ratio at 0% | 2.27 | 2.47 | 2.12 |
| Max drawdown | -25.70% | -22.76% | -18.95% |
| Calmar ratio | 1.33 | 1.39 | 1.14 |
| Worst day | -5.54% | -5.82% | -4.67% |
| Skew | 0.30 | 0.67 | 0.81 |
| Excess kurtosis | 4.13 | 12.93 | 15.14 |
| Beta to S&P 500 Equivalent | 0.90 | 1.10 | - |
| Alpha to S&P 500 Equivalent (CAPM, a year) | 13.92% | 6.49% | - |
| Time in the market | 98% | 100% | 100% |
| Average exposure (gross) | 0.98 | 1.00 | 1.00 |
The same backtest with its best sessions spent in cash -- the 5, 10, 20 days with the highest returns, out of 752. A strategy whose edge is spread over time loses some return; one that rests on a few days loses all of it.
Trades are counted as in Closed Trades: each sale with the shares it closed, PnL before commission.
The luck test takes the 76 trades and draws 76 of them again at random -- some twice, some not at all -- and adds them up; 5,000 times, from a fixed seed so the same backtest gets the same answer. If many of those totals are losses, the result depended on which trades happened to come up, not on an edge most of them share. It treats trades as independent and keeps their sizes.
The trade-by-trade curve climbs through the winners and falls through the losers to 100%. The higher its peak, the more the losers took back from a few large wins.
| Sessions | Total Return | Annual Return | Sharpe Ratio |
|---|---|---|---|
| All sessions | 140.18% | 34.13% | 1.47 |
| Without the best 5 | 81.11% | 22.02% | 1.09 |
| Without the best 10 | 49.81% | 14.50% | 0.79 |
| Without the best 20 | 9.27% | 3.01% | 0.25 |
| Measure | Value |
|---|---|
| Closed trades | 76 |
| Their PnL, before commission | $1,331,747.37 |
| Best 5 trades | $823,100.66 |
| Best 10% of trades (7 of 76) | $988,704.21 |
| best 5, share of their PnL | 62% |
| best 10%, share of their PnL | 74% |
| Their PnL without the best 5 | $508,646.71 |
| Luck test: chance of a loss | 0.0% |
| Luck test: bad case (5th percentile) | $630,984.91 |
| Luck test: typical (median) | $1,310,509.88 |
| Luck test: good case (95th percentile) | $2,088,172.60 |
Net PnL is each instrument's mark-to-market result: the change in the value of its position, less what was paid for it, less its commission. Slippage is inside it, as it is in the fill prices. Contribution adds up its daily PnL over the portfolio's value at the start of each day, so the contributions add up to the strategy's return before compounding. Avg. weight is over the days the position was held.
The two can disagree, even in sign. A dollar earned when the portfolio was small is a larger share of it than a dollar earned after it grew: a name that made money early and gave back a similar amount later shows a positive contribution and a small or negative PnL, and the reverse.
The trade columns count closed trades, as in Closed Trades -- each sale with the shares it closed -- and a trade's return is its PnL over what those shares cost.
| Symbol | Net PnL | Contribution | Share of PnL | Avg. Weight | Days Held | Commission | Trades | Win Rate | Avg. Trade | Best Trade | Worst Trade |
|---|---|---|---|---|---|---|---|---|---|---|---|
| NVDA | $364,134.61 | 28.66% | 26.0% | 33.7% | 332 | $2,241.82 | 12 | 83% | 26.44% | 82.26% | -13.12% |
| GOOGL | $283,299.78 | 16.29% | 20.2% | 33.2% | 270 | $1,857.08 | 9 | 78% | 21.30% | 48.96% | -6.44% |
| MSFT | $241,818.03 | 15.67% | 17.3% | 35.2% | 195 | $1,153.98 | 5 | 100% | 11.11% | 17.83% | 5.05% |
| WMT | $169,907.08 | 8.16% | 12.1% | 33.3% | 249 | $1,613.34 | 10 | 70% | 11.55% | 32.61% | -10.88% |
| AAPL | $142,049.89 | 8.28% | 10.1% | 33.7% | 169 | $1,404.69 | 6 | 100% | 9.96% | 16.22% | 2.97% |
| JPM | $134,744.14 | 10.92% | 9.6% | 32.9% | 164 | $2,015.93 | 6 | 83% | 7.24% | 17.46% | -5.63% |
| AMZN | $88,851.11 | 6.26% | 6.3% | 33.1% | 206 | $1,564.31 | 6 | 83% | 2.84% | 11.20% | -10.04% |
| JNJ | $53,972.73 | 1.51% | 3.9% | 34.5% | 296 | $2,510.20 | 10 | 70% | 3.89% | 20.93% | -8.48% |
| META | -$28,546.89 | 2.10% | -2.0% | 33.5% | 216 | $2,030.75 | 8 | 62% | 3.74% | 27.07% | -16.03% |
| XOM | -$48,427.15 | -3.29% | -3.5% | 32.5% | 93 | $1,486.12 | 4 | 25% | -2.37% | 4.15% | -11.21% |
Each tile is a name, inside its sector. Its size is the capital it took -- its share of the portfolio averaged over the whole backtest -- and its colour what it added to the return: red a loss, green a gain, darkest at ±15.8% and beyond. Hover a tile for its numbers.
| Sector | Average | Max |
|---|---|---|
| Information Technology | 31.57% | 69.56% |
| Communication Services | 21.53% | 37.62% |
| Health Care | 13.60% | 50.01% |
| Consumer Staples | 11.02% | 35.97% |
| Consumer Discretionary | 9.06% | 35.84% |
| Financials | 7.18% | 34.74% |
| Energy | 4.02% | 36.42% |
| Sector | Net PnL | Contribution | Share of PnL |
|---|---|---|---|
| Information Technology | $748,002.53 | 52.61% | 53.4% |
| Communication Services | $254,752.89 | 18.39% | 18.2% |
| Financials | $134,744.14 | 10.92% | 9.6% |
| Consumer Staples | $169,907.08 | 8.16% | 12.1% |
| Consumer Discretionary | $88,851.11 | 6.26% | 6.3% |
| Health Care | $53,972.73 | 1.51% | 3.9% |
| Energy | -$48,427.15 | -3.29% | -3.5% |
The attribution adds up the arithmetic mean return over the sessions the factors cover -- not the compounded annual return of Key Performance Metrics, and not past the last month the library has published.
The strategy's daily return over the risk-free rate, regressed on the fama-French 5 factors + momentum from Kenneth French's data library. Mkt-RF -- the US stock market over the risk-free rate. SMB -- size: small companies minus big ones. HML -- value: high book-to-market (cheap) minus low (expensive). RMW -- profitability: robust operating profitability minus weak. CMA -- investment: companies that invest conservatively minus aggressively. MOM -- momentum: the past year's winners minus its losers.
A beta is how much of a factor the strategy carries: 1.0 on Mkt-RF moves with the market, a positive HML leans to value. Alpha is the return the factors do not explain; it is worth something only with a t-stat beyond about 2 (p < 0.05). Standard errors are Newey-West, robust to the autocorrelation of daily returns. The attribution splits the average annual return into what each factor paid at its average beta, and the alpha.
The style box places the strategy by how its returns moved: with small against big companies (SMB) and cheap against expensive ones (HML). The lines are at SMB 0.15 and 0.55 and HML ±0.15; the S&P 500 sits near SMB -0.15, the Russell 2000 near 0.8. The path is the 126-session betas a month apart, darker as they get recent.
The decomposition and the attribution by year use the full-period betas, and add daily returns up rather than compounding them, so the parts sum exactly to the strategy's return over the risk-free rate (the black line and diamonds).
| Factor | Estimate | T-stat | P-value |
|---|---|---|---|
| Alpha (annualized) | 15.17% | 1.61 | 0.107 |
| Mkt-RF | 0.86 | 10.84 | < 0.001 |
| SMB | 0.02 | 0.25 | 0.803 |
| HML | -0.29 | -3.51 | < 0.001 |
| RMW | 0.46 | 5.56 | < 0.001 |
| CMA | -0.19 | -1.25 | 0.210 |
| MOM | 0.22 | 3.55 | < 0.001 |
| Metric | Value |
|---|---|
| R-squared | 0.46 |
| Adjusted R-squared | 0.45 |
| Residual volatility (annualized) | 16.09% |
| Information ratio (alpha / residual vol) | 0.94 |
| Sessions | 724 |
| Period | 11 Oct 2023 - 31 Aug 2026 |
| Source | Annual Return |
|---|---|
| Risk-free rate | 4.68% |
| Mkt-RF | 15.25% |
| SMB | -0.05% |
| HML | -1.57% |
| RMW | -3.23% |
| CMA | 0.43% |
| MOM | 2.44% |
| Alpha | 15.17% |
| Strategy (arithmetic mean, to 31 Aug 2026) | 33.11% |
Each drawdown -- from the close of its peak to the close of its valley -- split across the names that made it. A name's share is its mark-to-market PnL over those days, after commission, over the portfolio's value at the peak, so the shares are points of the drawdown and add up to its depth. What remains, mostly dividends paid into cash, is shown on its own.
The same split by sector: whether a drawdown was one bet held several times, or losses spread across the book.
| Symbol | Points of the Drawdown |
|---|---|
| META | -6.64% |
| WMT | -5.18% |
| XOM | -4.22% |
| AMZN | -3.50% |
| JNJ | -3.14% |
| JPM | -3.02% |
| # | Peak | Valley | Recovered | Depth | Days | Largest Drag | Second | Third |
|---|---|---|---|---|---|---|---|---|
| #1 | 13 Feb 2025 | 8 Apr 2025 | 31 Jul 2025 | -25.70% | 54 | META -6.6 pt | WMT -5.2 pt | XOM -4.2 pt |
| #2 | 10 Jul 2024 | 7 Aug 2024 | 4 Dec 2024 | -17.18% | 28 | NVDA -9.2 pt | GOOGL -3.5 pt | AAPL -3.2 pt |
| #3 | 14 May 2026 | 26 Jun 2026 | 3 Sep 2026 | -15.75% | 43 | NVDA -6.3 pt | GOOGL -5.3 pt | AMZN -4.2 pt |
| #4 | 11 Apr 2024 | 25 Apr 2024 | 28 May 2024 | -10.86% | 14 | META -5.3 pt | NVDA -2.8 pt | AMZN -2.7 pt |
| #5 | 12 Aug 2025 | 2 Sep 2025 | 15 Sep 2025 | -6.21% | 21 | META -2.4 pt | NVDA -2.3 pt | MSFT -1.5 pt |
Up capture is how much of S&P 500 Equivalent's rise the strategy took in the months S&P 500 Equivalent rose -- 120% is a fifth more than the market, 60% a bit over half -- and down capture how much of its fall it took when it fell; under 100% is protection. A ratio above 1 is the asymmetry a strategy wants. The two betas are the same question day by day: a strategy that falls with the market but lags it up has a down beta above its up beta.
A month is rising or falling by S&P 500 Equivalent's return, and volatile when S&P 500 Equivalent's daily volatility in it is above the median month's.
On the last chart, shaded months are volatile ones: red when the market fell, green when it rose.
| Measure | Value |
|---|---|
| Up capture | 145% |
| Down capture | 146% |
| Capture ratio (up / down) | 1.00 |
| Beta on up days | 0.77 |
| Beta on down days | 0.88 |
| Months S&P 500 Equivalent rose | 24 of 35 |
| Partial months left out | Oct 2023 (15 sessions), Oct 2026 (7 sessions) |
| Regime | Months | Strategy | S&P 500 Equivalent | Beat S&P 500 Equivalent |
|---|---|---|---|---|
| Rising, calm | 15 | 5.27% | 4.30% | 73% |
| Rising, volatile | 9 | 5.47% | 2.47% | 67% |
| Falling, calm | 3 | -1.52% | -0.59% | 0% |
| Falling, volatile | 8 | -3.72% | -2.77% | 38% |
VaR 95% is the daily loss exceeded on one day in twenty, read from the backtest's own days rather than from a normal curve -- which fat tails would make too mild; CVaR is the average loss on those days. EVaR (entropic VaR) is an upper bound on both, derived from the whole distribution rather than its tail alone, so it reacts more to fat tails. Drawdown at risk, CDaR and EDaR are the same three ideas applied to drawdowns: the depth exceeded on the 5% of days furthest below a peak, the average depth on those days, and its entropic bound. The Ulcer index is the root mean square of all drawdowns, so it grows with both depth and duration. The Gini mean difference is the average gap between any two daily returns -- a dispersion measure that, unlike volatility, is not dominated by a few extreme days.
Each holding's share of the portfolio's volatility and of its CVaR, for the average weights held over the backtest. A name whose risk share is well above its weight is where the risk is concentrated.
Daily-return correlations of the 10 most-held names, average pair 0.19. Clustering puts names that move together side by side: a block of high correlation is one bet held several times.
Each rule is fitted on the previous 252 sessions and held for the next 21, over the names this strategy traded, from 14 Oct, 2024, without trading costs. The names themselves come from the strategy, so this compares its timing and sizing with simple rules -- not its choice of stocks. Where no name is expected to beat cash, max Sharpe holds them equally.
| Measure | Strategy | S&P 500 Equivalent |
|---|---|---|
| Annual mean return (arithmetic) | 31.69% | 20.69% |
| Annualized volatility | 21.54% | 14.70% |
| Annualized semi-deviation | 14.96% | 10.38% |
| Mean absolute deviation (daily) | 0.96% | 0.64% |
| Gini mean difference (daily) | 1.43% | 0.95% |
| VaR 95%, daily (historical) | -2.00% | -1.43% |
| CVaR 95%, daily (historical) | -2.94% | -2.08% |
| EVaR 95% (daily) | -3.91% | -3.01% |
| Worst day | -5.54% | -4.67% |
| Max drawdown | -25.70% | -18.95% |
| Average drawdown | -4.94% | -1.86% |
| Drawdown at risk 95% | -17.62% | -7.94% |
| CDaR 95% | -20.45% | -10.89% |
| EDaR 95% | -21.94% | -13.66% |
| Ulcer index | 0.07 | 0.03 |
| Symbol | Avg. Weight | Volatility Share | CVaR Share |
|---|---|---|---|
| NVDA | 15.2% | 30.9% | 31.1% |
| META | 9.8% | 15.3% | 14.4% |
| GOOGL | 12.2% | 14.8% | 15.8% |
| AMZN | 9.2% | 13.1% | 14.0% |
| MSFT | 9.3% | 8.9% | 9.2% |
| AAPL | 7.7% | 7.0% | 7.3% |
| WMT | 11.2% | 5.0% | 4.7% |
| JPM | 7.3% | 4.8% | 4.5% |
| XOM | 4.1% | 0.4% | 0.8% |
| JNJ | 13.9% | 0.0% | -1.9% |
| Allocation | Annual Return | Sharpe | Max Drawdown |
|---|---|---|---|
| Strategy | 23.16% | 1.16 | -25.70% |
| Equal Weighted | 25.94% | 1.45 | -20.48% |
| Inverse Volatility | 25.46% | 1.60 | -18.78% |
| Hierarchical Risk Parity | 25.15% | 1.79 | -16.69% |
| Max Sharpe (Mean-Variance) | 27.63% | 1.54 | -23.88% |
The capital asset pricing model (CAPM) holds that the market pays for one risk only: the part that moves with the market, measured by beta. Risk a portfolio could have diversified away earns nothing. The security market line is the return the model asks for each beta -- the risk-free rate at 0, the benchmark's return at 1. A point above the line made more than its beta asks for; the gap is Jensen's alpha.
The capital market line runs from the risk-free rate through the benchmark: every mix of the market and cash sits on it. Above it is a better Sharpe ratio than the market's. M² is the strategy's return scaled to the benchmark's volatility, so the two compare in percent; the Treynor ratio is excess return per unit of beta rather than of volatility. Specific volatility is the risk the market does not explain, the part CAPM says goes unpaid.
The efficient frontier is the highest return any fixed mix of the traded names offered at each volatility -- long only, fully invested -- and the line from the risk-free rate that touches it marks the mix with the best Sharpe ratio. It is measured with the returns the names went on to make, so it is hindsight: no one could have held it, and it is a ceiling, not a target. A strategy that changes its holdings can still land above it -- that is what timing is for. One well inside the equal-weight point did worse than the simplest fixed mix of its own names.
Returns here are means of daily returns times 252, and volatility the daily one times √252, as mean-variance theory has them -- not the compounded returns of Key Performance Metrics, whose alpha is at a 0% rate, as QuantStats has it. The risk-free rate is the one-month T-bill, 4.60% a year on average.
| Measure | Strategy | S&P 500 Equivalent |
|---|---|---|
| Risk-free rate (the one-month T-bill), a year | 4.60% | |
| Annual return (mean) | 31.69% | 20.69% |
| Annual volatility | 21.54% | 14.70% |
| Beta | 0.90 | 1.00 |
| Correlation | 0.62 | 1.00 |
| Variance the market explains (R²) | 38% | 100% |
| Systematic volatility | 13.25% | 14.70% |
| Specific volatility | 16.98% | 0.00% |
| Return CAPM asks for its beta | 19.10% | 20.69% |
| Jensen's alpha, a year | +12.59% | 0.00% |
| Treynor ratio | 30.05% | 16.09% |
| Sharpe ratio (mean, over the rate) | 1.26 | 1.09 |
| M² (at the benchmark's volatility) | 23.08% | 20.69% |
| Tracking error | 17.04% | - |
| Information ratio | 0.65 | - |
| Portfolio | Return | Volatility | Sharpe |
|---|---|---|---|
| Strategy | 31.69% | 21.54% | 1.26 |
| S&P 500 Equivalent | 20.69% | 14.70% | 1.09 |
| Equal weight, held fixed | 30.07% | 15.97% | 1.59 |
| Strategy's average weights, held fixed | 32.40% | 17.05% | 1.63 |
| Minimum variance (hindsight) | 23.71% | 11.13% | 1.72 |
| Max Sharpe (hindsight) | 31.12% | 13.05% | 2.03 |
| Name | Weight |
|---|---|
| JNJ | 32.4% |
| WMT | 17.6% |
| NVDA | 17.1% |
| JPM | 11.5% |
| XOM | 11.4% |
| GOOGL | 9.6% |
| META | 0.5% |
Predicted is the volatility the book carried each morning: that day's weights times the covariance of its names over the previous 63 sessions. Realized is the strategy's volatility over the next 21 sessions it held positions -- days in cash are left out, as the prediction is the risk of the positions. A bias near 1 and a high correlation mean the strategy's risk was what its positions said it was. Well above 1, risk arrived that the positions did not show -- crowded names, regime changes, gaps. Well below 1, the positions were calmer than their history: the strategy tends to hold them after a volatile stretch, as a breakout entry does.
Shares of risk are marginal contributions to the predicted volatility, averaged over each month; a hedge, whose share is negative, is drawn as zero.
The effective number of names is 1 / Σ w² over the gross book: ten equal positions count as ten, one 90% position and nine small ones as barely more than one. Below the names held, the book is concentrated in a few of them.
| Measure | Value |
|---|---|
| Days compared | 679 |
| Average predicted volatility | 21.5% |
| Average realized volatility | 20.8% |
| Bias (realized / predicted) | 1.02 |
| Correlation | 0.34 |
| Days the next month ran 1.5x hotter | 8% |
| Measure | Value |
|---|---|
| Average names held | 3.0 |
| Average effective names | 3.0 |
| Lowest effective names | 2.0 (14 May 2025) |
| Average top-3 share | 100% |
| Largest single weight | 53% (14 May 2025) |
| Symbol | Max Allocation |
|---|---|
| MSFT | 52.91% |
| JNJ | 50.01% |
| NVDA | 40.20% |
| AAPL | 38.05% |
| GOOGL | 37.62% |
| META | 36.90% |
| XOM | 36.42% |
| WMT | 35.97% |
| AMZN | 35.84% |
| JPM | 34.74% |
Turnover is the value traded, buys and sells together, over the portfolio's value: buying the whole portfolio and selling it again is 2×. One-way counts only the smaller of the two sides -- how many times the portfolio was replaced.
| Metric | Value |
|---|---|
| Fills | 147 |
| Symbols traded | 10 |
| Trading days | 36 of 752 (4.8%) |
| Median sessions between trading days | 21 |
| Avg. fills per trading day | 4.1 |
| Most fills in a day | 6 |
| Avg. symbols per trading day | 4.1 |
| Buys | 71 fills, $25,742,867 |
| Sells | 76 fills, $24,760,604 |
| Traded value | $50,503,470 |
| Avg. fill value | $343,561 |
| Median fill value | $379,719 |
| Largest fill | $850,782 |
| Avg. shares per fill | 1,784 |
| Turnover, a year (traded / portfolio) | 9.7× |
| One-way turnover, a year | 4.7× |
| Turnover on an average trading day | 80% |
| Largest daily turnover | 200% |
A trade is shares bought and later sold -- or sold short and later bought back -- and what they earned in between. Every sale closes the shares bought earliest first, and every sale is a trade of its own:
So a strategy that trims its holdings at every rebalance shows many more trades than positions. Fills on the same side within 8 hours count as one. What is still held at the end is not a trade -- it was never sold -- and its paper profit is counted apart, as unrealized PnL (Profit Reconciliation, in Performance). A trade's PnL is before commission; its return is its PnL over what its shares cost.
| All | |
|---|---|
| Trades | 76 |
| Percent profitable | 76% |
| Winning trades | 58 |
| Losing trades | 18 |
| Even trades | 0 |
| All | |
|---|---|
| Total PnL, before commission | $1,331,747.37 |
| Gross profit (winning trades) | $1,830,197.79 |
| Gross loss (losing trades) | -$498,450.42 |
| Profit factor | 3.67 |
| Avg. trade PnL | $17,522.99 |
| Avg. winning trade | $31,555.13 |
| Avg. losing trade | -$27,691.69 |
| Ratio Avg. Win:Avg. Loss | 1.14 |
| Largest winning trade | $213,285.45 |
| Largest losing trade | -$98,152.96 |
| All | |
|---|---|
| Avg duration | 66 days |
| Median duration | 59 days |
| Longest duration | 214 days |
| Shortest duration | 28 days |
| All | |
|---|---|
| Average, all trades | 11.31% |
| Average, winners | 16.78% |
| Average, losers | -6.30% |
| Median, all trades | 9.05% |
| Median, winners | 11.34% |
| Median, losers | -5.87% |
| Largest winning trade | 82.26% |
| Largest losing trade | -16.03% |
| AAPL | AMZN | GOOGL | JNJ | JPM | META | MSFT | NVDA | WMT | XOM | |
|---|---|---|---|---|---|---|---|---|---|---|
| Average, all trades | 9.96% | 2.84% | 21.30% | 3.89% | 7.24% | 3.74% | 11.11% | 26.44% | 11.55% | -2.37% |
| Average, winners | 9.96% | 5.41% | 28.76% | 8.08% | 9.82% | 10.75% | 11.11% | 33.09% | 19.27% | 4.15% |
| Average, losers | - | -10.04% | -4.79% | -5.87% | -5.63% | -7.95% | - | -6.81% | -6.46% | -4.54% |
| Median, all trades | 11.15% | 4.62% | 15.76% | 2.92% | 9.63% | 2.99% | 8.49% | 25.24% | 14.47% | -1.21% |
| Median, winners | 11.15% | 5.85% | 34.18% | 6.49% | 9.65% | 9.77% | 8.49% | 28.35% | 16.35% | 4.15% |
| Median, losers | - | -10.04% | -4.79% | -4.96% | -5.63% | -6.12% | - | -6.81% | -6.49% | -1.36% |
| Largest winning trade | 16.22% | 11.20% | 48.96% | 20.93% | 17.46% | 27.07% | 17.83% | 82.26% | 32.61% | 4.15% |
| Largest losing trade | 2.97% | -10.04% | -6.44% | -8.48% | -5.63% | -16.03% | 5.05% | -13.12% | -10.88% | -11.21% |
Signs: a move in bps is positive when the next open was worse for the fill -- higher for a buy, lower for a sell. The effect on PnL is positive when waiting would have paid more, negative when it would have cost.
This backtest fills each order on the bar whose data produced it, at that bar's close. A real order sent on that data reaches the market on the bar after. Here every fill is priced again at the open of the instrument's next bar in the data -- the next session for daily bars -- with the same quantity and the same slippage. From that open on the two books hold the same shares, so the difference is exactly the price paid, booked on the day of the next bar and kept in cash rather than reinvested.
A strategy that buys what has just risen and sells what has just fallen tends to pay for the wait; one whose edge is real survives it. The trades themselves are not re-decided: the same shares, a bar later.
| Metric | Signal Bar's Close | Next Bar's Open |
|---|---|---|
| Total return | 140.18% | 121.57% |
| Annual return | 34.13% | 30.55% |
| Annual volatility | 21.54% | 22.30% |
| Sharpe ratio | 1.47 | 1.31 |
| Max drawdown | -25.70% | -28.17% |
| Metric | Value |
|---|---|
| Fills repriced | 147 of 147 |
| Move to the next open (value-weighted) | +36.9 bps |
| buys | +53.7 bps |
| sells | +19.3 bps |
| Fills the wait made worse | 51% |
| Fills the wait made better | 48% |
| Effect of waiting on PnL | -$186,141.94 (a loss) |
| vs starting capital | -18.61% |
| Final value, signal bar's close | $2,401,803.33 |
| Final value, next bar's open | $2,215,661.39 |
| Difference in final value | -$186,141.94 = the sum over the fills |
A market order fills on the bar it is placed in, at that bar's close, moved 5 bps against the strategy for slippage. A single bar fills at most 10% of its volume; the rest of the order waits for the next bars, at their prices.
A limit order fills only on a bar that trades through its limit, and never at a worse price; a stop becomes a market order once a bar trades through the stop. Orders stay open until filled or cancelled.
Not simulated: the bid-ask spread (other than inside the fixed basis points), the order book and queue position, partial liquidity inside a bar, and the price impact of the strategy's own size -- which is why the checks below compare every fill with its bar.
Cost vs bar typical price compares each fill with its bar's (high + low + close) / 3, a stand-in for the bar's average trade (VWAP); positive is worse. Fills at the close far above it mean the strategy trades after a strong move inside the bar -- buying near the top of a rising day. An order worked through the day would have paid that difference; Next-Bar Fills shows the same question a bar later.
| Metric | Value |
|---|---|
| Orders | 147 |
| Fills | 147 |
| Fills per order | 1.00 |
| Traded value | $50,503,470 |
| Median wait, order to first fill | same bar |
| Longest wait | same bar |
| Median share of bar volume | 0.004% |
| 95th percentile share | 0.076% |
| Largest share | 0.15% |
| Implementation shortfall (value-weighted) | 5.00 bps |
| of which delay | 0.00 bps |
| of which slippage | 5.00 bps |
| Cost vs the bar's typical price (value-weighted) | +5.09 bps |
| Type | Orders | Filled | Partial | Unfilled |
|---|---|---|---|---|
| Market | 147 | 147 | 0 | 0 |
Commission is 0.0354% of the value of each fill (ziplime's PerDollar model). It is charged to the order as it fills and comes out of cash; it is not part of the fill price.
Slippage: every fill is priced 5 bps worse than the bar's close -- a buy at close × 1.0005, a sell at close × 0.9995 (ziplime's FixedBasisPointsSlippage). It stands in for the bid-ask spread and market impact. It is in the fill price, so the backtest never records it as a cost; the report reconstructs it from the fills.
Volume limit: a fill takes at most 10% of the bar's volume. The rest of the order waits for later bars, so a large order can fill over several bars, at several prices, and pay commission on each fill.
Execution: an order fills on the bar it was placed in, at that bar's close.
Both costs are already inside every return, metric and chart in this report. Not modeled by these settings: borrowing costs of short positions, financing of leverage, taxes, and market impact beyond the fixed basis points.
The last two charts charge every dollar traded an extra 3 to 50 bps on top of the costs above -- how much worse execution the strategy can take before its edge is gone. The cost summary has the point where it is: the extra cost that would erase the profit.
| Parameter | Setting |
|---|---|
| Commission model | Per dollar |
| Commission rate | 0.0354% of value |
| Slippage | 5 bps |
| Volume limit | 10% of bar volume |
| Fill price | Bar close |
| Fills on | Same bar |
| Starting capital | $1,000,000 |
| Metric | Value |
|---|---|
| Commissions | $17,878.23 |
| Slippage (reconstructed) | $25,251.50 |
| Total trading costs | $43,129.72 |
| Traded value | $50,503,470 |
| Costs per traded value | 8.54 bps |
| Costs vs starting capital | 4.31% |
| Costs vs profit before costs | 2.98% |
| Extra cost that would erase the profit | +278 bps of traded value |
| Annual return before costs | 35.24% |
| Annual return after costs | 34.13% |
| Annual drag from costs | 1.11 pp |
| Orders charged | 147 |
| Fills | 147 |
| Avg. commission per order | $121.62 |
| Avg. commission per share | $0.0682 |
| Symbol | Commission | Slippage | Total | Share |
|---|---|---|---|---|
| JNJ | $2,510.20 | $3,545.50 | $6,055.70 | 14.0% |
| NVDA | $2,241.82 | $3,166.51 | $5,408.33 | 12.5% |
| META | $2,030.75 | $2,868.10 | $4,898.85 | 11.4% |
| JPM | $2,015.93 | $2,847.39 | $4,863.32 | 11.3% |
| GOOGL | $1,857.08 | $2,623.06 | $4,480.14 | 10.4% |
| WMT | $1,613.34 | $2,278.78 | $3,892.12 | 9.0% |
| AMZN | $1,564.31 | $2,209.50 | $3,773.81 | 8.7% |
| XOM | $1,486.12 | $2,098.83 | $3,584.96 | 8.3% |
| AAPL | $1,404.69 | $1,984.06 | $3,388.75 | 7.9% |
| MSFT | $1,153.98 | $1,629.78 | $2,783.76 | 6.5% |
The strategy sizes its orders from its capital, so more capital means larger fills. Up to 1% of a day's volume a fill barely moves the price; 10% is the most the engine lets a fill take of a bar. The checks below sell every position at $2.4m, taking at most 10% of a day's volume, with the trailing 5-day mean as that volume.
| Measure | Value |
|---|---|
| Capital measured at | $2.4m (the end of the backtest) |
| Largest fill, share of its day's volume | 0.150% |
| Median fill, share of its day's volume | 0.0041% |
| Starting capital with fills up to 1% of volume | $6.6m |
| Starting capital with fills up to 10% of volume | $66.5m |