# Day Trading Best of Ideas

Maintainer-curated **intraday-only** book (no overnight). All sleeves use **5-minute RTH bars** from `SP500_1Min_Parquet_RTH_FULL` unless noted.  
Document each sleeve with: **token**, **rules**, **runner**, **artifacts**, and **headline metrics** (with date window).

**Not in this book:** daily CM dip-buy (`cracking_markets` SP100), intraday VWAP-reclaim **long**, or PDL **long** touch — backtests show negative edge at 5m.

---

## Preferred day-trading book (maintainer default · 2026-07)

| # | Token | Sleeve | Side | Hold |
|---|--------|--------|------|------|
| 1 | `ma_slope_intraday` | MA slope **confirm_entry_4b** top-10 rotation | Long | Entry ~10:40–11:05 ET → **MOC** flat |
| 2 | `pdl_touch_short` | Prior-day-low **failed-support short** (mega5) | Short | Same session; ATR profit / reclaim stop / MOC |
| 3 | `atr_high_breakout` | **ATR-high stop breakout** (mega-cap; prefer **early + VIX&lt;22**) | Long | First cross of open/POI + 1×ATR → **MOC** |
| 4 | `pdl_spy_vwap_short` | PDL touch short **only when SPY &lt; session VWAP** (idea **55**) | Short | Same as #2 + SPY regime gate |
| 5 | `qqq_pdl_touch_short` | **QQQ** PDL touch short (idea **77**) | Short | Same PDL rules on one ETF |

**Combine rule (research):** on one intraday capital slot (default **$100k** notional), **equal-weight** each active sleeve’s **session-compounded** 5m return stream. Do **not** sum standalone sleeve return % without matching window and sizing. Live: run sleeves on **separate NAV budgets** (see sizing below).

**Universe split:** sleeve **1** ~500 SP500 names; sleeves **2–4** liquid mega-caps; sleeve **5** **QQQ only** (locatable).

---

## 1 · `ma_slope_intraday` — momentum rotation (long)

**Economic story:** Cross-sectional **intraday momentum** — buy names with the strongest rising fast-MA slope after the opening range; hold through the afternoon; flat at close.

### Rules (confirm_entry_4b — preferred)

| Step | Detail |
|------|--------|
| Universe | ~500 alphabetical SP500 names with Alpaca 1m parquet (cap `--max-tickers 500`) |
| Bars | 5m RTH, session-aligned (09:30 ET) |
| Score | `dual_product` rank on EMA10 / EMA50 slopes (bar counts ≈ 50 min / 4.2 hr) |
| Screen | ~10:25 ET (bar 10): rank top **N=10** |
| Confirm | **4 bars later** (~10:45): names still in top-N → **enter** |
| Weights | Equal weight among confirmed names |
| Exit | **MOC** (last 5m bar); no overnight |
| Entry window | Bars 5–17 (~10:00–11:00 ET); live entry **10:40–11:05 ET** |

**Enhancements tested (2020–2026):** `top_n=5` beats confirm_4b on headline return in-sample; **confirm_4b @ top-10** is the live default for breadth. See `ma_slope_confirm_ideas_sweep.csv`.

### Headline metrics

| Window | Return | CAGR | Sharpe | Max DD | Notes |
|--------|--------|------|--------|--------|-------|
| **2025-01-02 → 2026-06-18** (OOS-style) | **+111.5%** | **+68.0%** | **1.68** | **−22.8%** | `ma_slope_intraday_oos_2025_top10.csv` · confirm_entry_4b |
| 2020-01-02 → 2026-06-26 (full) | +1158.8% | +48.0% | 1.32 | −31.0% | `ma_slope_confirm_ideas_sweep.csv` · research; high churn |

### Runners

**Backtest**

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/strategy_stack/run_ma_slope_alpaca_intraday_oos_2025.py \
  --min-symbols 400 --top-n 10 --max-tickers 500
