What can a trade journal actually prove?
SummaryA journal proves two different classes of thing, and it proves them with wildly different certainty. It counts your behaviour: how many trades you took outside your written plan, how often your realised risk exceeded your intended risk, how many days you traded after a loss. Those are censuses. They have no sampling error at all, because you are not estimating them from a sample — you are the population. They are exactly right.
It also estimates your edge: expectancy, win rate, payoff ratio, profit factor, drawdown, streaks, and every sliced version of those. Each of those is a statistic computed from a finite, self-selected sample of trades, and each one carries an uncertainty that almost no journal tool prints. A point estimate with no interval is not a fact about a trader. It is a fact about one sample, presented in a font that suggests otherwise.
The asymmetry is the whole article: a journal answers questions about your behaviour with near-certainty and questions about your edge with almost none, because behaviour is observed directly and edge is inferred through noise.
What follows derives how much noise, exactly. Everything below is worked from first principles — there is no result here you have to take on trust — and everything is demonstrated on a synthetic 214-trade record whose true parameters are known, because they were chosen before the trades were generated. That is the only honest way to show a statistic failing: you have to know the answer it is failing to find.
For what expectancy and win rate mean — why counting wins is the wrong operation and weighing them is the right one — that ground is covered separately in win rate is the most misleading number in trading. This article assumes it and asks the next question: given that expectancy is the right quantity, when has your journal actually measured it?
214 synthetic trades, generated in your browser from a fixed seed (20260727) when this page loads. Nothing about it is a real trader's record. Its true per-trade expectancy is +0.1135R and its true standard deviation is 1.3569R, both computed analytically from the generator's own distribution before any trade was drawn.
Every number quoted in this article can be reproduced by loading the page and reading the bench.
How many trades before a journal statistic means anything?
The sample-size lawIt is not a round number, and it is not the same for everyone. The count you need is set by the ratio of your edge to your noise, and it grows with the square of that ratio's reciprocal. Write it out and the whole question collapses into one line of algebra.
Let m be the average result per trade and s its standard deviation across trades, both in R. The average of n trades has a standard error of s / sqrt(n): that is the only fact required, and it is the definition of the standard error of a mean. A 95% interval on the average is therefore m ± t · s / sqrt(n), where t is about 1.96 once n is past a hundred or so. For that interval to exclude zero you need the half-width to be smaller than the average itself:
Call m / s the edge-to-noise ratio — the signal you produce per unit of the noise you produce alongside it. With t at 1.96 the requirement is n > 3.84 / SNR2. That squared term is the entire problem. Halving your edge does not double the trades you need; it quadruples them.
| Edge-to-noise ratio | Example | Trades required |
|---|---|---|
| 0.300 | +0.45R avg, 1.50R sd | 43 |
| 0.200 | +0.30R avg, 1.50R sd | 97 |
| 0.150 | +0.20R avg, 1.33R sd | 171 |
| 0.100 | +0.15R avg, 1.50R sd | 385 |
| 0.075 | +0.10R avg, 1.33R sd | 683 |
| 0.050 | +0.075R avg, 1.50R sd | 1,537 |
Read the middle of that table. A trader averaging a fifth of an R per trade, with the trade-to-trade variation a stop-and-target system actually produces, needs about 171 trades before a 95% interval on their own average first excludes zero. Below that count the honest statement is not “my expectancy is 0.20R” — it is “my expectancy is somewhere in a range that includes losing money.”
The trades you need are not set by how good you are. They are set by how good you are relative to how noisy you are, squared — which is why a volatile system with a real edge can be genuinely unprovable for a year.
The synthetic record used throughout this article was built with a true expectancy of +0.1135R and a true standard deviation of 1.3569R. Its true edge-to-noise ratio is 0.0837, so the trades required is 3.84 / 0.08372 = 549. The record contains 214. It has a real, positive, permanent edge, and 214 trades is not enough to demonstrate it. That is not a defect in the record. It is the arithmetic above.
The same logic applies to a proportion, with a different variance term. For a win rate the per-trade variance is p(1 − p), at most 0.25, so the half-width of a 95% interval is at most 0.98 / sqrt(n). At 40 trades that is ±15.5 percentage points. A journal reporting “50% win rate” off 40 trades is reporting a number consistent with everything from 34.5% to 65.5% — a span that contains both a losing system and a very strong one. (That is the crude normal bound. The bench uses the better-behaved score interval instead, which for 20 wins in 40 gives 35.2% to 64.8% — narrower, and unlike the normal bound it cannot run past 0% or 100% near the edges.) To pin a win rate to ±5 points takes 385 trades; to ±3 points, 1,068.
| R | One unit of the risk intended when the trade was opened. A 2R win made three times the intended risk back, less the risk itself. |
| m | Average result per trade, in R. Expectancy. |
| s | Standard deviation of the per-trade results. The noise. |
| n | Number of trades in the sample. |
| t | The multiplier for a 95% interval. 1.96 for large n, larger for small n. |
The average of your trades is the best single guess available. It is also, at journal sample sizes, compatible with a wide band of truths. Reporting the guess without the band is not a rounding error — it converts a range into a claim.
Everything here assumes the trades are independent draws from one unchanging distribution. Neither assumption is exactly true of trading, and clause 07 measures how far off the first one is on this sample.
| Loading | — |
What is the interval on every number your journal prints?
The benchBelow is a working journal analyser. It reads a CSV, lets you name your own columns, reports what it could not parse instead of discarding it silently, and prints an interval or an explicit refusal beside every statistic it computes. It opens on the synthetic sample so there is something to read immediately; load your own file and every figure on this page redraws from it.
Nothing you load is transmitted anywhere. This page contains no network call of any kind — no upload, no server, no analytics, no remote font or image. Your file is read by the browser's FileReader interface, which hands the text straight to the script on this page. You can confirm it by disconnecting your network and reloading, or by reading the source: with this design the claim is not a policy, it is a property of the file.
The two sliders below take a window out of the record — a start point and a length. They exist to make one thing visible that no static report can: the point estimate moves far more than the truth does. Set the length to 40 and drag the start across the record. In the synthetic sample, whose true expectancy is fixed at +0.1135R for every trade in it, the 40-trade windows report averages from −0.318R to +0.534R. Same trader. Same system. Same unchanged edge. The only thing that changed is which forty trades you looked at.
It will not infer R from your average loss. That trick makes the average loss exactly −1R by construction, so a journal that does it can never show you a stop that was moved. Without a risk column or an R column, the bench computes in your currency and prints an em-dash where an R statistic would go.
It will not average an R-multiple against a dollar amount. The basis is a property of the sample, not of a row: map an R or a risk column and every row must yield an R, with rows that cannot named and counted in the parse report. A mean taken across two units is not a number in either one.
It will not print a zero for a number it could not compute. Every unavailable value is an em-dash with a statement of what it needs.
Any CSV with a header row. Comma, semicolon, tab or pipe delimited. Quoted fields with embedded separators are handled. You map the columns yourself after the file is read, so no particular naming is required.
The bench computes on whatever your result column contains. Whether that figure is already net of spread, commission and slippage is a property of your export, not of the arithmetic here — and a record that is gross will report an expectancy the account never saw. What those costs are and how they accumulate is its own subject.
Read a CSV file from your machine. The browser reads it locally; the page has no way to send it anywhere.
The synthetic sample is generated in your browser from seed 20260727. It is not, and does not represent, any real trader's record.
Date and a result column are required. Risk lets the bench express results in R. Time, instrument and side unlock the clustering test in clause 05.
| Statistic | Value | 95% interval | What the sample supports |
|---|---|---|---|
| Awaiting input | — | — | Load the sample or a file |
Why can profit factor never disagree with expectancy?
An identity, not a second opinionBecause they are the same fact in different units, and the algebra is three lines long. Profit factor is gross profit over gross loss. Over n trades with win rate p, average win W and average loss magnitude L, gross profit is n·p·W and gross loss is n·(1−p)·L. The n cancels:
The denominator (1−p)L is the average loss per trade taken — a strictly positive quantity for any record containing a loss. So profit factor is a monotone rescaling of expectancy. It cannot cross 1 while expectancy stays positive; it cannot rank two systems differently from expectancy divided by their average loss per trade. A dashboard that shows expectancy, profit factor, win rate and payoff ratio as four tiles is showing two independent quantities dressed as four, and the reader who sees three of them agree feels a confirmation that is not there.
Three agreeing statistics computed from one sample are one statistic agreeing with itself. Corroboration requires a second sample, not a second formula.
Profit factor also has failure modes expectancy does not, and they are all consequences of it being a ratio of sums:
- It is undefined when there are no losses. A 12-trade sample with no losing trade has a profit factor of infinity. The bench prints an em-dash and names what it needs, because infinity is not a measurement of skill.
- It has no natural standard error. Being a ratio of two random sums, its sampling distribution is skewed and asymmetric, so “PF 1.23 ± something” is not a well-formed statement. The interval must be obtained by resampling. The bench does exactly that: it draws 2,000 bootstrap samples of the same size, with replacement, from your own trades and reports the 2.5th and 97.5th percentiles of the resulting profit factors.
- It is dominated by its largest terms. Both sums are driven by their extremes, so one outsized winner moves profit factor more than it moves the average, and moves it in a way that looks like an improvement in the system.
On the synthetic record, profit factor is 1.227 — a number most journal software would render in a reassuring weight. Its bootstrap 95% interval is [0.917, 1.631], and 8.3% of the 2,000 resamples came out below 1.00. That interval spans a losing system and a good one, and it must, because it is the same information as the expectancy interval of [−0.056R, +0.302R] expressed in a ratio.
To learn how much a statistic would move if you ran your system again, you would need another sample. You do not have one. The bootstrap substitutes the next best thing: draw n trades at random, with replacement, from the n trades you have, recompute the statistic, and repeat. The spread of those recomputed values approximates the spread you would see across real repeat samples.
It is honest about what it cannot fix: it can only resample the distribution you actually recorded. If your record is missing your worst trades, the bootstrap is missing them too.
Every resample on this page is drawn from a seeded generator (seed 20260727). Reload the page and the intervals are identical to the digit. A figure whose numbers change on refresh is not evidence.
Can you compute a Sharpe ratio from a trade list?
Fragility, shownYou can compute the arithmetic. What you get is a per-trade reward-to-variability ratio, and three separate things stop it from being a Sharpe ratio — the third is the one that matters for a journal.
First, there is no time in a trade list. A Sharpe ratio is defined on returns over equal periods, net of a risk-free rate. Trades do not arrive on a schedule. Two traders with an identical mean and dispersion per trade, one taking five trades a year and one taking five hundred, have identical per-trade ratios and utterly different annual risk-adjusted returns. Rescaling by the square root of trades-per-year recovers the comparison only if trades are independent and identically distributed, which is the assumption most in doubt.
Second, the estimator is noisy, and its noise is derivable. Write SR = m / s. For independent, identically distributed normal draws the variance of the sample mean is s²/n and the variance of the sample standard deviation is about s²/(2n), and the two are uncorrelated. Propagating those through the ratio gives:
Notice what that expression does at small SR: the SR²/2 term vanishes and the standard error collapses to 1 / sqrt(n), independent of the ratio you measured. At 40 trades that is 0.158. Solving the full expression for the ratio that would just clear zero at n = 40 gives 0.318: any per-trade ratio below that, measured on 40 trades, has a 95% interval containing zero, whatever the point estimate says. On the synthetic record the ratio is 0.0926 with a standard error of 0.0685, giving [−0.042, +0.227].
A reward-to-variability ratio computed on a small trade sample has a standard error of roughly 1 / sqrt(n) no matter how good the system is — so at forty trades the measurement is coarser than the entire range of ratios worth distinguishing.
Third — and this is the journal-specific failure — R-multiple distributions are not normal, and the derivation above assumed they were. Look again at the distribution in clause 01. It has a hard wall at −1R where the stops sit, a gap, and a long right tail. That is a bimodal, strongly right-skewed shape. A standard error derived under normality does not know about skew, and skew is precisely what a variance-based ratio mismeasures: it penalises the long right tail — the large winners — as though it were risk, and it under-weights the left wall, which is where the actual risk lives. The bench reports the ratio because it is asked for; it reports it as a per-trade ratio, with its interval, and it is the least trustworthy row in the table.
A stop-based system's losses cluster at exactly −1R. That single spike carries most of the distribution's mass and almost none of its variance, while a handful of 3R winners carry a large share of the variance. A ratio of mean to standard deviation therefore reads a good tail as a bad tail.
The standard error above is derived here from first principles. The same result, with the annualisation caveats, is set out for finance readers in Lo (2002), The Statistics of Sharpe Ratios. Nothing in this clause depends on that paper; it is where a reader would go next.
What happens when you slice a journal fourteen ways?
The multiple-comparisons trapOne slice looks significant, and it means nothing. This is the most common way a journal produces a confident, false conclusion, and the arithmetic behind it needs no statistics beyond multiplication.
A test at the 5% threshold is, by construction, wrong 5% of the time when there is nothing there. Run it on m independent slices and the probability that at least one comes back positive is 1 − 0.95m. The bench slices this record by weekday, instrument, session and direction, which is 14 slices — and at m = 14 that probability is 0.512. Worse than a coin flip, before you have looked at anything.
Two things compound it, and both are specific to how a person reads their own journal. The first is that you do not choose the slice in advance — you look at the table and the extreme cell chooses you. A statistic you selected because it was extreme is biased away from the truth by the act of selecting it; that is the winner's curse, and no per-slice interval corrects for it, because each interval was computed as though its slice had been named before the data was seen. The second is that slices are not independent — long and short partition the same trades, and instrument overlaps session — so the exact 0.512 above is an approximation. Which is why the honest correction is not arithmetic at all, but a shuffle.
The shuffle test. If no slice is genuinely different, then which slice label a trade carries is irrelevant to its outcome — the labels are exchangeable. So: keep the outcomes, randomly reassign the labels, and recompute every slice. Record how extreme the most extreme slice became. Repeat two thousand times. That distribution is exactly what “the best of fourteen slices, by chance alone” looks like, and comparing your real best slice against it is a correct family-wise test that needs no assumption about how the slices overlap.
The synthetic sample is the ideal subject for this, because it was generated with no slice effect whatsoever: weekday, instrument, session and direction were drawn independently of the outcome. Every apparent pattern in it is, provably, chance. And there are apparent patterns, and they are the exact patterns a trader acts on.
The record's strongest is directional. Its 91 short trades average +0.285R; its 123 long trades average +0.003R. Read as a finding, that says this trader has a short-side edge and no long-side edge — which is a conclusion about a generator that draws direction from a coin flip unconnected to the result. The second strongest is by market: one instrument at +0.315R over 55 trades against another at −0.063R over 53, a spread of 0.378R across 108 trades. That is precisely the observation that gets a market abandoned.
The largest slice statistic in this journal is 1.52. Shuffle the labels at random and the largest slice statistic comes out bigger than that 80.2% of the time. The most convincing pattern in the record is less convincing than the pattern noise usually produces.
The classical fix divides the threshold by the number of tests: with 14 slices, judge each at 0.05 / 14 = 0.0036. It is correct and it is conservative, because it assumes the tests are independent when overlapping slices are positively related. The shuffle test uses the real dependence structure of your own data, so it is neither conservative nor liberal — it is calibrated.
Searching parameters and comparing rule variants while building a strategy is also a multiple-testing problem, and it is not this one. There the tests run before any money moves, on a strategy still being chosen, and the remedy is data held back from the search. This clause is about the tests you run afterwards on a record you already own, where nothing was held back and nothing can be. For the development-time version see why your backtest lied.
The relevant m is every slice you looked at, not every slice you reported. A trader who scans a calendar heatmap for three minutes has run hundreds of informal comparisons. The bench can only count the fourteen it computes.
One caution against reading this clause too broadly. It says the day-to-day pattern in your results carries no inferential weight — not that the distribution of profit across days does not matter. Some rule sets make that distribution contractually binding, capping how much of a total any single day may represent, and such a rule does not care that the day-level variation it measures is noise: it binds on the realised numbers either way. A quantity can be statistically meaningless and still decide whether you are paid — see how a consistency rule constrains the shape of a profit curve.
It survives the shuffle, it survives being specified in advance, and it persists in trades taken after it was discovered. The third condition is the only decisive one, and no analysis of an existing journal can supply it.
| Loading | — |
| Loading | — |
| Loading | — |
Is your worst drawdown, or your worst streak, evidence of anything?
Extremes are the least stable numbersAlmost never, and for a reason that generalises: maximum drawdown and longest streak are extreme order statistics. They are not averages of your record; they are the single most severe thing in it. Averages become more stable as the sample grows. Extremes do the opposite — the longer the record, the deeper the worst drawdown it is expected to contain, whether or not anything changed.
There is a clean test for the drawdown, and it uses nothing but your own trades. Take the exact same set of results and put them in a random order. The total is unchanged; the drawdown is not. Do it two thousand times and you have the distribution of drawdowns your own trades produce purely by arrangement.
On the synthetic record the realised maximum drawdown is 20.08R. The median across 2,000 reorderings of the identical trades is 13.03R, the 5th percentile is 8.87R and the 95th is 20.71R. The realised drawdown sits at the 94th percentile of what these very trades produce by arrangement alone. That is a real reading: the losses in this record arrived closer together than a random arrangement would put them. It is also, at the 94th percentile, exactly the kind of reading you would expect to encounter about one record in sixteen by chance.
The streaks give a second view of the same event, and the run distribution can be computed exactly rather than simulated. Under a null of independent trades with loss probability q, the probability of no run of k consecutive losses in n trades satisfies a simple recursion over the position of the first win, which the bench evaluates directly. With this record's 52.3% loss rate over 214 trades, the expected longest losing run is 7.5, and the observed longest run is 12, whose probability under that null is 0.040.
The drawdown percentile and the streak probability are not two pieces of evidence. They are one clustering event, measured twice — and treating them as independent confirmation is the multiple-comparisons error of clause 05 committed inside a single record.
The other thing extremes do is concentrate. The figure below decomposes this record's final +26.31R into its parts. The five largest winning trades contribute +15.13R — 57.5% of the entire result, from 2.3% of the trades. Remove them and the record is a loser. That is not a flaw in the system; long-tailed R distributions do this, and a system that produced its result evenly would be the surprising one. But it does mean that the record's headline number is an estimate resting on five observations, and the interval on a five-observation quantity is enormous.
Which is why the curve itself needs a null to be read against. A system with no edge and this record's trade-to-trade dispersion of 1.328R ends 214 trades with a standard deviation of 1.328 · sqrt(214) = 19.43R, so it lands anywhere in ±38.1R about nineteen times in twenty. This record ended at +26.31R, which is 1.35 standard deviations from nothing. The curve slopes up. It slopes up well inside the band a zero-edge system occupies.
It holds every trade, every size and every result fixed and varies only the sequence. So it answers precisely: “of the drawdown I suffered, how much is attributable to the order in which these results arrived?” It cannot tell you whether the clustering has a cause — only whether it needs one.
Let A(i) be the probability of no run of k losses in i trades. For i at least k, condition on the position of the first win within the leading block: A(i) = sum over j from 0 to k−1 of qj(1−q)·A(i−j−1), with A(i) = 1 for i below k. The bench evaluates this exactly for every k, so the streak probability it prints is not simulated.
How deep a drawdown a fixed floor tolerates, and what that does to survival odds, is a different question with a different answer — see risk of ruin: the math that decides who keeps their edge.
What is missing from a journal you keep yourself?
Selection, survivorship, dependenceEvery interval in this article assumes the record is a fair sample of your trading. A self-kept journal is not, and there are four distinct mechanisms by which it is not. None of them are corrected by more trades; three of them get worse with more trades, because the bias is constant while the interval shrinks around it.
1 · Missing rows are not missing at random. The condition for a trade to appear in your statistics is “it was logged.” That condition is correlated with the outcome: the trade least likely to be written down is the impulsive one taken outside the plan, and that trade is also, on average, the worse one. Your estimator is not of your edge; it is of your edge conditional on having felt like recording it. Nothing in the arithmetic can detect this, because the evidence is the rows that are not there.
2 · The record starts where it starts. Most journals begin after something — a bad month, a decision to get serious, a change of market. That start point is chosen with knowledge of what preceded it, which makes the first observation a conditioned one. A record that begins the day after the worst week of your year is a sample drawn from a deliberately non-random slice of your history.
3 · A moved stop breaks the denominator. An R-multiple is the result divided by intended initial risk. If the stop was widened after entry, the realised loss exceeds 1R and the record is honest about it — provided the risk column still holds the original figure. If the risk column is written after the fact, or reconstructed from the exit, then every widened stop is silently re-labelled as a 1R loss and the left tail of your distribution is truncated in the record but not in your account. The synthetic record deliberately contains this: 14 of its 112 losses exceed 1R, the worst at −1.88R, costing 3.97R more than the stops promised. That is 15% of the record's entire net result, invisible to any statistic that assumes losses are 1R.
Any tool that computes R by dividing your result by your average loss will report an average loss of exactly −1.00R for every trader who has ever used it. It is not measuring your risk discipline. It has assumed it.
4 · Consecutive trades are not independent draws. The intervals in clause 01 all use s / sqrt(n), which is correct only when trades are independent. If results are positively autocorrelated — one regime, one instrument, a run of similar setups, or your own behaviour after a loss — then the effective sample is smaller than the count. For a stationary series with lag-1 autocorrelation rho, the variance of the mean inflates by about (1 + rho) / (1 − rho), giving an effective sample size of about n · (1 − rho) / (1 + rho). The bench measures rho on your record and prints both. On the synthetic sample rho is +0.013 and the effective sample is 209 of 214 — negligible, as it should be, since the generator draws independently. On a real record it very often is not, and a rho of 0.20 turns 200 trades into an effective 133.
The honest summary of this clause is that the intervals everywhere else in this article are optimistic. They are the uncertainty that remains after assuming the record is complete, unconditioned, correctly denominated and independent. Each of those assumptions failing widens the true interval further.
Dependence. Autocorrelation is computable from the record you have. Missing rows, conditioned start points and reconstructed risk are not — they leave no trace in the data, only in how the data came to exist.
Risk written at entry, not at exit. Every trade logged, including the ones you would rather not have taken. A start date chosen for a reason unrelated to results. Those three properties do more for the reliability of a journal's statistics than any amount of additional analysis of a record that lacks them.
What the intended risk in the denominator should have been in the first place is its own question — see how to size a position, and what each method assumes.
So what is a journal actually for?
Census, not estimateFor the questions it answers with certainty rather than the ones it answers with a wide interval. That division is not a matter of taste; it follows directly from everything above. A journal has no sampling error on anything it counts, and enormous sampling error on anything it infers. So the questions worth putting to it are the counting ones.
Those questions are not the ones journal software puts on its front page, and they are more useful:
- How many trades did I take that were not in my written plan? A count. Zero sampling error. If the answer is 11 of 214, that is a fact about you, not an estimate of one.
- On how many trades did realised risk exceed intended risk? A count, and the single most decisive number a journal holds, because it converts a discipline question into an arithmetic one. The synthetic record's answer is 14 of 112 losses.
- What did those trades cost, in R? A sum, not an average — so it inherits no interval either. Here, 3.97R.
- Did I record every trade? Answerable against a broker statement, and the only check that addresses the bias clause 07 says is otherwise undetectable.
Every one of those has an exact answer at any sample size, including forty trades. Meanwhile the questions the front page shows — expectancy, profit factor, best day, best instrument — need hundreds of trades before their answers stop moving, and clause 05 shows that three of them will produce a confident wrong answer long before then.
A journal is a compliance instrument that also happens to hold, at low resolution, an estimate of an edge. Most journal software presents it as an edge instrument that also records compliance, and the resolution is the reason that reading fails.
None of this makes the estimate worthless. It makes the estimate an input with an interval attached, which is a usable thing — provided it is carried forward as an interval rather than collapsed to its midpoint. A decision that depends on whether your expectancy is 0.05R or 0.30R is a decision your journal cannot yet make, and the correct response to that is to model both ends of the interval and see whether the decision changes. When it does not, the uncertainty did not matter. When it does, you have learned the most important thing your journal had to say.
Propagating an interval like that is what a simulation is for, and it is the natural next step from a journal: what a trading simulation shows you before you risk money takes exactly this input — an expectancy, a dispersion, and an honest interval around both — and reports the range of outcomes each end of it produces. You can run the ends of your own bench readings through the simulator directly.
Ask whether it is a count of something that happened or an estimate of something underlying. If it is a count, believe it. If it is an estimate, ask for the interval — and if the tool cannot produce one, the number it printed is not yet a finding.
3.84 divided by the square of your edge-to-noise ratio. It tells you, on the day you start, roughly how long you will be operating without proof. Knowing that number in advance is the difference between an uncomfortable stretch and a crisis of confidence.
Questions traders ask
Answered from the derivations aboveHow many trades does a journal need before its statistics mean anything?
About 3.84 divided by the square of your edge-to-noise ratio (average result divided by standard deviation of results). At 0.15 that is 171 trades; at 0.075 it is 683. There is no universal number, because the requirement scales with the square of your own dispersion.
Why is my positive expectancy “not significant”?
Because the interval around it still contains zero. The synthetic record here averages +0.123R with a 95% interval of [−0.056R, +0.302R], and its true value — known by construction — is +0.114R. The estimate is close to correct and still cannot exclude a system that makes nothing.
Is profit factor a better measure than expectancy?
It is not a different measure. PF = 1 + E / ((1−p)L), so profit factor exceeds 1 exactly when expectancy exceeds zero. It also breaks in ways expectancy does not: it is undefined without a loss, it is dominated by the largest trades, and it has no natural standard error, so its interval must be bootstrapped.
Can I compute a Sharpe ratio from my trades?
You can compute mean over standard deviation. That is a per-trade reward-to-variability ratio with a standard error of about sqrt((1 + SR²/2) / n), which is roughly 1 / sqrt(n) for small ratios — 0.158 at 40 trades. It carries no time, so it cannot be compared to a period-based Sharpe ratio without assuming trades are independent and identically distributed.
My journal says one weekday is worse than the others. Is it?
Probably not. Testing 14 slices at the 5% threshold gives a 51% chance of at least one false positive. The calibrated check is a label shuffle: reassign the slice labels at random a few thousand times and see how extreme the best slice gets by chance. In this record's case, chance beats the observed best slice 80.2% of the time.
Does my data leave my device?
No. This page makes no network call of any kind. The file is read by the browser's FileReader interface and processed by the script on this page. The typefaces and stylesheet are embedded in the file, so the page also works with no connection at all — which is the simplest way to verify the claim.
What breaks an R-multiple?
A denominator that is not the risk actually intended at entry. Widened stops make the realised loss exceed 1R, which is correct and informative. Reconstructing risk after the fact, or defining R as the result over the average loss, destroys the information entirely — the second makes the average loss exactly −1.00R for every record it is applied to.
| SNR | Edge-to-noise ratio: average result divided by the standard deviation of results. |
| PF | Profit factor: gross profit divided by gross loss. |
| rho | Lag-1 autocorrelation: how much a trade's result predicts the next one's. |
| m | The number of slices tested; the multiplier on your false-positive risk. |
Provenance and method
What is derived, what is generatedEverything numeric in this article is either derived in the text or computed in your browser from the synthetic sample. No external dataset is used, no market data is referenced, and no claim is made about any firm, product or population of traders.
| Quantity | Where it comes from |
|---|---|
| Standard error of a mean; trades required | Derived, clause 01 |
| Score (Wilson) interval for a win rate | Derived by inverting the score test: solve |observed proportion − p| = z·sqrt(p(1−p)/n) for p |
| Profit factor / expectancy identity | Derived, clause 03 |
| Standard error of a reward-to-variability ratio | Derived by error propagation, clause 04 |
| Family-wise false-positive probability | Derived, clause 05: 1 − (1−a)m |
| Family-wise shuffle test | Computed: 2,000 label permutations, seed 20260727 |
| Profit factor and payoff interval | Computed: 2,000 bootstrap resamples, seed 20260727 |
| Drawdown percentile | Computed: 2,000 order permutations, seed 20260727 |
| Longest-run probability | Computed exactly by the recursion in clause 06 — not simulated |
| Effective sample size | AR(1) approximation, clause 07 — an approximation, and labelled as one |
| The 214-trade sample | Generated in your browser, seed 20260727. Synthetic. Not a real record. |
The synthetic generator draws a win with probability 0.46; wins are 0.5 + 2.6·u1.7 in R and losses are −1R, except that 12% of losses overshoot to −(1 + 0.9·u²) to represent a stop that did not hold, with u uniform on [0,1). Integrating those densities gives a true expectancy of +0.113523R and a true standard deviation of 1.356900R exactly — which is how this article can say what the sample's statistics are failing to find. Weekday, session, instrument and side are drawn independently of the outcome, so the record contains no slice effect at all by construction.
The pseudo-random generator is mulberry32, a small public-domain 32-bit generator. It is adequate for illustration and reproducibility and is not a research-grade or cryptographic source; nothing in this article depends on its higher-order properties.
Where each method is published
Every result above is derived on this page, so nothing here rests on these. They are where a reader who wants the published method should go next, and each one was opened and read before being listed. What each supports is stated exactly; where only an abstract was reachable, that is said rather than implied.
- Brown, L. D., Cai, T. T. and DasGupta, A. (2001). Interval Estimation for a Binomial Proportion. Statistical Science 16(2), 101–133. doi.org/10.1214/ss/1009213286 — the abstract records the “chaotic coverage properties” of the standard normal interval on a proportion and recommends the score interval at small n, which is why the bench uses it for the win rate. Abstract read; full text paywalled.
- Efron, B. (1979). Bootstrap Methods: Another Look at the Jackknife. Annals of Statistics 7(1), 1–26. doi.org/10.1214/aos/1176344552 — the origin of the bootstrap, described there as a general method for estimating the sampling distribution of a statistic from the observed data. The specific percentile procedure used here is the one set out in clause 03. Abstract read; full text paywalled.
- Lo, A. W. (2002). The Statistics of Sharpe Ratios. Financial Analysts Journal 58(4), 36–52. doi.org/10.2469/faj.v58.n4.2453 — derives the statistical distribution of the Sharpe ratio under independent, identically distributed returns, and shows that a monthly ratio cannot be annualised by multiplying by the square root of twelve except in special cases. That is the published form of both points in clause 04. Abstract read; full text paywalled.
- Nichols, T. E. and Holmes, A. P. (2002). Nonparametric Permutation Tests for Functional Neuroimaging: A Primer with Examples. Human Brain Mapping 15(1), 1–25. doi.org/10.1002/hbm.1058 — the shuffle test in clause 05, stated in general form: if the labels are exchangeable under the omnibus null, they are exchangeable with respect to any summary of the individual statistics, including their maximum — which is what makes comparing your best slice against the permutation distribution of the best slice a valid family-wise test. Full text read.
Two things are deliberately not cited. Wilson’s 1927 paper, which gives the score interval its name, is reachable only as a page scan with no text layer; it is not cited because it was not read, and the interval is derived above in one line anyway. The family-wise arithmetic 1 − (1 − a)m is derived in clause 05 rather than cited, because the derivation is two lines and checkable on sight.
Illustrative arithmetic throughout. Nothing on this page is a projection of any account; this is not financial advice.
Open this page, leave the window sliders at their full extent, and read the bench. Every figure quoted in the prose appears there. The seed is fixed, so the bootstrap and permutation results are identical on every load and every machine.
No pass or failure statistics, no firm rules, no population of traders, no outcome. This article makes claims about arithmetic and about one synthetic record, and about nothing else.