בס״ד

MIS v2 — preparing for 2 → 200 tickers

docs/MIS_V2_200_TICKER_PREP.md · last changed (pre-VM history) · rendered from GitHub master

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

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

Source trail · docs/MIS_V2_200_TICKER_PREP.md @ master · rendered 2026-07-02 7:23 PM EDT by scripts/build-docs.py · the .md in the repo is the truth; this page is the phone-readable view