```

**Enhancement sweep**

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/strategy_stack/run_ma_slope_confirm_ideas_sweep.py \
  --start 2020-01-02 --end 2026-06-26
```

**Trade stats export**

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/strategy_stack/run_ma_slope_intraday_trade_stats.py
```

### Live (IBKR paper / live)

Doc: `RenTech/live/MA_SLOPE_INTRADAY_IBKR.md`  
Config: `RenTech/live/config/live_ma_slope_intraday.json`

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  -m RenTech.live.run_ma_slope_intraday_ibkr --recommend-only
```

| ET window | Action |
|-----------|--------|
| 10:40–11:05 | BUY top-10 (equal weight) |
| 15:55–16:00 | MOC SELL — flat |

**Sizing:** default **10% of IB net liq** (`capital_budget_nav_pct: 0.10`).  
**Output:** `RenTech/data/logs/ma_slope_intraday_ibkr_recommendation.json`

### Code

| Module | Role |
|--------|------|
| `ma_slope_intraday_daytrade.py` | Core 5m same-session engine |
| `ma_slope_intraday_enhanced.py` | confirm_entry, VWAP filters, slippage |
| `ma_slope_engine.py` | Slope rank score |

---

## 2 · `pdl_touch_short` — failed-support short

**Economic story:** **Prior day low (PDL)** is support. When price **tags PDL from above** and cannot hold, treat PDL as **resistance** — short the touch (intraday **breakdown / fade**, not CM dip-buy). This is the mirror of the losing `pdl_touch` long.

### Rules

| Step | Detail |
|------|--------|
| PDL | Prior session **low** (no lookahead) |
| Context | Prior close held above PDL (`require_support_intact`) |
| Entry | Session **low ≤ PDL** → **short at PDL** (limit sell + slippage) |
| Profit | Cover when close ≤ entry − **0.75× daily ATR** (default preset) |
| Stop | Cover when close ≥ **session high at entry** or entry + **0.5× daily ATR** |
| Time | Flat **MOC**; **one round-trip per symbol per session** |
| Universe (research) | **AAPL, MSFT, NVDA, AMZN, GOOGL** (liquid mega-caps); extend cautiously |

**Rejected variants (do not use):**

| Variant | Result |
|---------|--------|
| `pdl_touch` long | −99% SP100 book; buying support at 5m loses |
| `pdl_bounce_short` (break → retest) | Weaker than touch-short; near breakeven per name |
| `vwap_reclaim` / CM intraday long | Negative edge in 2022–2025 tests |

### Headline metrics (2022-01-03 → 2025-12-31 · 3 bps/side)

**Per-name (trust avg trade / Sharpe over compounded return):**

| Symbol | Return | Sharpe | Max DD | Trades | Win% | **Avg trade** |
|--------|--------|--------|--------|--------|------|----------------|
| AAPL | +332%* | 3.19 | −6.9% | 570 | 46% | **+0.21%** |
| MSFT | +317%* | 3.21 | −4.8% | 564 | 46% | **+0.18%** |
| NVDA | +2478%* | 1.81 | −13.0% | 563 | 49% | **+0.69%** |

\*Compounded over **~500+ trades/name**; headline % is inflated by intraday churn — size on **avg trade** and Sharpe.

**Mega-cap 5-pack equal book:**

| Metric | `pdl_touch_long` | **`pdl_touch_short`** |
|--------|------------------|------------------------|
| Return | −98.8% | +9624%* |
| Sharpe | −1.62 | **1.80** |
| Max DD | −98.8% | **−9.1%** |
| Avg trade | −0.61% | **+0.40%** |
| Trades | 776 | 2848 |

### Runner

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/strategy_stack/run_cm_intraday_pdl_short.py \
  --symbols AAPL,MSFT,NVDA,AMZN,GOOGL \
  --start 2022-01-03 --end 2025-12-31 \
  --out-prefix RenTech/data/logs/cm_intraday_pdl_short_mega5
