Skip to content

Add a tape-context block to the crowd board: four ETF ratios on the board's windows - #123

Merged
mspinola merged 1 commit into
mainfrom
claude/net-positioning-view-4817d4
Sep 13, 2026
Merged

mspinola merged 1 commit into
mainfrom
claude/net-positioning-view-4817d4

Conversation

@mspinola

Copy link
Copy Markdown
Owner

What

A Tape context block at the bottom of the crowd board: four ETF ratios read at the Tuesday close and scored as a range index over the same 13/26/52-week windows and full history the markets use, so "large specs at 92 on NQ" and "staples over Nasdaq at 12" read off one scale.

Row Ratio Reads Tier
Staples over Nasdaq XLP / QQQ defensive against growth leadership total
Equal over cap weight RSP / SPY breadth proxy: how broadly the index is carried total
Treasuries over junk IEF / HYG credit appetite total
Front over 3-month vol VIX / VIX3M vol term structure split (passthrough)

Orientation keeps the board's colour axis honest. On the board a high cell (bull hue) is Commercials accumulated, the crowd washed out; a low cell is the crowd long and crowded. Every ratio is written with the defensive leg on top, so its high end is the fearful, broad or stressed side and its low end the crowded, complacent side. Flipped, the colours would lie.

Shared window rule. _market_indices on the crowd page now calls tape_context.window_index_frame, so the markets and the context rows are scored by one implementation (weeks + 1 reports, two-year floor on full history).

Failure modes, by design

  • A leg the price store does not hold yet: the caption says "Tape context awaiting price data for: …" and no row is drawn. The board never depends on the price store to draw positioning.
  • A ratio priced more than 14 days before the board's week: the caption says "trailing the board: … last priced ". Yahoo's ^VIX3M feed stops on 2026-07-17, which is how this case was found.
  • Context rows carry no click target (MarketRead.linked=False), no verdict chip, and hover with their own measure and a pole note. The ticker slot is blank, since "VIX/VIX3M" overruns a column cut for a futures symbol and the blank is itself the mark that the row is not a market.

Context, not signal, and deliberately not a composite. The help text says so; the module docstring explains why (crowdmon).

Depends on

mspinola/marketdata#29 registers the four new legs (XLP, RSP, HYG, VIX3M). Until that merges and the Windows box seeds them, the deployed board shows the awaiting-data caption and no block, which is the intended state.

Verification

  • 15 new tests in tests/test_tape_context.py: orientation and tiers, Tuesday cadence with a holiday, leg alignment, the window rule (weeks + 1, history floor, move column), unlinked chipless reads, the awaiting and unset-store cases, target-date reads, cache keyed on the store's last dates, the context block's ordering, no click target on context marks, hover text, and the trailing notice.
  • Suite 820 passed. ruff check src tests clean on 0.15.22.
  • Rendered locally against a scratch copy of the price store with the four legs fetched: block draws under Softs, hover reads "XLP/QQQ · Staples over Nasdaq · 13-week window / Staples over Nasdaq index 26 / high: … low: …", a click on a context cell stays on /crowd, caption names VIX/VIX3M as trailing.

🤖 Generated with Claude Code

…oard's windows

Staples over Nasdaq, equal over cap weight, Treasuries over junk, and front over
3-month vol, each read at the Tuesday close and scored as a range index over the
same 13, 26 and 52-week windows and full history the markets use, drawn under the
markets whatever the order. Each ratio is written with the defensive leg on top
so the board's colour axis keeps its meaning: a high cell is the fearful or broad
side, a low cell the crowded one. The window rule moves into tape_context so the
markets and the context rows share one implementation.

A leg the price store does not hold yet is named in the caption as awaiting data
and draws nothing; a ratio whose last priced week trails the board (Yahoo's
^VIX3M stopped on 2026-07-17) is named as trailing. Context rows carry no click
target, no verdict chip, and hover with their own measure and pole note. Not a
composite and not a signal; the help text says so.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@mspinola
mspinola merged commit 689adb7 into main Sep 13, 2026
3 checks passed
@mspinola
mspinola deleted the claude/net-positioning-view-4817d4 branch September 13, 2026 23:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant