Paper Trading Lab

An automated trading system that runs three strategies on Alpaca paper-trading accounts, each funded with $1,000 of simulated money. The strategies trade on their own every market day, and this page rebuilds itself from the live accounts and the bots' decision logs.

Market closed 16 trades today16 trades since October 13 1 logged problem today Updated October 14 at 5:57 PM ET
QQQ breakout trader
$1,001.41
+0.14% since start+0.11% today
Staggered breakout portfolio
$1,018.67
+1.87% since start+1.13% today
Learning allocator
$1,012.23
+1.22% since start+0.49% today
S&P 500 (SPY), for comparison
$988.48
-1.15% since start-1.08% today

Today

Change in each account's value since the open, in five-minute steps.

Latest trades

Time (ET)TradeAmount
Oct 14, 3:57 PMSell XLPStaggered breakout portfolio$338.99
Oct 14, 3:57 PMSell XLEStaggered breakout portfolio$339.75
Oct 14, 3:57 PMSell SQQQStaggered breakout portfolio$113.87
Oct 14, 3:57 PMSell SPXUStaggered breakout portfolio$112.18
Oct 14, 3:57 PMSell SOXSStaggered breakout portfolio$113.86
Oct 14, 3:57 PMSell SQQQQQQ breakout trader$996.40
Oct 14, 3:40 PMBuy SVXYLearning allocator$198.63
Oct 14, 3:40 PMBuy TQQQLearning allocator$562.13

Since launch

The value of each $1,000 account since October 12, compared with putting $1,000 into the S&P 500 through SPY on the same day.

The strategies

Each strategy's chart shades the range that 80% of its backtested outcomes fell within after the same number of trading days. A result inside that range is ordinary luck; a result well outside it would suggest the strategy is no longer behaving the way it was tested.

QQQ breakout trader

Intraday · 3x leveraged

QQQ, the Nasdaq-100 fund, usually stays within a predictable distance of its opening price, and how far it typically strays depends on the time of day. Every 30 minutes the bot compares QQQ's price with the average move for that time over the past two weeks. A break above that range buys TQQQ, a fund that moves about three times as much as QQQ; a break below buys SQQQ, which moves three times in the opposite direction. The position is closed when the price falls back through the range or the day's volume-weighted average price, and everything is sold before the market closes.

Trades
TQQQ and SQQQ (3x long and short QQQ)
Decisions
Every 30 minutes, 10:00 AM to 3:30 PM
Based on
Zarattini, Aziz and Barbon (2024)
Backtest, unseen years
38% a year from 2023 to 2026, worst drop 23%
Backtest, design years
37% a year from 2017 to 2022, worst drop 27%

Holdings

No positions. The account is in cash.

Today's decisions

TimeQQQNormal rangeVWAPPosition
13:30728.94734.81 – 746.82733.82Cash → SQQQ
14:00728.03734.82 – 746.81733.18SQQQ
14:30728.67734.94 – 746.68732.74SQQQ
15:00727.75734.90 – 746.73732.50SQQQ
15:30729.07734.85 – 746.77732.04SQQQ
Recent trades (2 in total)
Time (ET)SideSymbolAmountPriceReason
Oct 14, 3:57 PMSellSQQQ$996.40$36.08end of day: never hold overnight
Oct 14, 1:30 PMBuySQQQ$995.30$36.0413:30 decision

Staggered breakout portfolio

Intraday · most active

This account applies the same breakout rule to three markets: the Nasdaq-100, the S&P 500 and the semiconductor index. Each market runs on three separate half-hour clocks offset by ten minutes, which splits the account into nine independent slices. Checking a single market more often than every 30 minutes made the strategy worse in testing, so staggering the clocks is how this account trades throughout the hour without giving up the edge.

Trades
TQQQ/SQQQ, UPRO/SPXU and SOXL/SOXS
Decisions
Every 10 minutes, 10:00 AM to 3:50 PM
Typical activity
About 16 trades a day
Backtest, unseen years
21% a year from 2023 to 2026, worst drop 16%
Backtest, design years
21% a year from 2017 to 2022, worst drop 25%

Holdings

No positions. The account is in cash.

Positions by clock

Market:00/:30 clock:10/:40 clock:20/:50 clock
Nasdaq-100SQQQCashSQQQ
S&P 500CashCashSPXU
SemiconductorsCashCashSOXS

16 decisions and 4 position changes today. Each cell is one slice of the account: one market on one clock.

Latest decision (15:50, :20/:50 clock)