```

**Artifacts:** `cm_intraday_pdl_short_mega5_{csv,meta,metrics}.txt`

**Engine:** `RenTech/strategy_stack/cm_intraday_dip.py`  
Presets: `pdl_touch_short_config()`, `pdl_short_config()` (bounce variant)

### Preferred overlays (ledgered)

| Overlay | Flag / preset | Effect (mega5, 2022–2025) |
|---------|---------------|---------------------------|
| **SPY &lt; VWAP** (idea **55**) | `--spy-below-vwap` · `pdl_touch_short_spy_below_vwap_config()` | Sharpe **1.87**, avg **+0.43%**, DD **−7.2%**, 2802 trades |
| High-vol / ATR% filter | `--min-prior-vol-ann-pct 25 --min-prior-atr-pct 2` | Sharpe ~1.79, avg ~+0.53% |

### Live status

**Not wired** to IBKR command center yet. Before live:

- Short locate / borrow fees (especially NVDA)
- Separate capital budget from MA-slope long book
- **Preferred regime:** `--spy-below-vwap` (sleeve **4**)

---

## 3 · `atr_high_breakout` — ATR-high stop breakout (long)

**Economic story:** Classic **intraday breakout** — when price first crosses a stop above the session anchor by **prior-day ATR**, buy the breakout and hold to the close. Support/resistance flip from the PDL short, but on the **upside**.

### Rules (default preset)

| Step | Detail |
|------|--------|
| Anchor | `max(session_open, SMA10_prior_close)` |
| Breakout stop | **anchor + 1.0 × prior-day ATR(14)** |
| Trigger | First 5m bar whose **high ≥ stop** (prior bar high was below) |
| Fill | Stop price (or bar open if gapped through); 3 bps slippage |
| Filter | Session running high **> session open** before entry (`use_open_filter`) |
| Trend | Prior close **> SMA(200)** (`require_uptrend`) |
| Entry window | Through ~11:30 ET (`max_entry_bar=48`); one trade / symbol / session |
| Exit | **MOC** (default) or optional `--exit-mode atr` (+1.0 / −0.75× daily ATR) |
| Universe | **Mega-cap 5** (AAPL, MSFT, NVDA, AMZN, GOOGL) — **not** full SP100 |

**CM NASDAQ preset (`--preset cm`):** POI + **2.2× ATR(20)** — matches `nasdaq_ma_breakout_daytrade.py` logic; weaker on 5m mega-caps in 2022–2025 tests.

### Headline metrics (2022-01-03 → 2025-12-31 · 3 bps/side)

| Preset | Universe | Return | Sharpe | Max DD | Trades | Win% | Avg trade |
|--------|----------|--------|--------|--------|--------|------|-----------|
| **default** | Mega-cap 5 | **+5.1%** | **0.29** | **−8.1%** | 87 | 51% | **+0.08%** |
| default | SP100 (100) | −72.4% | −1.84 | −76% | 1810 | 45% | −0.11% |
| cm (2.2× POI) | Mega-cap 5 | −4.3% | −0.10 | −20.4% | 225 | 47% | −0.06% |
| default + ATR exit | Mega-cap 5 | −0.5% | −0.09 | −2.9% | 87 | 44% | ~0% |

**Takeaway:** Breakout works **modestly on liquid names only** with a **tight 1×ATR** stop above open/POI and **MOC** exit. Broad cross-section bleeds; 2.2× CM multiplier is too wide for 5m mega-cap panel.

### Runner

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/strategy_stack/run_cm_intraday_atr_breakout.py \
  --preset default \
  --symbols AAPL,MSFT,NVDA,AMZN,GOOGL \
  --start 2022-01-03 --end 2025-12-31 \
  --out-prefix RenTech/data/logs/cm_intraday_atr_breakout_mega5_default
```

**CrackingMarkets-style (hourly reference, looser on 5m):**

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/strategy_stack/run_cm_intraday_atr_breakout.py \
  --preset cm --symbols QQQ \
  --start 2022-01-03 --end 2025-12-31 \
  --out-prefix RenTech/data/logs/cm_intraday_atr_breakout_qqq_cm
