Alt-Data Custom Indicators
Alt-data is a SIGNAL experiment, not a structure experiment — it may touch the rank / weighting / filtering signal only, never the options structure (see options-structure-rules). The incumbent is the bar: alt-data must EARN its way in by beating (or materially de-risking) the certified book held to the same OOS gates. "The indicator is cool" is not a result.
Build with steerable compute sessions (preferred)
Prefer compute_session_start / compute_session_exec → compute_session_promote_indicator /
compute_session_end for any multi-step data build: /work persists, you observe every step, and the
whole history lands in ONE promoted indicator. List and end stale sessions first
(compute_session_list); send periodic execs while long work runs. Oneshot run_compute is for small,
single-query jobs only. Other stack tools: dataset_to_indicator, build_signal_indicator,
create_indicator, list_custom_indicators, collect_web_data, discover_sources, enrich_source,
ingest_content, probe_url, sec_edgar, get_compute_status, cancel_compute_job.
Every source gets: build → point-count + coverage check → lookahead audit → value spot-check vs the primary source → log. Platform failures get the bug-protocol; after two distinct failures on a source, park it and move on — don't let one broken pipeline stall the campaign.
Never wire an unverified indicator (lessons #10/#11)
Before referencing any CustomIndicator in a strategy, confirm all four with
list_custom_indicators + a source spot-check:
- Point count — cull 0-point corpses.
- Per-ticker coverage of the whole universe (all 21 names, not a sample).
- Freshness — the max date; a signal whose data has gone stale must NOT drive a live book.
- Lookahead safety — see below.
The sparse-series rule
A rank/weight expression only works with a series that is DENSE across the whole universe. A sparse / partial-coverage series (e.g. one politician's buys covering ~1 of 21 names) can only be a tilt or overlay, never a rank input — and a rank built on it will trade ZERO (degenerate wiring). Say so and deprioritize; don't force it.
Lookahead safety is non-negotiable (lesson #11)
Every alt-data point is stamped at the date the information was PUBLIC (filing / disclosure / post date), NOT the trade/event date. Congressional trades carry a STOCK Act lag of up to ~45 days — the signal must embed that lag. Audit explicitly per indicator before any backtest uses it. Cross-validate values with a second, independently-generated build when possible (a WSB-count series was verified this way — two independent builds matched exactly). A retro scrape of historical posts is fine; a sentiment model applied retroactively is fine (note it as a caveat); using deletion-survivors is a caveat to note.
Data coverage bounds the certification window
Check the source lake's max month first and treat the signal's coverage end as a hard constraint on certification windows and deployability. The walk-forward engine clips the fold calendar to the indicator's coverage, so certification comparisons must be calendar-aligned — run a base control on the variant's clipped calendar (see walk-forward-oos).
Integration shapes (choose per coverage)
| # | Integration | Where | Coverage needed |
|---|---|---|---|
| S1 | Blend into rank — alt-signal combined with momentum ROC as the weightIndicator / SelectTop metric | rank | broad (most of 21) |
| S2 | Tilt — momentum ranks; alt-data over/under-weights names with recent signal | weight | partial OK |
| S3 | Entry filter — only open a name if alt-signal fired within N days / above X | condition | partial OK (re-check cold-start breadth-audit!) |
| S4 | Confirmation overlay — alt-signal relaxes/tightens an existing gate (e.g. VIX) | condition | any |
Momentum stays primary, buzz is a tilt: an attention-only rank has lost badly; a log-damped attention
tilt on top of momentum has won. Proven S1 anchor shape:
weightIndicator = Multiply(ROC63, Plus(1, Log(base 10, Plus(1, IndicatorSimpleMovingAverage(21d, CustomIndicator))))). Grid axes worth varying: SMA window (10/21/42), tilt strength (log vs
linear-capped).
Integration is hand-built, not swept (CustomIndicator isn't a sweepable type) — build a variant
grid via create_portfolio_variant (deep-copy base + JSON-Pointer patch, dry_run first), label
hand-set (amber), and smoke-test each with one 12-mo $25k backtest before spending on folds
(zero/near-zero trades ⇒ the rank/filter isn't resolving → fix or drop). See sweep-reoptimization.
Source recipes
references/reddit-wsb-recipe.md— the proven Reddit Arctic lake mention-count pipeline.references/congressional-disclosures.md— House Clerk PTR pipeline (all-Congress aggregate).references/other-sources.md— insider Form 4, news-flow, attention; andsec_edgarscope.