# Macro All-Weather Options Portfolio (session memory)

Cross-session reference for work done to find **SPY-uncorrelated** option sleeves to complement the **4-regime VRP** book, and to combine them into a tradeable portfolio.

## Goal

- Complement existing **VRP** (SPY vol, VIX regimes) with options on macro ETFs.
- Target **low correlation to SPY**; avoid stacking redundant equity beta (**QQQ**, **IWM** ρ≈0.87–0.93 vs SPY).
- Build an **all-weather-style** macro options book: bonds (**TLT**), oil (**USO**), commodities (**DBC**), gold (**GLD**).

## Data

- Theta 15:45 Parquet: `RenTech/data/theta_chunks/{root}_1545_YYYY_MM.parquet`
- Roots with full history (2016+): **SPY, TLT, IEF, DBC, QQQ, GLD, IWM, USO** (124+ months each except SPY 248).
- Underlying daily ρ vs SPY (2016-04 → 2026-04): **TLT −0.15**, **IEF −0.13**, **GLD +0.08**, **USO +0.26**, **DBC +0.32**, **IWM +0.87**, **QQQ +0.93**.

## Research tooling (created in this thread)

| Script | Purpose |
|--------|---------|
| `analyze_macro_option_complement.py` | Rank ticker×structure vs SPY (optional VRP JSONL); writes `macro_option_complement_ranked.csv` |
| `macro_aw_options_portfolio.py` | **Production combiner** for the selected 8 sleeves; `--allocation equal_weight\|stacked`; optional `--with-vrp-csv` |

Existing benchmarks reused:

- `benchmark_option_strategies_by_ticker.py` — 8 monthly structures (PMCC, PCS, IC, etc.)
- `benchmark_putw_like_multi_ticker.py` — monthly ATM cash-secured put (**putw_like**)

## Selected sleeves (canonical 8)

| Ticker | Structure | Notes from scan |
|--------|-----------|-----------------|
| TLT | buy_write_pmcc | Sharpe ~1.8, low SPY ρ |
| TLT | bull_call_spread | |
| TLT | butterfly_spread | |
| USO | butterfly_spread | |
| USO | iron_condor | |
| USO | jade_lizard | |
| DBC | put_diagonal | Validate with `--strict-legs`; thin chain / 0% DD flags |
| GLD | putw_like | PUTW-like CSP; +44% in putw scan vs weak multi-leg grid |

**Deprioritized:** QQQ/IWM (equity beta); IEF options (suspicious backtest); TLT put-write (loses).

## Portfolio combiner

**Runner:** `RenTech/strategy_stack/macro_aw_options_portfolio.py`

Each sleeve is backtested at **`--capital`** (default $100k) with **monthly first-session rolls**, **exit-day realized PnL** (not margin MTM).

### Allocation modes

| Mode | Formula | Economic meaning |
|------|---------|------------------|
| **equal_weight** (default) | `mean(sleeve_equity)` | 1/N of each sleeve’s PnL on one account |
| **stacked** | `capital + sum(sleeve_pnl)` | Full **N × capital** notional (~8× on $100k); boosts return & DD |

Optional VRP blend (same as `combine_vrp_putwrite.py`):

`blend = capital + w_vrp × (vrp_eq − cap) + (1 − w_vrp) × (macro_eq − cap)`

Default VRP equity column: `eq_vrp_only` in `RenTech/data/logs/portfolio_opt_10dd_sharpe_fullvrp.csv`.

### Empirical results (2016-04-01 → 2026-04-30, $100k)

| Book | Total ret | CAGR | Sharpe | Max DD | ρ(SPY) |
|------|-----------|------|--------|--------|--------|
| 8-sleeve **equal_weight** | +16.8% | 1.55% | 1.73 | −0.97% | −0.062 |
| 8-sleeve **stacked** | +134.3% | 8.81% | 1.76 | −4.75% | −0.054 |
| 50% VRP + 50% equal macro | +58.2% | — | 2.96 | −2.66% | — |
| 50% VRP + 50% stacked macro | +120.9% | 8.27% | 3.61 | −2.62% | VRP↔macro +0.061 |

Sleeve return correlation: TLT sleeves ~0.6–0.77; USO ~0.75–0.93; **DBC ~0 vs others**; GLD putw mildly negative vs TLT.

### Artifacts (default prefixes)

- `RenTech/data/logs/macro_aw_options_portfolio_daily.csv`
- `RenTech/data/logs/macro_aw_options_portfolio_sleeves_summary.csv`
- `RenTech/data/logs/macro_aw_options_portfolio_sleeve_corr.csv`
- `RenTech/data/logs/macro_aw_options_portfolio_trades.csv`
- `RenTech/data/logs/macro_aw_options_portfolio_meta.json`
- Stacked / VRP blend: `macro_aw_options_portfolio_stacked_*`, `macro_aw_plus_vrp_50_50_*`

## Commands (copy-paste)

**Equal-weight macro book:**

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 \
  .venv/bin/python RenTech/strategy_stack/macro_aw_options_portfolio.py \
  --start-date 2016-04-01 --end-date 2026-04-30 \
  --capital 100000 \
  --out-prefix RenTech/data/logs/macro_aw_options_portfolio
```

**Stacked (full notional per sleeve):**

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 \
  .venv/bin/python RenTech/strategy_stack/macro_aw_options_portfolio.py \
  --allocation stacked \
  --start-date 2016-04-01 --end-date 2026-04-30 \
  --capital 100000 \
  --out-prefix RenTech/data/logs/macro_aw_options_portfolio_stacked
```

**50% VRP + 50% macro:**

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 \
  .venv/bin/python RenTech/strategy_stack/macro_aw_options_portfolio.py \
  --with-vrp-csv RenTech/data/logs/portfolio_opt_10dd_sharpe_fullvrp.csv \
  --vrp-col eq_vrp_only --vrp-frac 0.50 \
  --allocation stacked \
  --out-prefix RenTech/data/logs/macro_aw_plus_vrp_stacked_50_50
```

**Re-rank sleeves vs SPY:**

```bash
cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 \
  .venv/bin/python RenTech/strategy_stack/analyze_macro_option_complement.py \
  --tickers "USO,TLT,DBC,GLD" --start-date 2016-04-01 --end-date 2026-04-30
```

## Caveats (agents must repeat)

1. **Not margin MTM** — headline DD/Sharpe understate live risk vs `evaluate_theta_margin` (see `.cursor/rules/theta-margin-eval.mdc`).
2. **Stacked mode** is ~**8× notional**; correlated sleeves (3× TLT, 3× USO) concentrate risk.
3. **DBC / IEF** — treat suspicious zero-DD rows as research-only until `--strict-legs`.
4. **Equity all-weather** (SPY/TLT/IEF/GLD/DBC weights) remains in `portfolio_risk_manager.py` / `vrp_all_weather_backtest.py` — separate from this **options** portfolio.

## Related repo pieces

- Tactical AW equity: `TacticalAllWeatherManager`, `BASE_WEIGHTS` in `portfolio_risk_manager.py`
- VRP blend pattern: `combine_vrp_putwrite.py`
- Overlay correlation scan: `scan_iv_overlay_correlation.py` (for JSONL sleeves vs VRP)

## Open next steps

- Export per-sleeve JSONL and run `scan_iv_overlay_correlation.py` vs canonical VRP trades.
- Wire top sleeves into `evaluate_theta_margin` or `portfolio_merge_engine` for MTM-true metrics.
- Add `--capital-per-sleeve` mode: `capital/N` sizing per sleeve (~$100k total notional).