```

**Artifacts:** `{prefix}_{csv,trades,daily,meta,metrics}.txt`

**Code:** `RenTech/strategy_stack/cm_intraday_atr_breakout.py`  
**Legacy hourly runner:** `nasdaq_ma_breakout_daytrade.py` (60m bars, POI + 2.2×ATR)

### Live status

Not wired to IBKR. Natural fit: **stop-buy GTC** at computed open level + **MOC** exit (same schedule as MA slope).  
**Preferred research preset:** `--preset early` + `vix_max_prior=22` (Sharpe ~1.46 on mega5).

---

## 4 · `pdl_spy_vwap_short` — PDL short × SPY &lt; VWAP (idea 55)

**Economic story:** Same failed-support short as sleeve **2**, but only when **SPY is below session VWAP** — shorts get a market-tape tailwind; skip PDL fades on bid-heavy days.

### Rules

Same as `pdl_touch_short`, plus:

| Gate | Detail |
|------|--------|
| SPY regime | At entry bar, **SPY close &lt; SPY session VWAP** |
| Universe | Mega5 (AAPL, MSFT, NVDA, AMZN, GOOGL) |

### Headline metrics (2022-01-03 → 2025-12-31 · 3 bps/side · mega5)

| Metric | Baseline PDL short | **+ SPY &lt; VWAP** |
|--------|--------------------|-------------------|
| Sharpe | 1.80 | **1.87** |
| Max DD | −9.1% | **−7.2%** |
| Avg trade | +0.40% | **+0.43%** |
| Trades | 2848 | **2802** |
| Win% | 48% | **49%** |

Source: `day_trading_100_complement_results.csv` idea **55**. Compounded return inflated — size on **avg trade**.

### Runner

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/strategy_stack/run_cm_intraday_pdl_short.py \
  --symbols AAPL,MSFT,NVDA,AMZN,GOOGL \
  --spy-below-vwap \
  --start 2022-01-03 --end 2025-12-31 \
  --out-prefix RenTech/data/logs/cm_intraday_pdl_short_mega5_spy_vwap
```

**Preset:** `pdl_touch_short_spy_below_vwap_config()` in `cm_intraday_dip.py`  
**Artifacts:** `cm_intraday_pdl_short_mega5_spy_vwap_*` · metrics snapshot below.

### Live status

Not wired. Same locate/borrow notes as sleeve **2**; gate is SPY VWAP (easy from IB bars).

---

## 5 · `qqq_pdl_touch_short` — QQQ PDL short (idea 77)

**Economic story:** Identical PDL touch-short rules on **QQQ** alone — one ticker, usually locatable, same failed-support logic as mega5 stock shorts.

### Rules

| Step | Detail |
|------|--------|
| Symbol | **QQQ** |
| Entry | Session low ≤ prior-day low → short at PDL |
| Exits | ATR profit / stop / MOC (same as `pdl_touch_short_config`) |
| Support | `require_support_intact` |

### Headline metrics (2022-01-03 → 2025-12-31 · 3 bps/side)

| Metric | Value |
|--------|-------|
| Sharpe | **3.79** |
| Max DD | **−3.2%** |
| Avg trade | **+0.18%** |
| Trades | **564** |
| Win% | **51%** |
| Return* | +299% |

\*Compounded; trust avg trade / Sharpe. Source: complement idea **77**.

### Runner

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/strategy_stack/run_cm_intraday_pdl_short.py \
  --symbols QQQ \
  --start 2022-01-03 --end 2025-12-31 \
  --out-prefix RenTech/data/logs/cm_intraday_pdl_short_qqq
```

Or via complement harness:

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/strategy_stack/run_day_trading_100_complement.py \
  --ids 77 --start 2022-01-03 --end 2025-12-31 \
  --out-prefix RenTech/data/logs/cm_intraday_pdl_short_qqq_complement
```

