Zipfolio Tearsheet: Portfolio, Execution & Cost Analysis

11 Oct 2023 – 9 Oct 2026 · 752 sessions

Strategy
Momentum rotation: top 3 of 10 US large caps, monthly (example)
Benchmark
SPY, price return
Universe
10 names chosen in the code
Capital
$1,000,000
Fills
at the signal bar's close, 5 bps slippage, up to 10% of a bar's volume
Commission
0.0354% of value
Luck test
5,000 redraws, seed 0

Generated by ZipLime Zipfolio v0.3.0 on 15 Oct 2026 08:19 UTC

Accounting reconcilesAssurance: ledger · 16 of 16 checks hold

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.

View evidence
CheckStatusObservedExpectedDifferenceWhat was checked
Fills
INPUT.FILL_UNIQUENESS
PASS147——All 147 fills have a unique id, a signed non-zero quantity and a positive price.
Sessions
INPUT.TIMESTAMP_ALIGNMENT
PASS752——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
PASS2401803.33 USD2401803.33 USD0.00 USDCash 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
PASS0.0061041396400.0061041396400.000000000000Each 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 USD0.00 USDCash 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
PASS7393.0000007393.0000000.000000Every 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
PASS1401803.33 USD1401803.33 USD0.00 USDThe 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
PASS1401803.33 USD1401803.33 USD0.00 USDEach 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
PASS1331747.37 USD1331747.37 USD0.00 USDRealized (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
PASS17878.23 USD17878.23 USD0.00 USDThe 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
PASS1401803.33 USD1401803.33 USD0.00 USDSlippage 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
PASS1401803.33 USD1401803.33 USD0.00 USDThe 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
PASS1401803.33 USD1401803.33 USD0.00 USDThe sectors add up to the instruments' net PnL.
Trades are real closes
ROUND_TRIP.SYNTHETIC_CLOSURES
PASS00—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
PASS00—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
PASS00—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

Summary

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.

In the market
98% of sessions · exposure 0.98
Style
Large Growth
Now
-2.9% from the 3 Sep 2026 high
Profit gone at
+278 bps of extra cost
Capacity
$6.6m at 1% of volume
Score
10/16
Critical
0
Needs a look
6
Holds up
10
Check tap a row for detailsValueVerdict
I · Where the Return Came From
Annual return vs S&P 500 Equivalent

Compounded 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

The numbers: Performance →

34.1% vs 21.7%Holds up
Against buy & hold, 10 names

The 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.62Needs a look
More than luck3
  • Holds up Sharpe ratio beyond luck (PSR): PSR 99%

    Sharpe 1.47, 95% interval 0.34 to 2.60 over 752 sessions. The best of strategies with no edge reaches about 0.91 after 10 tries, by chance.

    Threshold: ≥ 95% chance the true Sharpe is above 0

    The numbers: Performance →

  • Holds up Luck test: chance of a loss: 0%

    Redrawing the same trades at random, the total is a loss 0% of the time; a bad case (5th percentile) $630,985, a good one $2,088,173.

    Threshold: under 10% of redraws lose money

    The numbers: Profit Concentration →

  • Needs a look Alpha after factors: +15.2% a year, n.s.

    After Fama-French 5 factors + momentum: not significant (p = 0.11). No evidence of a return beyond what the factors pay: an alpha that is not significant may be luck, and a negative one is a cost. Significant exposures: Mkt-RF 0.86, HML -0.29, RMW 0.46, MOM 0.22.

    Threshold: positive, with p < 0.05

    The numbers: Factor Analysis →

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
  • Holds up Total return without the best 5 days: 140.2% → 81.1%

    The return does not hang on a few days. Total return 140.2%; without its 5 best days of 752, 81.1%.

    Threshold: still positive without the best 20 days

    The numbers: Profit Concentration →

  • Needs a look Profit from the best 5 trades: 62%

    76 closed trades in all; without the best 5, $508,646.71. Half or more from five trades needs a look; over 100% means the rest lost money together, and the result turns into a loss without them.

    Threshold: under 50% of the profit, and a profit without them

    The numbers: Profit Concentration →

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 Equivalent

The 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.

The numbers: Drawdowns →

-25.7% vs -19.0%Needs a look
Up / down capture

Against 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.

The numbers: Market Regimes →

145% / 146%Needs a look
Longest time below a peak

From 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

The numbers: Drawdowns →

6 monthsHolds up
Concentration in one name4
  • Needs a look Largest position, typical day: 34% (max 53%)

    The largest position is 34% of the portfolio on a typical day it holds anything, 53% at its largest. Over 25% means one name can swing the result.

    Threshold: at most 25%

    The numbers: Positions →

  • Holds up Profit from the top 2 names: 46% (NVDA, GOOGL)

    NVDA and GOOGL made 46% of the net PnL; 10 instruments held in all. Over 100% means the rest lost money.

    Threshold: under 75% of the net PnL

    The numbers: Instruments →

  • Needs a look Risk from the top name, typical day: 48% (most often NVDA)

    On a typical day the riskiest name carried 48% of the book's predicted volatility, NVDA more often than any other. A position can be a modest weight and still most of the risk. Over 40% needs a look.

    Threshold: at most 40% of the risk

    The numbers: Risk Over Time →

  • Holds up Largest sector, typical day: 35% (Information Technology)

    On a typical day the largest sector held 35% of the gross book, Information Technology more often than any other. Names in one sector fall together; over 40% needs a look.

    Threshold: at most 40% of the book

    The numbers: Sector Analysis →

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 factor

76 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

The numbers: Closed Trades →

76% · 3.67Holds up
Closed trades: enough to judge

76 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

The numbers: Closed Trades →

76Holds up
Profit still open at the end

Unrealized 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

The numbers: Closed Trades →

6%Holds up
Max gross exposure

The book never held more than its capital: nothing borrowed, nothing to charge for.

Threshold: at most 1.05x

The numbers: Positions →

1.00xHolds up
IV · Can It Be Traded
Annual return, filled a bar later

Waiting 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

The numbers: Next-Bar Fills →

34.1% → 30.6%Holds up
Fill realism

4 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

The numbers: Execution →

4 of 147 outside the bar, against itHolds up
Costs' share of profit before costs

1.11 pp a year: 35.2% before costs, 34.1% after.

Threshold: under 25% of the profit before costs

The numbers: Trading Costs →

3%Holds up
Liquidity at $2.4m

At $2.4m, taking at most 10% of a day's volume.

Threshold: every position sellable within a day at ≤ 10% of volume

The numbers: Capacity →

all sellable within a dayHolds up
IWhere the Return Came From3 need a look

Performance

How to read this section

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.

Profit Reconciliation

SourceAmount
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

Is the Sharpe Ratio More than Luck?

MeasureValue
Sharpe ratio at 0%1.47
95% interval0.34 to 2.60
Chance the true Sharpe is above 0 (PSR)99%
Skew · excess kurtosis of daily returns0.30 · 4.13
Sessions752

Against What Noise Reaches after Many Tries

Versions triedNoise ReachesChance It Beats That
Tried once: above 00.0099%
Best of 5 tries0.6991%
Best of 10 tries0.9183%
Best of 20 tries1.1074%
Best of 50 tries1.3260%

First Half and Second Half

MetricOct 2023 – Apr 2025Apr 2025 – Oct 2026
Annual return26.96%41.70%
Sharpe ratio at 0%1.102.00
Max drawdown-25.70%-15.75%
Time in the market96%100%

Key Performance Metrics

MetricStrategyBuy & Hold, 10 NamesS&P 500 Equivalent
Total return140.18%127.16%79.52%
Annual return (compounded)34.13%31.65%21.66%
Annual volatility21.54%18.01%14.70%
Sharpe ratio over 4.60% risk-free1.261.361.09
Sharpe ratio at 0% (as QuantStats)1.471.621.41
Sortino ratio at 0%2.272.472.12
Max drawdown-25.70%-22.76%-18.95%
Calmar ratio1.331.391.14
Worst day-5.54%-5.82%-4.67%
Skew0.300.670.81
Excess kurtosis4.1312.9315.14
Beta to S&P 500 Equivalent0.901.10-
Alpha to S&P 500 Equivalent (CAPM, a year)13.92%6.49%-
Time in the market98%100%100%
Average exposure (gross)0.981.001.00

Profit Concentration

How to read this section

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.

Without the Best Days

SessionsTotal ReturnAnnual ReturnSharpe Ratio
All sessions140.18%34.13%1.47
Without the best 581.11%22.02%1.09
Without the best 1049.81%14.50%0.79
Without the best 209.27%3.01%0.25

The Best Trades and the Luck Test

MeasureValue
Closed trades76
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 PnL62%
best 10%, share of their PnL74%
Their PnL without the best 5$508,646.71
Luck test: chance of a loss0.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

Instruments

How to read this section

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.

Returns by Instrument

SymbolNet PnLContributionShare of PnLAvg. WeightDays HeldCommissionTradesWin RateAvg. TradeBest TradeWorst Trade
NVDA$364,134.6128.66%26.0%33.7%332$2,241.821283%26.44%82.26%-13.12%
GOOGL$283,299.7816.29%20.2%33.2%270$1,857.08978%21.30%48.96%-6.44%
MSFT$241,818.0315.67%17.3%35.2%195$1,153.985100%11.11%17.83%5.05%
WMT$169,907.088.16%12.1%33.3%249$1,613.341070%11.55%32.61%-10.88%
AAPL$142,049.898.28%10.1%33.7%169$1,404.696100%9.96%16.22%2.97%
JPM$134,744.1410.92%9.6%32.9%164$2,015.93683%7.24%17.46%-5.63%
AMZN$88,851.116.26%6.3%33.1%206$1,564.31683%2.84%11.20%-10.04%
JNJ$53,972.731.51%3.9%34.5%296$2,510.201070%3.89%20.93%-8.48%
META-$28,546.892.10%-2.0%33.5%216$2,030.75862%3.74%27.07%-16.03%
XOM-$48,427.15-3.29%-3.5%32.5%93$1,486.12425%-2.37%4.15%-11.21%

Sector Analysis

How to read this section

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 Allocation

SectorAverageMax
Information Technology31.57%69.56%
Communication Services21.53%37.62%
Health Care13.60%50.01%
Consumer Staples11.02%35.97%
Consumer Discretionary9.06%35.84%
Financials7.18%34.74%
Energy4.02%36.42%

Profit by Sector

SectorNet PnLContributionShare of PnL
Information Technology$748,002.5352.61%53.4%
Communication Services$254,752.8918.39%18.2%
Financials$134,744.1410.92%9.6%
Consumer Staples$169,907.088.16%12.1%
Consumer Discretionary$88,851.116.26%6.3%
Health Care$53,972.731.51%3.9%
Energy-$48,427.15-3.29%-3.5%

Factor Analysis

How to read this section

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 Exposures (Fama-French 5 factors + momentum)

FactorEstimateT-statP-value
Alpha (annualized)15.17%1.610.107
Mkt-RF0.8610.84< 0.001
SMB0.020.250.803
HML-0.29-3.51< 0.001
RMW0.465.56< 0.001
CMA-0.19-1.250.210
MOM0.223.55< 0.001

Model Fit

MetricValue
R-squared0.46
Adjusted R-squared0.45
Residual volatility (annualized)16.09%
Information ratio (alpha / residual vol)0.94
Sessions724
Period11 Oct 2023 - 31 Aug 2026

Return Attribution

SourceAnnual Return
Risk-free rate4.68%
Mkt-RF15.25%
SMB-0.05%
HML-1.57%
RMW-3.23%
CMA0.43%
MOM2.44%
Alpha15.17%
Strategy (arithmetic mean, to 31 Aug 2026)33.11%

Summary ↑

IIWhat It Risked3 need a look

Drawdowns

How to read this section

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.

Drawdown #1, by Name (-25.7%)

SymbolPoints of the Drawdown
META-6.64%
WMT-5.18%
XOM-4.22%
AMZN-3.50%
JNJ-3.14%
JPM-3.02%

Worst Drawdowns and Who Made Them

#PeakValleyRecoveredDepthDaysLargest DragSecondThird
#113 Feb 20258 Apr 202531 Jul 2025-25.70%54META -6.6 ptWMT -5.2 ptXOM -4.2 pt
#210 Jul 20247 Aug 20244 Dec 2024-17.18%28NVDA -9.2 ptGOOGL -3.5 ptAAPL -3.2 pt
#314 May 202626 Jun 20263 Sep 2026-15.75%43NVDA -6.3 ptGOOGL -5.3 ptAMZN -4.2 pt
#411 Apr 202425 Apr 202428 May 2024-10.86%14META -5.3 ptNVDA -2.8 ptAMZN -2.7 pt
#512 Aug 20252 Sep 202515 Sep 2025-6.21%21META -2.4 ptNVDA -2.3 ptMSFT -1.5 pt

Market Regimes

How to read this section

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.

Against S&P 500 Equivalent

MeasureValue
Up capture145%
Down capture146%
Capture ratio (up / down)1.00
Beta on up days0.77
Beta on down days0.88
Months S&P 500 Equivalent rose24 of 35
Partial months left outOct 2023 (15 sessions), Oct 2026 (7 sessions)

Average Month, by Regime

RegimeMonthsStrategyS&P 500 EquivalentBeat S&P 500 Equivalent
Rising, calm155.27%4.30%73%
Rising, volatile95.47%2.47%67%
Falling, calm3-1.52%-0.59%0%
Falling, volatile8-3.72%-2.77%38%

Portfolio Risk

How to read this section

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.

Risk Measures

MeasureStrategyS&P 500 Equivalent
Annual mean return (arithmetic)31.69%20.69%
Annualized volatility21.54%14.70%
Annualized semi-deviation14.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 index0.070.03

Risk Contribution

SymbolAvg. WeightVolatility ShareCVaR Share
NVDA15.2%30.9%31.1%
META9.8%15.3%14.4%
GOOGL12.2%14.8%15.8%
AMZN9.2%13.1%14.0%
MSFT9.3%8.9%9.2%
AAPL7.7%7.0%7.3%
WMT11.2%5.0%4.7%
JPM7.3%4.8%4.5%
XOM4.1%0.4%0.8%
JNJ13.9%0.0%-1.9%

Same Names, Other Allocations

AllocationAnnual ReturnSharpeMax Drawdown
Strategy23.16%1.16-25.70%
Equal Weighted25.94%1.45-20.48%
Inverse Volatility25.46%1.60-18.78%
Hierarchical Risk Parity25.15%1.79-16.69%
Max Sharpe (Mean-Variance)27.63%1.54-23.88%

CAPM and the Efficient Frontier

How to read this section

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.

CAPM Measures

MeasureStrategyS&P 500 Equivalent
Risk-free rate (the one-month T-bill), a year4.60%

Annual return (mean)31.69%20.69%
Annual volatility21.54%14.70%
Beta0.901.00
Correlation0.621.00
Variance the market explains (R²)38%100%
Systematic volatility13.25%14.70%
Specific volatility16.98%0.00%
Return CAPM asks for its beta19.10%20.69%
Jensen's alpha, a year+12.59%0.00%
Treynor ratio30.05%16.09%
Sharpe ratio (mean, over the rate)1.261.09
M² (at the benchmark's volatility)23.08%20.69%
Tracking error17.04%-
Information ratio0.65-

Fixed Mixes of the Same Names

PortfolioReturnVolatilitySharpe
Strategy31.69%21.54%1.26
S&P 500 Equivalent20.69%14.70%1.09
Equal weight, held fixed30.07%15.97%1.59
Strategy's average weights, held fixed32.40%17.05%1.63
Minimum variance (hindsight)23.71%11.13%1.72
Max Sharpe (hindsight)31.12%13.05%2.03

The Max Sharpe Mix, in Hindsight

NameWeight
JNJ32.4%
WMT17.6%
NVDA17.1%
JPM11.5%
XOM11.4%
GOOGL9.6%
META0.5%

Risk Over Time

How to read this section

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.

Forecast against Outcome

MeasureValue
Days compared679
Average predicted volatility21.5%
Average realized volatility20.8%
Bias (realized / predicted)1.02
Correlation0.34
Days the next month ran 1.5x hotter8%

Concentration

MeasureValue
Average names held3.0
Average effective names3.0
Lowest effective names2.0 (14 May 2025)
Average top-3 share100%
Largest single weight53% (14 May 2025)

Summary ↑

IIIHow It Holds and TradesAll hold up

Positions

Top 10 Positions of All Time

SymbolMax Allocation
MSFT52.91%
JNJ50.01%
NVDA40.20%
AAPL38.05%
GOOGL37.62%
META36.90%
XOM36.42%
WMT35.97%
AMZN35.84%
JPM34.74%

Transactions

How to read this section

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.

Trading Activity

MetricValue
Fills147
Symbols traded10
Trading days36 of 752 (4.8%)
Median sessions between trading days21
Avg. fills per trading day4.1
Most fills in a day6
Avg. symbols per trading day4.1
Buys71 fills, $25,742,867
Sells76 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 fill1,784
Turnover, a year (traded / portfolio)9.7×
One-way turnover, a year4.7×
Turnover on an average trading day80%
Largest daily turnover200%

Closed Trades

How to read this section

What Counts as a Trade

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:

  • buy 100, later sell 100: one trade;
  • buy 100; sell 30 at the next rebalance and the other 70 a month later: two trades, of 30 and of 70 shares, each held from the purchase to its own sale;
  • buy 100, buy 50 more, sell all 150: one trade, at the average of the two purchases.

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.

How Many Trades

All
Trades76
Percent profitable76%
Winning trades58
Losing trades18
Even trades0

Profit and Loss per Trade

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 factor3.67
Avg. trade PnL$17,522.99
Avg. winning trade$31,555.13
Avg. losing trade-$27,691.69
Ratio Avg. Win:Avg. Loss1.14
Largest winning trade$213,285.45
Largest losing trade-$98,152.96

How Long Trades Were Held

All
Avg duration66 days
Median duration59 days
Longest duration214 days
Shortest duration28 days

Return per Trade

All
Average, all trades11.31%
Average, winners16.78%
Average, losers-6.30%
Median, all trades9.05%
Median, winners11.34%
Median, losers-5.87%
Largest winning trade82.26%
Largest losing trade-16.03%

Return per Trade, by Symbol

AAPLAMZNGOOGLJNJJPMMETAMSFTNVDAWMTXOM
Average, all trades9.96%2.84%21.30%3.89%7.24%3.74%11.11%26.44%11.55%-2.37%
Average, winners9.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 trades11.15%4.62%15.76%2.92%9.63%2.99%8.49%25.24%14.47%-1.21%
Median, winners11.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 trade16.22%11.20%48.96%20.93%17.46%27.07%17.83%82.26%32.61%4.15%
Largest losing trade2.97%-10.04%-6.44%-8.48%-5.63%-16.03%5.05%-13.12%-10.88%-11.21%

Summary ↑

IVCan It Be TradedAll hold up

Next-Bar Fills

How to read this section

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.

The Same Trades, a Bar Later

MetricSignal Bar's CloseNext Bar's Open
Total return140.18%121.57%
Annual return34.13%30.55%
Annual volatility21.54%22.30%
Sharpe ratio1.471.31
Max drawdown-25.70%-28.17%

What the Wait Did

MetricValue
Fills repriced147 of 147
Move to the next open (value-weighted)+36.9 bps
buys+53.7 bps
sells+19.3 bps
Fills the wait made worse51%
Fills the wait made better48%
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

Execution

How to read this section

How the Backtest Fills Orders

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.

Realism Checks

!
Fills at the close of the signal bar
Each order fills at the close of the bar whose data produced it, so the strategy trades at a price it has only just seen. That holds only for market-on-close orders sent before the close; next-bar execution is the conservative setting.
✓
Fill prices inside the bar
4 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.
✓
Size against liquidity
The median fill took 0.004% of its bar's volume, the largest 0.15%; 0 fills took over 1%. Small enough not to move the price.
✓
Every order filled in full
All 147 orders filled completely.
i
Market orders only
Every order was a market order: the backtest assumes immediate execution at the bar's price plus fixed slippage, with no protection from a bad print.

Fill Statistics

MetricValue
Orders147
Fills147
Fills per order1.00
Traded value$50,503,470
Median wait, order to first fillsame bar
Longest waitsame bar
Median share of bar volume0.004%
95th percentile share0.076%
Largest share0.15%
Implementation shortfall (value-weighted)5.00 bps
of which delay0.00 bps
of which slippage5.00 bps
Cost vs the bar's typical price (value-weighted)+5.09 bps

Orders by Type

TypeOrdersFilledPartialUnfilled
Market14714700

Trading Costs

How to read this section

How Costs Are Modeled

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.

Cost Settings

ParameterSetting
Commission modelPer dollar
Commission rate0.0354% of value
Slippage5 bps
Volume limit10% of bar volume
Fill priceBar close
Fills onSame bar
Starting capital$1,000,000

Cost Summary

MetricValue
Commissions$17,878.23
Slippage (reconstructed)$25,251.50
Total trading costs$43,129.72
Traded value$50,503,470
Costs per traded value8.54 bps
Costs vs starting capital4.31%
Costs vs profit before costs2.98%
Extra cost that would erase the profit+278 bps of traded value
Annual return before costs35.24%
Annual return after costs34.13%
Annual drag from costs1.11 pp
Orders charged147
Fills147
Avg. commission per order$121.62
Avg. commission per share$0.0682

Costs by Symbol

SymbolCommissionSlippageTotalShare
JNJ$2,510.20$3,545.50$6,055.7014.0%
NVDA$2,241.82$3,166.51$5,408.3312.5%
META$2,030.75$2,868.10$4,898.8511.4%
JPM$2,015.93$2,847.39$4,863.3211.3%
GOOGL$1,857.08$2,623.06$4,480.1410.4%
WMT$1,613.34$2,278.78$3,892.129.0%
AMZN$1,564.31$2,209.50$3,773.818.7%
XOM$1,486.12$2,098.83$3,584.968.3%
AAPL$1,404.69$1,984.06$3,388.757.9%
MSFT$1,153.98$1,629.78$2,783.766.5%

Capacity

How to read this section

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.

How Much Capital It Could Take

MeasureValue
Capital measured at$2.4m (the end of the backtest)
Largest fill, share of its day's volume0.150%
Median fill, share of its day's volume0.0041%
Starting capital with fills up to 1% of volume$6.6m
Starting capital with fills up to 10% of volume$66.5m
✓
Every position sellable within a day
Taking at most 10% of its day's volume, over the whole backtest and the last 126 sessions.
✓
No fill over 1% of daily volume
No name's fills in a day took more of its volume, over the whole backtest and the last 126 sessions.

Summary ↑