Trading algorithm evaluation — S&P500

Source: TradeLog_2026-09-22.csv  ·  generated 2026-09-22 18:01  ·  exits 2025-04-04 … 2026-09-21
3,874 closed trades251 in the forward test3,623 in the training period ML model trained on data through 2026-08-13

How to read this report. The ML model learned from price history up to 2026-08-13. Trades closed after that date are the forward test: the model had not seen those prices, so this is how it performs on new data, and it is the only part of the report that measures the ML strategy fairly. Trades closed before it are the training period: the model had already seen those prices, so its results there look better than they really are and are shown only for contrast. The conventional strategies (MACD, Heikin-Ashi, Wedge, Ehlers RFS, AEMA, Zero-Lag, Pivot) do not learn from data, so the date matters less for them, but they are shown over the same two periods so every strategy is compared on the same dates. Return basis: net profit ÷ the dollar amount of stock bought at entry.

Order types in this evaluation: every BUY signal is filled market-on-open on the bar after the signal, at that bar’s open. No buy-stop, limit or stop-loss orders: the curves measure the raw strength of the signals, not order handling. Every exit follows the strategy’s own exit rule, also at the next open. Live ML BUY signals are not capped per day (Settings: ML buys/day = 0), so the back-test ML trades are not capped either.

ML strategy — forward test since 2026-08-13

Trades taken by the ML strategy on prices the model had not seen. The conventional strategies are in the tables below. Position sizing: Every trade was sized independently at about $6,994 of stock ($6,754–$7,184; whole shares of a fixed dollar stake), and profits were NOT reinvested: the curve is the plain running sum of each trade's net profit, starting from $0, not a compounding account balance.

Trade size
$6,994
per trade, $6,754–$7,184; not reinvested
Net profit
$29,160
77 trades, 64 symbols
Win rate
62.3%
avg win $750 · avg loss $236
Profit factor
5.25
gross wins ÷ gross losses
Expectancy / trade
$379
5.40% of the amount invested per trade
Max drawdown
$2,755
return ÷ MaxDD 10.58
Avg hold
18.8 d
max losing streak 6

All trades · forward test · training period

GroupTradesSymbolsNet profitExpectancy $Expectancy %Win rateAvg winAvg lossProfit factorMax DDRet / MaxDDUlcerSharpeTop-5 shareSym HHIAvg daysMax losing streak
All trades3,874363$1,482,531$3835.47%63.7%$732$2295.61$29,10650.9441.50.12314.4%0.01918.930
Forward test251190$74,777$2984.26%57.0%$666$1904.65$2,81126.601.20.37120.3%0.02119.17
Training period3,623363$1,407,754$3895.55%64.1%$736$2325.68$29,10648.3742.90.12115.2%0.02018.930

Cumulative net profit, ML strategy forward test since 2026-08-13

Every ML trade closed after the model’s training cutoff, in close-date order, starting from $0; the number in parentheses in the legend is the trade count. The conventional strategies are listed in the linked strategy data table but not drawn here: each symbol runs whichever conventional strategy did best on that symbol’s own past, so their lines would be best-of selections on different stocks, not a like-for-like comparison with the model. Position sizing: Every trade was sized independently at about $6,994 of stock ($6,754–$7,184; whole shares of a fixed dollar stake), and profits were NOT reinvested: the curve is the plain running sum of each trade's net profit, starting from $0, not a compounding account balance.

Why the ML line moves in steps: the model scores every symbol on its own, so one market-wide setup can open many positions on the same day, and those positions then rise, fall and exit together — a same-day batch behaves like one large bet, not many independent ones. 18 of the 77 forward-test trades were entered on 2026-09-01 and closed 2026-09-15 to 2026-09-21 (5 winners, net −$1,179): that batch is the flat or falling stretch between trades 49 and 77 on the chart. The live per-day cap on ML buy signals exists to limit this; it is not applied to the back-test trades shown here.