### Live status

Not wired. Strong live candidate: **one ETF short**, MOC flat, no multi-name locate book.

---

## Refresh data (all sleeves)

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/data_pipeline/download_alpaca_rth_minutes.py \
  --start 2022-01-03 --end today --workers 2 --resume
```

---

## Suggested live allocation (starting point)

| Sleeve | NAV budget | Rationale |
|--------|------------|-----------|
| `ma_slope_intraday` | **10%** | Already in `live_ma_slope_intraday.json` |
| `pdl_touch_short` / **`pdl_spy_vwap_short`** | **5–10%** | Prefer **SPY&lt;VWAP** gate (sleeve 4) |
| `qqq_pdl_touch_short` | **3–5%** | Single-ETF short; easy locate |
| `atr_high_breakout` | **5%** | Early window + VIX gate; mega-cap only |

**Schedule (ET):**

```
09:30–10:30   OR / VWAP context; PDL / QQQ shorts on breakdown days
09:30–10:30   ATR-high early entries (prefer max_entry_bar≈12)
10:40–11:05   MA slope confirm_entry_4b BUY
10:00–15:30   Manage PDL / QQQ shorts (ATR targets / reclaim stops)
15:55–16:00   MOC flat all sleeves
```

---

## Best Ideas integrate — `orb_zarattini`

Token **`orb_zarattini`** is the Zarattini / Barbon / Aziz **5-minute Opening Range Breakout** on Stocks in Play. It can be added to the multi-sleeve Best Ideas fund book (not the stock-only ETF book) via:

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 .venv/bin/python \
  RenTech/strategy_stack/combine_best_ideas_stack.py \
  --mtm --fund-mode --fund-scale 2.2 \
  --with-vxx-long-call --with-macro-aw --with-tactical-aw --with-tsmom --with-johansen-etf \
  --with-orb-zarattini \
  --start 2016-01-04 --end 2026-04-02 --capital 100000 \
  --out-prefix RenTech/data/logs/best_ideas_stack_10dd
```

**Runner:** `RenTech/strategy_stack/run_orb_zarattini.py`  
**Artifact:** `RenTech/data/logs/orb_zarattini_5m_standard_daily.csv`  
**Docs:** `BEST_IDEAS.md` § Zarattini 5m ORB. Default fund weight **5%**.

---

## Caveats

1. **Intraday compounding** inflates multi-year return % when trade count is high — always cite **window, trade count, avg trade, Sharpe, max DD**.
2. **MA slope** full-history numbers are research upper bound; prefer **2025+ OOS** slice for recent validation.
3. **PDL short** is **not** daily Cracking Markets — different horizon and side.
4. **Costs:** 3 bps/side in backtest; live adds borrow, partial fills, PDT.
5. **Correlation:** MA slope long and PDL short may both fire on volatile sessions — monitor gross exposure.

---

## Related files

| File | Purpose |
|------|---------|
| `BEST_IDEAS.md` | Multi-day / fund book (theta, VRP, tactical AW, …) |
| `MA_SLOPE_INTRADAY_IBKR.md` | Live MA slope runbook |
| `cm_intraday_dip.py` | PDL / CM dip variants |
| `cm_intraday_atr_breakout.py` | ATR-high breakout long |
| `run_cm_intraday_atr_breakout.py` | Breakout backtest CLI |
| `run_cm_intraday_pdl_short.py` | PDL long vs short comparison (+ `--spy-below-vwap`) |
| `day_trading_100_complement.py` | 100-idea complement harness (source for 55 / 77) |
| `DAY_TRADING_100_COMPLEMENT_IDEAS.md` | Complement idea catalog |
| `nasdaq_ma_breakout_daytrade.py` | Hourly POI + 2.2×ATR reference |
| `run_cm_intraday_dip_tweak_sweep.py` | CM intraday long tweak sweep (negative — reference only) |
