# Opening-window dataset: trade bot universe, last 20 trading days

1-minute bars from **9:25 to 10:00 ET** for every stock that met the trade bot's basic universe criteria, on each of the **20 trading days from 2026-08-27 to 2026-09-24**. Built 2026-09-25.

## Files (`/var/www/screener/trade/reports/open_window/`)
| File | Contents |
|---|---|
| `open_window_bars_20260827_20260924.csv.gz` | **166,716** one-minute bars: date, symbol, time (ET, bar start 9:25–9:59), open, high, low, close, volume, VWAP, trade count |
| `open_window_universe_20260827_20260924.csv` | **6,016** qualifying stock-days: 9:28 price and its source, previous close and volume, gap at 9:28, 9:30–10:00 open, close, high, low, % change, biggest run-up, volume |
| `open_window_summary_20260827_20260924.json` | Per-day counts |
| `build_open_window_dataset.py` | The script, to re-run or extend the dataset |

## How each day's universe was rebuilt
The same rules the bot applies at its 9:28 scan (`universe.py`), recreated for each past morning:
1. **Assets:** tradable US stock; no ETFs or funds; no leveraged or inverse products; company name of 5 syllables or fewer (3,399 symbols).
2. **Price:** the **last trade before 9:28 ET that morning** is between **$5 and $15**. If a stock had no premarket trades, the previous session's close is used, which is what the bot's snapshot sees.
3. **Volume:** the **previous session's volume is at least 500,000** shares.

**Check against the live bot:** on 9/23 and 9/24 the bot's own 9:28 scan found 306 stocks each day; this rebuild found 302 and 294. The small gap comes from the caveat below.

**Caveat:** the asset filter uses **today's** asset list, so stocks delisted since a given day, or listed after it, are treated as they are today.

Stocks with no trades in a given minute have no bar for that minute. Many stocks have no premarket bars, so their bars start at 9:30.

## Per-day overview
"Runners" = stocks whose biggest low-to-high run between 9:30 and 10:00 was at least 5% (or 10%). "* = in the bot's 9:28 top-30 list."

| Date | Qualified | 5%+ runners | 10%+ runners | 5%+ runners in bot's top 30 | Median run-up | Top 5 run-ups 9:30–10:00 |
|---|---|---|---|---|---|---|
| 2026-08-27 | 289 | 26 | 4 | — | 1.92% | DAIC 13%, JEM 12%, BETR 11%, RPD 10%, LTRX 8% |
| 2026-08-28 | 291 | 13 | 4 | — | 1.75% | XLAB 34%, USDE 14%, XPON 12%, DAIC 11%, GRML 10% |
| 2026-08-31 | 286 | 12 | 2 | — | 1.62% | WETO 61%, SWIM 11%, USDE 9%, NVAX 9%, XPON 8% |
| 2026-09-01 | 293 | 14 | 3 | — | 1.81% | ALMS 16%, MOVE 13%, WETO 12%, PMI 9%, CRML 8% |
| 2026-09-02 | 293 | 22 | 4 | — | 2.32% | MOVE 20%, NCT 18%, WETO 13%, YEXT 11%, AURA 10% |
| 2026-09-03 | 296 | 17 | 5 | — | 1.68% | CHPT 17%, TLYS 16%, DFNS 15%, GIXI 12%, CLYM 10% |
| 2026-09-04 | 289 | 12 | 2 | — | 1.78% | TRBG 21%, CHPT 10%, CLYM 8%, ASAN 8%, PSQL 8% |
| 2026-09-08 | 267 | 17 | 1 | — | 1.77% | BNC 11%, SMR 10%, SLS 8%, IE 8%, USDE 8% |
| 2026-09-09 | 298 | 13 | 2 | — | 1.62% | IRD 33%, SST 10%, AVO 9%, CGNT 8%, STDN 8% |
| 2026-09-10 | 298 | 21 | 3 | — | 2.08% | SHOE 22%, DBI 13%, IRD 12%, LOVE 10%, USDE 9% |
| 2026-09-11 | 303 | 22 | 1 | — | 1.78% | TNON 13%, SBET 9%, OBIO 8%, EROC 8%, ATEC 8% |
| 2026-09-14 | 301 | 24 | 9 | — | 2.11% | XHLD 21%, GTBP 20%, TNON 20%, PMI 16%, MKDW 14% |
| 2026-09-15 | 311 | 16 | 5 | — | 1.59% | XHLD 22%, SWVL 14%, GTBP 13%, PMI 12%, ALHC 11% |
| 2026-09-16 | 303 | 11 | 3 | — | 1.53% | FTFT 40%, TNON 11%, VEEA 10%, EROC 7%, SWIM 7% |
| 2026-09-17 | 322 | 22 | 6 | 9 | 1.78% | USDE 18%*, VEEA 18%*, SECZ 15%*, MEDS 11%*, LTRX 10% |
| 2026-09-18 | 319 | 18 | 2 | 9 | 1.52% | BNC 11%*, MEDS 11%*, USDE 9%*, MKDW 9%, VEEA 8% |
| 2026-09-21 | 381 | 28 | 2 | 5 | 1.81% | HQ 13%, CRML 12%*, OPTX 10%, ISOU 9%, MAX 8% |
| 2026-09-22 | 305 | 18 | 3 | 3 | 1.79% | GRML 16%*, AEMD 13%, CHPT 11%, ABSI 10%, CPRI 9% |
| 2026-09-23 | 302 | 8 | 1 | 2 | 1.54% | SECZ 12%, VEEE 9%, SPIR 6%, AEMD 6%, XERS 6% |
| 2026-09-24 | 294 | 13 | 6 | 6 | 1.52% | GRML 17%, SECZ 14%*, DBGI 14%, JAGX 13%*, USDE 12%* |

## What stands out
- **About 300 stocks qualify on a normal day** (267–381). 9/21 was the busiest, after a heavy-volume Friday.
- **Each day, 8–28 of them run 5% or more in the first 30 minutes**, and 1–9 run 10% or more.
- **The bot's opening top 30 misses most early runners.** On the 6 days with the bot's real 9:28 list (09-17 to 09-24), **107 stocks ran 5% or more between 9:30 and 10:00, and only 34 (32%) were on the list.** Examples: GRML +17% on 9/24, DBGI +14% and HQ +13% on 9/21, OPTX +10% on 9/21.
- **Early runners look different before the open:**

| | Early runners (5%+) | All other stocks |
|---|---|---|
| Stock-days | 347 | 5,688 |
| Median size of the 9:28 gap (either direction) | **2.38%** | 0.54% |
| Traded premarket | **96%** | 81% |
| Median previous-day volume | 2.27M | 1.96M |
| Median 9:30–10:00 volume | **333k** | 134k |

A bigger premarket gap, any premarket trading, and heavier opening volume are the clearest signs. That supports the **earlier first rescan** (for example at 9:40), and possibly weighting the gap and premarket activity more heavily in the 9:28 score.

## Ways to use the dataset
- Test scanner changes: would a different 9:28 score or an earlier rescan have ranked these runners into the top 30?
- Study the first 30 minutes of every qualifying stock, including the 9:25–9:30 premarket bars.
- Feed the simulator or the entry/exit isolation tests with a wider set of stocks than the bot's own lists.
