Intraday equity index · SPDR S&P 500 ETF (SPY)
An automated intraday strategy that buys SPY in small, equal lots on a 0.05% price grid that widens as the day moves, and sells lots in pairs as soon as a pair clears 0.10% after commissions. It aims to earn from the normal back-and-forth of the index during the session, not from its direction.
The ladder buys SPY at many nearby prices during the session and sells the cheapest lots as soon as the market lets them clear a small, fixed gain. Each buy is small. The strategy relies on SPY moving back and forth more often than it moves in one direction.
The same six rules run on every price update. They are applied in this order, and the live system and the backtest use the same code.
At startup the system loads the one-minute bars since midnight New York time. The first bar's open, normally 04:00 premarket, is the day open. The first live quote becomes the reference. The previous day's close is never used.
Whenever the price moves one step from the reference, up or down, the reference moves to the new price and a 10-share buy is triggered. The step is 0.05%, plus 0.01% for every 0.1% SPY has moved from the day open in either direction.
A buy is skipped if a lot is already held within one step of the price. Selling a lot frees its level. No more than 30 buys are placed per session.
The two cheapest lots are sold together once the pair shows at least +0.10% on its cost after all four commissions: two buys and two sells.
Every sell is a limit order at the lowest price that still meets the target, so a stale quote cannot turn a planned gain into a loss.
After a sale the system waits 10 seconds before buying again, so it does not immediately buy back the level it just sold.
SPY's day open, the 04:00 premarket bar, was $699.50, and it is now trading at $700.00. Every price below stays within 0.1% of the day open, so the step stays at its base of 0.05%, which is $0.35 at this price. Commission follows the Interactive Brokers fixed tier: $0.005 per share with a $1.00 minimum, so each 10-share order costs $1.00.
| Step | SPY | What the ladder does | Lots held |
|---|---|---|---|
| 1 | 700.00 | Reference set | — |
| 2 | 699.65 | BuyDown one step. Lot A, 10 shares | A 699.65 |
| 3 | 699.30 | BuyDown one step. Lot B | A · B 699.30 |
| 4 | 698.95 | BuyDown one step. Lot C | A · B · C 698.95 |
| 5 | 699.30 | SkipUp one step, but B already holds this level | A · B · C |
| 6 | 699.65 | SkipUp one step, but A already holds this level | A · B · C |
| 7 | 700.00 | BuyUp one step to an empty level. Lot D | A · B · C · D 700.00 |
| 8 | 700.03 | SellCheapest pair C + B clears +0.10% after costs. Limit sell of 20 shares at 700.03 | A · D |
At $700.00 the pair would have made only +0.097% after costs, so the ladder waits for $700.03. Lots A and D stay open and follow the same rule as a pair. The four $1.00 minimum commissions use up almost a third of the target on a trade this size, which is why the target is always measured after costs. Had SPY been 0.1% or more from its day open, the step would have been 0.06%, and buys would have come $0.42 apart rather than $0.35.
Premarket and regular hours, from 04:00 New York time to the regular close, 2 January 2025 to 12 October 2026. Settings as in the term sheet above, including the widening step. Each session starts with no position, and any lots unsold at the close are valued at the closing price.
| Month | Sessions | Profit taken | Held at close | Net |
|---|
Intraday range is the session's high minus its low from 04:00 to the close, as a percentage of the close. The median session moved 1.05%.
| Intraday range | Sessions | Share | Positive | Avg profit taken | Avg held at close | Avg net | Total net |
|---|---|---|---|---|---|---|---|
| Up to 0.75% | 114 | 25.6% | 71.9% | +$56 | −$35 | +$22 | +$2,461 |
| 0.75 – 1.0% | 95 | 21.3% | 70.5% | +$95 | −$72 | +$23 | +$2,143 |
| 1.0 – 1.5% | 124 | 27.9% | 72.6% | +$146 | −$102 | +$45 | +$5,557 |
| 1.5 – 2.0% | 55 | 12.4% | 54.5% | +$162 | −$255 | −$93 | −$5,128 |
| Above 2.0% | 57 | 12.8% | 54.4% | +$204 | −$448 | −$244 | −$13,929 |
| All sessions | 445 | 100% | 67.4% | +$122 | −$142 | −$20 | −$8,896 |
| Session | Step | Avg buys | Limit reached | Profit taken | Net | Largest drawdown |
|---|---|---|---|---|---|---|
| Regular hours | Fixed 0.05% | 20.1 | 31% | +$51,577 | −$13,232 | −$14,282 |
| Regular hours | Widen 0.01%, both ways | 14.8 | 9% | +$37,838 | −$10,344 | −$10,815 |
| Regular hours | Widen 0.01%, down only | 17.4 | 18% | +$44,340 | −$10,886 | −$11,545 |
| 04:00 – close | Fixed 0.05% | 23.1 | 43% | +$65,354 | −$9,337 | −$12,151 |
| 04:00 – close | Widen 0.01%, both ways Current | 19.0 | 21% | +$54,062 | −$8,896 | −$10,215 |
| 04:00 – close | Widen 0.005%, both ways | 21.0 | 31% | +$59,377 | −$8,541 | −$10,448 |
| 04:00 – close | Widen 0.01%, down only | 21.2 | 29% | +$59,032 | −$9,482 | −$10,289 |
| 04:00 – close | Widen 0.005%, down only | 22.2 | 35% | +$62,253 | −$9,135 | −$10,787 |
All rows cover the same 445 sessions with 10-share lots, a 30-lot limit and a +0.10% pair target. "Widen 0.01%" adds 0.01% to the step for every 0.1% SPY moves from its day open; "down only" widens only while SPY is below it. "Limit reached" is the share of sessions in which all 30 lots were bought. Trading from 04:00 adds profit taken without a matching rise in losses at the close. From 04:00, widening the step mainly reduces risk: it lowers the worst sessions and the drawdown and holds fewer lots on trending days, while improving the net result by up to $800. The 0.005% setting has the best net result, but the margin over 0.01% is under $1 per session, too small to tell apart from chance.
239 sessions. Prices come back through the grid, pairs keep clearing, and few lots are left at the close.
206 sessions. The ladder keeps buying into the decline. The widening step spaces those buys further apart, but most of them are still held at the close.
The profit-taking side works as designed. It adds to the total at a steady pace in quiet and volatile sessions alike, and it earns more on wider-range days because more pairs clear. The loss comes from the lots that never recover during the session. Five sessions account for −$9,321 of the net result. The largest was 20 November 2025, when SPY fell from $670.98 at 04:00 to $652.53 at the close and the day ended −$2,354. With a fixed step, that session lost −$3,509 in regular hours alone.
The widening step is a first answer to the trending-day problem. Spacing buys further apart as the day moves cut the worst session by about a third and halved the sessions that used all 30 lots, but it did not make the result positive. Research is now focused on three questions. First, whether early signs of a trending session, such as range or opening direction, can switch the ladder off or reduce the lot limit. Second, how to size the lot limit relative to the day's volatility. Third, what happens when unsold lots are carried into the next session. The live system carries them and sells only above the account's average cost, while the backtest values them at the close. Sections 6 and 7 describe the modelling tools and the news signals for these questions. This brief will be updated as results come in.
A backtest follows one price history. Two standard quantitative tools can show how much the result depends on that history. They can also show whether the sessions that cause the losses can be spotted early enough to act. The figures below come from the 445 backtested sessions of the current setup. They show what each tool can do, not a finished model.
Each session is classed as calm, normal or volatile by its intraday range. A Markov chain estimates the probability of each class tomorrow given the class today. In the table, each row is the previous session and the shading shows probability.
| Previous session | Next calm ≤ 1.0% | Next normal 1.0 – 1.5% | Next volatile > 1.5% | Avg net next session |
|---|---|---|---|---|
| Calm | 63.9%133 | 25.0%52 | 11.1%23 | −$30 |
| Normal | 43.5%54 | 32.3%40 | 24.2%30 | −$37 |
| Volatile | 19.6%22 | 28.6%32 | 51.8%58 | +$20 |
A volatile session is followed by another 52% of the time, compared with 11% after a calm one. Regimes persist, which is what a Markov model is built to capture.
Sessions after a volatile day made +$20 on average, better than sessions after a calm day. Most volatile spells are single days that arrive after calmer ones, so yesterday's class alone does not flag the losing days.
The useful signal therefore has to come from within the session. Possible uses under study:
A hidden Markov model on one-minute returns and the running range would estimate, through the day, the probability that the session is trending. The ladder would stop buying or reduce its lot limit once that probability passes a threshold.
The prior-day class, which does carry information about tomorrow's range, would set the starting lot limit: 30 after a calm day and fewer after a volatile one.
Each grid step is treated as a move up or down with probabilities estimated per regime. This gives the expected time to clear a pair and the probability of reaching the 30-lot limit, which can be checked against the backtest.
The step already widens as SPY moves away from its day open. A regime model could also set the base step, the widening rate and the profit target before the session starts, based on the expected regime.
Monte Carlo simulation builds many possible trading years and runs the strategy through each, so a setting is judged on a distribution of outcomes rather than one history. As a first pass, the backtested sessions were resampled into 20,000 simulated years of 252 sessions. Sessions were drawn in blocks of five, so volatile spells stay together.
With the current settings the loss is not bad luck in the test period. It appears in about seven of every eight simulated years. Any change to the strategy has to move this whole distribution, not just improve the one historical path. The simulation can go further in three ways:
One-minute SPY paths would be generated from the regime model above, and the strategy's code would run on them, so settings are tested on many more sessions than history provides.
Grid step, target and lot limit would be compared by their full outcome distributions. This favours settings that hold up across paths over settings that fit one history.
Extra trend days, gap opens, and spread and slippage costs would be added to measure how far results worsen outside the backtest's assumptions.
The drawdown distribution would set the capital held against the 300-share maximum position and the point at which trading is suspended.
A Markov model is fitted to one-minute SPY data, with transition probabilities between calm, normal and trending states.
Monte Carlo generates thousands of price paths that switch between those states with realistic frequency and persistence.
The same code that trades live runs on every path, with and without the regime filter, under the same costs.
A change is adopted only if it improves the median year and the bad-year and drawdown tails together.
The sessions that cost the ladder money are usually trending sessions, and trends are often started by news: an inflation print, a Federal Reserve decision, or results from one of the index's largest companies. Price-based models, including the Markov model in section 6, detect a trend only after it has begun. Language models can read news and official text as it is published and score its tone and relevance. That could give an earlier warning, or one that does not depend on price. This section describes how sentiment could be used. It has not yet been tested.
| Source | What the model extracts | When it is available |
|---|---|---|
| Economic calendar | Scheduled releases (CPI, payrolls, FOMC), and how far the actual figure differs from consensus | Known in advance; surprise at release |
| News headlines and wire stories | Direction and strength of tone, relevance to the US index as a whole, and whether a story is new or a repeat | Continuously, within seconds |
| Central bank communication | Hawkish or dovish tone of statements, press conferences and speeches, compared with the previous message | At scheduled times |
| Earnings of the largest index members | Tone of results, guidance and call commentary for the companies with the most weight in the S&P 500 | Mostly before the open or after the close |
| Overnight and pre-market news | A single score for how unsettled the news backdrop is before the session opens | Before 04:00 ET, and through the premarket |
The overnight score and the day's event calendar would set the starting lot limit. The ladder would trade with fewer lots, or not at all, on sessions with major releases or an unusually negative news backdrop.
A sharp shift in headline tone during the session would pause new buys. Buying would resume after a set period without further shifts. Existing lots would still be sold at their normal targets.
The ladder can already be set to buy on dips only, on rallies only, or both. Strongly negative news could switch it to rallies only, so that it stops buying into a news-driven decline.
Sentiment scores would be added as an input to the Markov model in section 6. The probability of moving into a trending state would then depend on the news as well as on price.
Headlines, releases and transcripts would be collected for every backtested session, each stamped with the minute it was first published.
Each item would be scored using only text available at that minute, with a fixed model version so scores can be reproduced.
Scores would be checked against each session's range and direction, and in particular against the sessions with a range above 1.5%.
The ladder would run with the sentiment rules through the backtest and the Monte Carlo simulation. A rule is adopted only if the whole distribution improves.
No more than 30 buys per session. This caps what can be held at 300 shares.
Every sale is a limit order at or above the price that meets the target after commissions. No sale is sent at a price below it.
Sales are also held above the account's average cost for the whole position, so the broker never records a sale as a realised loss.
The system does not trade on the previous close. If only delayed data is available, it warns the operator, and its sell limits keep delayed quotes from causing losses.
Outside regular hours, buys are limit orders at the ask. Market orders are never used outside regular hours.
On restart, the system rebuilds its lots from seven days of executions and cancels any orders it did not place, so it does not act on an outdated position.
As SPY moves away from its day open, buys are spaced further apart. On a trending day the 30 lots cover a wider price range, and fewer of them are bought.
If the bars since midnight are not available, the first live price of the day becomes the day open. The day open resets at midnight New York time.
The backtest replays one-minute SPY bars from Interactive Brokers through the same strategy code that runs live, from 04:00 New York time to the regular close (13:00 on early-close days). The day open is the open of the first bar after midnight, which was the 04:00 bar on every tested day but one. Only the broker is simulated. A market order fills in full at the close of the bar that triggered it, and a limit order fills at its limit price. Commissions follow the Interactive Brokers fixed US tier: $0.005 per share, a $1.00 minimum per order, and a cap of 1% of trade value.
The bid-ask spread, slippage and queue position are not modelled, so the fills above are more favourable than live trading would give. Each session starts with no position, and any lots still held at the close are valued at the closing price. The largest amount held at the close in any session was $112,485. The average was $30,166.
Session classes in section 6 use the range from 04:00 to the close: calm up to 1.0%, normal 1.0–1.5%, volatile above 1.5%. The transition table counts 444 consecutive session pairs. The Monte Carlo figures resample the 445 daily net results in blocks of five consecutive sessions, 20,000 simulated years of 252 sessions each. They inherit every assumption of the backtest above.
All figures are hypothetical backtest results. They do not reflect actual trading and do not include financing costs or taxes. Past performance, simulated or actual, does not guarantee future results. This brief is for information only and is not an offer to sell, or a solicitation of an offer to buy, any security or investment service.