MarketPriceNormal rangeVWAPPosition
Nasdaq-100728.73734.73 – 746.90731.81SQQQ
S&P 500768.90772.92 – 780.03770.60SPXU
Semiconductors566.39570.79 – 593.75569.29SOXS
Recent trades (9 in total)
Time (ET)SideSymbolAmountPriceReason
Oct 14, 3:57 PMSellXLP$338.99$86.02end of day: never hold overnight
Oct 14, 3:57 PMSellXLE$339.75$67.61end of day: never hold overnight
Oct 14, 3:57 PMSellSQQQ$113.87$36.07end of day: never hold overnight
Oct 14, 3:57 PMSellSPXU$112.18$34.08end of day: never hold overnight
Oct 14, 3:57 PMSellSOXS$113.86$42.41end of day: never hold overnight
Oct 14, 1:30 PMBuySQQQ$1.08$36.0413:30 decision (:00/:30 clock)
Oct 14, 1:20 PMBuySOXS$111.98$41.7113:20 decision (:20/:50 clock)
Oct 14, 1:20 PMBuySPXU$111.98$34.0213:20 decision (:20/:50 clock)
Oct 14, 1:20 PMBuySQQQ$111.98$35.8113:20 decision (:20/:50 clock)

Learning allocator

Daily · adaptive

Five daily strategies share this account: Bitcoin trend-following, short volatility timed by the VIX futures curve, holding TQQQ overnight during uptrends, buying sharp two-day dips, and a 3x trend position sized to its recent volatility. An online-learning algorithm called Hedge decides how much money each one gets. It began with an equal split on October 13 and moves money toward the strategies that have been performing well, while keeping at least 5% in each so it can notice when one recovers.

Trades
TQQQ, SVXY and Bitcoin
Decisions
Daily at 3:40 PM; the overnight position is sold at the open
Backtest, unseen years
23% a year from 2018 to 2026, worst drop 32%
Backtest, design years
58% a year from 2012 to 2017, worst drop 16%

Holdings

HoldingSharesValueGain
SVXY3.0930$199.22$0.59 (+0.30%)
TQQQ7.5896$559.35$-2.78 (-0.49%)

Current allocation (as of Oct 14, 3:40 PM)

StrategyHoldsSignalShare
Bitcoin trendHolds Bitcoin while its 28-day return is positive.BitcoinIn20.9%
Short volatilityHolds SVXY while short-term volatility is below its three-month level.SVXYIn19.7%
Overnight TQQQHolds TQQQ from 3:40 PM to the next open while QQQ is in an uptrend.TQQQIn19.3%
Dip buyingBuys TQQQ after a sharp two-day drop in an uptrend and sells on the rebound.TQQQIn20.9%
3x trendHolds TQQQ while QQQ is above its 200-day average, sized to its volatility.TQQQIn (80%)19.2%

How the allocation has changed

Each strategy's share of the account after each daily update. The gray line marks an equal 20% split.

Bitcoin trend
Short volatility
Overnight TQQQ
Dip buying
3x trend
Recent trades (5 in total)
Time (ET)SideSymbolAmountPriceReason
Oct 14, 3:40 PMBuySVXY$198.63$64.22daily rebalance (learned (Hedge))
Oct 14, 3:40 PMBuyTQQQ$562.13$74.07daily rebalance (learned (Hedge))
Oct 14, 3:40 PMSellXLP$338.12$85.80daily rebalance (learned (Hedge))
Oct 14, 3:40 PMSellXLE$339.70$67.60daily rebalance (learned (Hedge))
Oct 14, 3:40 PMSellXLB$331.59$49.54daily rebalance (learned (Hedge))

How it works

Research and testing

Each strategy began as published research or a well-known trading rule and was rebuilt and tested on this project's own data, with trading costs included. Design choices were made on one stretch of history and then checked once against later years the strategy had never seen. Every variant tested is logged, including the failures, and the bar for calling a result statistically significant rises with each attempt. 30 variants have been tried so far and none clears that bar, so the backtest figures here are evidence rather than proof.

Trading

The bots place market orders through Alpaca's paper-trading API, using fractional shares so a $1,000 account can hold leveraged funds and Bitcoin. Before going live, the intraday strategies were run through past trading days on a simulated clock to confirm that the live code makes the same decisions as the backtest, and it matched on more than 99% of them.

Infrastructure

The bots run on GitHub Actions and are started on schedule by cron-job.org. Every decision is written to a log that is committed to the repository. This page is rebuilt from those logs and the account data about every 30 minutes while the market is open, and the charts are drawn with Chart.js.