ML (77 trades)
$0 $10,000 $20,000 $30,000 Cumulative net profit ($) 1 10 20 30 40 50 60 70 77 Trades completed, in close-date order (all of each strategy's forward-test trades, counted separately) ML $29,160

Monte Carlo — ML strategy, forward test since 2026-08-13: 77 trades resampled 2,000 times

Each path re-draws the same number of trades from the realized forward-test trade profits with replacement (bootstrap) and accumulates them in the drawn order, so it shows the range of outcomes the same edge could have produced in a different sequence. The realized path is drawn on top — it is the ML line from the chart above. Bands are the 5–95% and 25–75% envelopes of the paths at each trade count; the center line is the median. Position sizing: Every trade was sized independently at about $6,994 of stock ($6,754–$7,184; whole shares of a fixed dollar stake), and profits were NOT reinvested: the curve is the plain running sum of each trade's net profit, starting from $0, not a compounding account balance. The resampled paths use the same per-trade dollar profits, so they inherit that sizing: starting from $0 with no compounding, a path's value after k trades is simply the sum of k drawn trade profits.

5–95% of paths25–75%median pathrealized
$0 $10,000 $20,000 $30,000 realized $29,160 Cumulative net profit ($) 1 10 20 30 40 50 60 70 77 Trades completed (resampled sequence)
Final profit, median
$28,863
5th–95th pct $19,076 … $39,120
Paths ending in loss
0.0%
share of resampled sequences with net profit < 0
Max drawdown, median
$1,156
95th pct $2,066 · worst $4,053
Realized vs paths
52% pct
where the actual sequence sits among the paths (50% = typical)
Realized max drawdown
$2,755
exceeded by 0.9% of paths

Read it as: with this trade count and this per-trade distribution, a drawdown around the 95th-percentile figure is ordinary bad luck, not evidence the edge is gone. If the realized path sits above the 90th percentile the live sequence has been luckier than the edge supports; below the 10th, unluckier. Resampling assumes trades are independent and the distribution is stationary, which overstates confidence when trades cluster in one regime or one sector — see the same-day batches noted under the chart above: each batch behaves like one large bet, so the true spread is wider than these bands.

Reading the numbers

Legend count (n trades)
Number of that strategy's forward-test trades plotted on the cumulative-profit chart (trades closed after the model's training cutoff). A line with fewer trades ends earlier along the x-axis.
Expectancy
Average net profit per trade, in dollars and as a percentage of the amount invested in the trade (shares × entry price). The single best summary of edge.
Profit factor
Gross profit of winners ÷ gross loss of losers. Below 1.0 loses money; 1.3–2.0 is typical of a workable swing system.
Max drawdown
Largest peak-to-trough fall of cumulative net profit, in dollars, ordering trades by close date. Return ÷ MaxDD is the pain-adjusted return.
Ulcer index
Root-mean-square of drawdown depth as a % of account equity (the average amount invested per trade, taken from the log, plus the running peak profit). Lower = smoother equity; penalizes long, deep drawdowns more than brief ones.
Sharpe (trade)
Mean ÷ standard deviation of per-trade returns. Not annualized; compare across rows, not against published Sharpe ratios.
Top-5 share
Share of gross profit coming from the 5 best trades. Near 1.0 = lottery-ticket results that will not repeat.
Symbol HHI
Concentration of profit across symbols (sum of squared shares). 1.0 = one ticker made all the money.
Max losing streak
Longest run of consecutive losing trades — sizes the drawdown you must be able to sit through.
Forward test / training period
Trades closed after / before the last date the ML model was trained on. Forward-test trades are on prices the model never saw and are the fair measure; training-period trades flatter the ML strategy. Every strategy is split on the same date so they are compared on the same dates.
Back-test signal cap
The live ML rule keeps only the N highest-probability BUY signals per day (and M per sector). The back-test simulates one symbol at a time and cannot apply that, so the evaluation applies it afterwards across all symbols, using each trade's signal-bar probability (Entry Prob in the log). ML (UNCAPPED) shows the result without it.
Monte Carlo
Bootstrap of the realized trade returns: thousands of alternative orderings/draws of the same trades, giving the spread of final profit and drawdown the edge could plausibly produce. Bands = percentiles across paths at each trade count.