Paper portfolio
S&P 500
Trades
Realised so far
Since 8 May 2026, closing prices of 20 Oct 2026. Before fees and taxes.
The question
Is there an edge at all, and how would I recognise one?
A good result over a few months proves little. Let enough people roll dice and someone will throw five sixes. So the question was not “How much do I make?” but: Does what looked good in hindsight hold up in real time, at prices you could actually have got? And: how much of it is skill, how much luck?
What the model does
It looks for laggards in rising sectors
The idea is old and simple. When a whole sector rises but one company in it doesn’t keep up, that is often just a delay: money flows into the well-known names first and into the laggards later. The counter-risk is just as clear: some laggards lag because something is wrong with the company.
The model watches 953 large and mid-sized US stocks: everything in the S&P 500 and the S&P MidCap 400 (903), plus 50 added stocks that are in neither index. Each belongs to exactly one of 11 sectors. Every sector has two fixed benchmarks: a sector fund that tracks the whole sector, and one large sector leader.
| Sector | Stocks | Sector fund | Sector leader |
|---|---|---|---|
| Industrials | 167 | XLI | GE |
| Technology | 142 | XLK | NVDA |
| Financials | 141 | XLF | JPM |
| Consumer discretionary | 122 | XLY | AMZN |
| Health care | 92 | XLV | LLY |
| Real estate | 60 | XLRE | PLD |
| Consumer staples | 54 | XLP | WMT |
| Materials | 52 | XLB | LIN |
| Utilities | 46 | XLU | NEE |
| Communication & media | 39 | XLC | META |
| Energy | 38 | XLE | XOM |
| Total | 953 |
The screen runs three times every US trading day: at 8 am Berlin time on the previous evening’s closing prices, a quarter of an hour after the US open, and after the US close. Each stock is compared with three things: the average of the other stocks in its sector, the sector fund and the sector leader. Before that, the model checks that its prices are actually current. The screen runs in stages:
- Laggard test: over 20 days the stock trails its peers, its sector fund and its sector leader, while all three are rising. Plus: oversold, well below its 52-week high, normal trading volume.
- Grade A, B or C: how clean the pattern is. Only A can get a buy signal.
- Conviction: adjustments for the environment, such as market phase, volatility, insider buying, similar cases from the past. This is also where the AI sits: every morning a language model reads news and economic calendar items and gives one daily score for the whole market, which nudges the conviction of all candidates up or down.
- Blocks: for example quarterly earnings in the next few days.
It holds at most three stocks at a time, each with about a third of the portfolio. Selling follows rules: stop at −8%, from +5% the stop moves to the entry price, from +10% it trails, target reached, out after 10 days without movement, at the latest after 60 days. Nobody intervenes by hand.
The backtest that looked too good
First +17.7% a year. In the end −8.4%.
Before the paper portfolio started, I ran the rules backwards over past years. Result: +17.7% a year. After fixing a calculation bug (every day was processed twice) it even looked like +29.5% a year. Those are exactly the kind of numbers in the posts that make me sceptical.
Then the decisive test. I had run the backtest on the stocks that are in the index today. Anything that went bankrupt, was acquired or dropped out in recent years was missing. So I rebuilt the universe as it really looked in March 2022, including every company that later didn’t make it.
| Today’s stocks (survivors only) | +25.1% a year |
| Stocks as they really were in the index in 2022 | −8.4% a year |
The reason is uncomfortable. The model cannot tell a laggard about to catch up from a company on its way down. 60% of its buys were in companies that later left the index, averaging −1.41% per trade. For the survivors it was +1.13%. The pretty backtest only counted the survivors.
Since then my rule is: a backtest proves nothing. Only what happens afterwards, in real time, is credible.
So why carry on at all?
Honestly: I don’t believe it is certain to work. I think it is an open question. There are three reasons to test it live anyway.
- The truth lies between the two numbers. The 2022 universe is the pessimistic bound: it keeps companies that a running screen would have dropped at the next index change. Today’s stocks are the optimistic bound. Nobody knows exactly where in between. For a strategy that buys laggards early, probably closer to the pessimistic end.
- A live test can’t flatter itself. On any given day it only sees the stocks that exist that day. Whoever fails later is already in it. It cannot make the mistake that made the backtest look too good.
- Paper costs nothing. The measurement runs without risk until enough trades under today’s rules have closed to set it against an index fund.
What hasn’t changed: the model still can’t tell a laggard that is catching up from a company in decline. None of the later rule changes fixes that. So the good run since May may also mean that few such companies happened to be among the candidates in these months. The first measurement on real daily data follows in the next section.
What was measured next
The simple screen holds up. The fine-tuning doesn’t.
In September I asked which parts of the model are worth anything. The basis was every daily screen since May: what happened to a stock in the 13 trading days after the signal, buying at the next open, compared with the market?
- The laggard test holds up. Across 1,009 candidates they beat the market by +1.01% on average.
- The grade separates. Grade A +1.64%, grade B +0.41%.
- Conviction doesn’t rank. Among grade A candidates the top third did exactly as well as the middle third (both +1.17%). None of the individually tested environment factors (volatility, market phase, sector, insiders, similar cases) separated the better candidates from the worse ones in a measurable way.
For the question of this report, that is the most important finding. What works is a simple rule you could rebuild in a spreadsheet. The AI score cannot distinguish between individual stocks at all, because it gives all of them the same value. Whether it at least picks the right days to buy, I have not measured separately. Where AI really helped was everything around it: I developed the model and its rules together with an AI assistant, built the whole application the same way, and use it to keep that application running every day. Above all, it helped with checking and recalculating, including the measurements on this page.
A caution: one percent over roughly three weeks is statistically measurable but small. The days overlap, so there are far fewer independent observations than candidates. And it is a measurement without fees and without stops.
The paper portfolio since May
$10,000 on 8 May 2026, $13,536 today
Portfolio value in dollars per trading day. Dashed: starting value. Marked: the low on 23 Jun ($9,836) and the day after the biggest loss. The numbers at the top mark the rule changes further down.
| Paper portfolio | +35.4% |
| S&P 500 | +4.3% |
| Nasdaq-100 | +0.9% |
| MSCI World | +3.4% |
That looks good. Three things put it in perspective.
- More than half has not been earned yet. Of the +$3,536 gain, +$1,397 comes from closed trades. The rest, +$2,139 (60%), sits in 3 open positions and can disappear again. +$2,417 of it came after 30 Sep alone.
- A few trades make the result. 9 winners, 9 losers. The typical trade (median) made +0.28%, the average +2.8%. The two biggest winners (together +$1,820) are more than the entire realised gain. Without them the closed trades would stand at −$423.
- The path was not straight. On 23 Jun the portfolio was below its start at $9,836. From the high on 17 Aug ($12,495) it fell −11.0% by 30 Sep. Value on 31 Aug: $12,215, on 30 Sep: $11,118.
All 18 closed trades
| Stock · sector | held | Result | Dollars | Sold because of |
|---|---|---|---|---|
| Bought under the May rules | ||||
| EPAMTechnology | 16 May–27 May | +7.1% | +$207 | trailing stop |
| TYLTechnology | 16 May–4 Jun | −2.7% | −$95 | stop at entry |
| BDCTechnology | 16 May–11 Jun | −0.3% | −$11 | time stop |
| Bought with time stop, from 11 Jun | ||||
| DOCSHealth care | 11 Jun–22 Jun | +1.0% | +$26 | time stop |
| UHSHealth care | 11 Jun–23 Jun | −1.6% | −$45 | time stop |
| BSXHealth care | 12 Jun–1 Jul | −9.6% | −$302 | stop |
| MMSIndustrials | 23 Jun–1 Jul | −0.6% | −$22 | stop at entry |
| KTOSIndustrials | 1 Jul–8 Jul | +0.9% | +$34 | trailing stop |
| BAHIndustrials | 8 Jul–21 Jul | +1.8% | +$46 | time stop |
| PCTYIndustrials | 22 Jun–23 Jul | +19.4% | +$667 | trailing stop |
| MMSIndustrials | 1 Jul–31 Jul | +12.7% | +$311 | trailing stop |
| WINGConsumer discretionary | 4 Aug–7 Aug | −10.7% | −$391 | stop |
| MPMaterials | 29 Jul–11 Aug | +32.3% | +$1,046 | target hit |
| PSKYCommunication & media | 29 Jul–14 Aug | +23.5% | +$774 | target hit |
| WINGConsumer discretionary | 7 Aug–18 Aug | −0.9% | −$27 | stop at entry |
| PINSCommunication & media | 11 Sep–21 Sep | −1.1% | −$46 | time stop |
| FICOTechnology | 29 Sep–30 Sep | −26.6% | −$953 | stop |
| PATHTechnology | 30 Sep–19 Oct | +5.2% | +$180 | trailing stop |
The 18 trades fell into 6 of the 11 sectors: Industrials 5 (+$1,036), Technology 5 (−$673), Health care 3 (−$321), Communication & media 2 (+$728), Consumer discretionary 2 (−$418), Materials 1 (+$1,046). The model does not pick sectors. It buys wherever a laggard shows up.
On top of that: 3 open positions, together +18.8% (+$2,139). They are deliberately listed without names. Biggest winners: MP +32.3% (target hit), PSKY +23.5% (target hit), PCTY +19.4% (trailing stop).
The biggest loss
FICO: −26.6% in one day, −$953. That is 9.5% of the starting capital in a single trade.
The buy on 29 Sep was booked at the last close before the buy day. After news, though, the stock opened much lower that day. Nobody could actually have got the booked price. The −8% stop didn’t help: it is checked once a day against the close, and a price gap simply jumps over it.
This is not the only case. Of 3 stop sales, 3 ended below −8% (BSX −9.6%, WING −10.7%, FICO −26.6%). A stop is an intention, not a guarantee.
How trades were booked, and why it matters
Until 1 Oct the paper portfolio booked buys at the previous day’s close and sales at the close of the day a rule triggered. That is convenient but too optimistic: there is a night between signal and buy, and by morning the price can be somewhere else entirely.
Since 2 Oct it buys only 30 minutes after the US open, at the price then, and only if the signal still holds and the price is within 5% of the signal price. Sales are decided in the morning on the close and also booked at that time at the current price. That is closer to what you would really get. A stop that triggers during the day it still is not.
That is why the trial period only starts on 2 Oct. Of the 18 closed trades, 3 were bought under the May rules and 15 with the time stop. Under today’s rules none has closed yet (1 is open). 2 of the 3 open positions that pushed the portfolio up in October were also bought the old way. So the trial period stands at 0 of 20.
Rule changes during the run
A clean experiment changes nothing along the way. This one changed 7 times, once without anyone noticing. All changes, openly:
- 11 Jun 2026 · Time stop
Positions that have barely moved after 10 days are sold. The slot goes to a fresher signal. - 17 Jun 2026 · Macro filter without data
From here on, the block ahead of major economic releases read a calendar that was no longer updated. It did nothing, and nobody noticed. - 22 Sep 2026 · Freshness check
For months the screener had scored stocks whose prices were frozen (delisted, acquired, renamed). Since then they are removed before the screen runs. - 23 Sep 2026 · Macro filter officially off
Replayed, the filter would have blocked the two biggest winners. It now only logs in the background. - 1 Oct 2026 · Stop by market phase, lock-out after a stop
The stop depends on the market phase at purchase. After a stop, the same stock is not bought again for 30 days. - 2 Oct 2026 · Buy only after the open
Buys happen 30 minutes after the US open at the price then, and only if the signal still holds and the price is within 5% of the signal price. The trial period restarts here. - 7 Oct 2026 · More stocks in the universe
50 stocks that are in neither index now go through the same screen.
I checked: none of the 18 closed trades ran on frozen prices. For one traded stock the price series has since ended, but long after the sale. Still, the bug shows something fundamental: a frozen stock, while the rest of its sector keeps moving, looks to the model like the perfect laggard. Every data source needs a check that it is still fresh.
On the macro filter: it did nothing from 17 Jun and has been officially off since 23 Sep. Replayed, the 13 trades up to then would have made −$931 instead of +$2,070 with a working filter. With 13 trades that is a hint, not proof.
What it would have cost
The paper portfolio ignores fees. Traded for real, it would have been 42 orders (counting the open positions as sold): about €84 at a low-cost online broker, about €578 at a traditional German bank (ING). An index fund, bought once and sold once, costs a fraction of that. Then there are taxes, which in Germany hit frequent trading earlier and harder than an index fund.
What I don’t know
Honestly: almost everything that matters
- Whether it is skill. 18 trades in just over five months is a small sample. Two more misses or two fewer lucky hits, and the picture flips.
- Whether it holds under today’s rules. The rules changed along the way; the honest measurement has only just begun.
- Whether the months since May were typical. In the backtest, the model liked to buy companies in difficult phases that kept falling. How it does in such a phase live, this portfolio hasn’t shown yet.
- How much of October will stay. Most of the gain has not been realised.
What I learned
The posts sell the wrong half
- A pretty backtest is the start of the test, not the result. Mine fell from +25.1% to −8.4% a year once the failed companies were counted.
- Most of the work is not fooling yourself: prices you could really have got, not counting overlapping periods twice, checking data for freshness, not confusing statistical significance with money.
- What works is simple. The fine-tuning on top added nothing measurable. The AI inside the model is the smallest part. The biggest was the AI I used to develop the model, its rules and the application, to keep it running and to check everything.
- A stop doesn’t protect you from a night. A single trade cost 9.5% of the starting capital.
- Showing only the result shows nothing. Without the rule changes, the losers and the share not yet earned, +35.4% is just a number.
What happens next: the portfolio keeps running, without rule changes, until 20 trades under today’s rules have closed. The yardstick is simple: more than an S&P 500 index fund, after costs. Otherwise the index fund is the better and cheaper autopilot.
I’ll update this page every few weeks. The date at the top shows the current state.
Notes
All results come from a paper portfolio with virtual money. No real trades were executed. This page is a snapshot as of the date at the top. It is updated every few weeks, not continuously. It contains no current signals and is neither investment advice nor a solicitation to buy or sell securities. Past results, real or simulated, say nothing about future ones. Index comparison: S&P 500, Nasdaq-100 and MSCI World over the same period, measured on the index ETFs SPY/QQQ/URTH as price return only, without dividends. Including dividends they would be 0.5 (S&P 500), 0.2 (Nasdaq-100) and 0.7 percentage points (MSCI World) higher. The paper portfolio also leaves out dividends. The numbers are generated from the paper portfolio’s logs, not entered by hand.