MIS v2 — preparing for 2 → 200 tickers
Locked: Friday May 29, 2026 · 5:00 PM EDT · before Shabbos
Sam's question: "if I want to open up the new MIS v2 and just go to the tickers tab and add all my tickers and see how it's gonna look... confirm with me that I'm not gonna break the sheet because now it's gonna go from 2 to 200."
Short answer: you won't break it, but a few prep steps make it fly
The sheet's schema scales fine. The compute layer (Apps Script time-triggers + Finnhub API rate limits) is where you'll feel the difference. Here's the audit.
What scales cleanly without prep
| Component | At 2 tickers | At 200 tickers | Risk |
|---|---|---|---|
| Tickers tab | 2 rows | 200 rows | None. Just a list. |
| HOLDINGS_CLEAN | 34 rows | 34 rows | Unchanged — holdings ≠ universe. |
| Position_Costs | 112 rows | 112+ | Unchanged. |
| FINAL_STATE_ENGINE | 11 rows | 200 rows | None. Linear append. |
| Sheet file size | ~few MB | ~5–10 MB | Well under Google's 10 million cell limit. |
| Universe table render on dashboard | instant | maybe 2–3 sec extra | Acceptable. Bucketed-collapsible UI queued. |
What gets slow or hits a wall
| Component | At 2 tickers | At 200 tickers | What I'll do |
|---|---|---|---|
| fn=finnhub refresh | <10 sec | ~3–5 min at 60 calls/min free | Already batched with maxN cap. Run nightly, not on demand. |
| fn=fse rebuild | <5 sec | 30–90 sec | Acceptable. Cloudflare cron can fire it. |
| misV2BuildFSE_ | trivial | reads Snapshot 200x | Fine — sheet ranges are batched. |
Dashboard render (fn=dashboard) |
already 4–5 min | will stay 4–5 min (same compute) | Caching pass queued — top priority post-Shabbos. |
| fn=expand (auto-chains finnhub + fse) | works | will exceed Apps Script 6-min limit if started cold | Run finnhub in batches of 40, sleep between. |
| History tab (Yahoo daily closes) | 15 tickers | I'd cap at 30–40 held tickers | Universe = 200 doesn't mean History = 200. Only held names need 1y closes. |
What you should ABSOLUTELY add (high signal, low cost)
| Type | Examples | Why |
|---|---|---|
| Sector ETFs | XLK, XLF, XLE, XLV, XLY, XLP, XLU, XLI, XLB, XLRE, XLC | Already auto-detected by Scope for sector context. Adding them as universe members lets MIS rank sector ETFs alongside individual stocks. Pure signal. |
| Index ETFs | SPY, QQQ, IWM, DIA, RSP | Benchmarks. SPY you already hold + use. |
| Bond / treasury | TLT, IEF, SHY, SGOV | Macro context, your existing rotation pair (SCHZ already in). |
| Commodity ETFs | GLD, SLV, USO, UNG, DBC | Currently UNG only. Add for diversification visibility. |
| Volatility | VIX (read-only proxy, can't trade), VIXY, UVXY | You hold UVXY/VIXY — leverage these for regime signals. |
| International | EFA, EEM, FXI, EWJ | Optional, only if you actually consider these. |
What you should be CAREFUL about
| Type | Examples | The honest read |
|---|---|---|
| Leveraged ETFs | TQQQ, SQQQ, SOXL, SOXS, UVIX, TSLS, NVDL | You hold several already. They WORK in MIS but FSE was tuned for ~1× stocks. A "WATCH" on SOXL is a much bigger deal than on SOXX (3× vol). Add them but mentally apply higher risk weighting until I add a leveraged-ETF flag column. |
| Inverse ETFs | SQQQ, SOXS, TSLS | Same plus they decay over time from daily resetting. Long-term hold = guaranteed loss. Treat them as tactical-only. |
| Penny stocks / low volume | QUBT, QBTS, BYND, PTON | Already in your transaction history. Finnhub may not return clean data. Spreads are wide. Caveat emptor. |
| OTC / pink sheets | most "ADR-only" tickers | Finnhub coverage is unreliable. Skip unless you specifically need them. |
| Tickers that delisted / merged | Old positions of yours | Some of your historical realized P&L names may not be tradeable now. They're in your transaction history but shouldn't go in the universe. |
Recommended universe composition for first 200 (honest stack)
US Large-Cap stocks (S&P 500 quality): ~110 names
US Mid-Cap (Russell 1000 ex-S&P 500): ~30 names
SPDR Sector ETFs (XL* family): 11 names
Index ETFs (SPY/QQQ/IWM/DIA/RSP): 5 names
Bond / treasury (TLT/IEF/SHY/SGOV/SCHZ): 5 names
Commodity (GLD/SLV/USO/UNG/DBC): 5 names
Volatility (VIXY/UVXY): 2 names
International (EFA/EEM/FXI): 3 names
Crypto exposure (IBIT/ETHA/COIN/MSTR): 4 names
Leveraged / tactical (TQQQ/SOXL/etc.): ~10 names (carefully)
Niche / interest names you actually watch: ~15 names
──────────────────────────────────────────────
Total ~200 names
Of those, only the held subset (~14 currently, will grow) needs History tab coverage. The other 186 just need Snapshot + FSE rows.
What I'll have ready when you open the Tickers tab Sunday
Post-Shabbos, before you start pasting:
1. Dashboard caching pass — kill the 4–5 min load. Each expensive section gets a 60s PropertiesService cache.
2. fn=finnhub batched + sleep-aware — won't blow the 6-min Apps Script limit at 200 tickers.
3. Cloudflare cron picks up fn=fse nightly (already done) + fn=finnhub_batch for universe data refresh.
4. Tickers tab template — I'll pre-populate suggested core 80 names (the sector ETFs + index + S&P big names) so you only paste the ~120 stocks you actually want to add.
5. A "ticker capacity check" endpoint that tells you "before adding more: current N tickers, expected refresh time, recent Finnhub success rate."
Sam-side action Sunday
Just append rows to the Tickers tab with Include=Y. The rest is autonomous. The new tickers get FSE entries on the next fn=fse run (or via Cloudflare cron overnight Mon).
What I will NOT do over Shabbos
- Touch the Tickers tab
- Add caching (waits for confirmation that the queue order I just wrote is what you want)
- Pre-populate the suggested core 80 names
Confirm those when you're back and I'll fire them in order.
Source trail
- Local: docs/MIS_V2_200_TICKER_PREP.md
- MIS v2 @45 · 11 tickers in FSE currently
- Apps Script execution-time limit: 6 minutes per run (Google quota)
- Finnhub free tier: 60 API calls/minute
- Yahoo v8 chart endpoint: no published limit, but courteous to throttle