← All methodology
Methodology · Regime detection

How we label the current macro regime.

Every score on CryptoArrow ultimately leans on the regime label. Here's exactly how we compute it, every 10 minutes, from public market data.

The five regime labels

  • Early Recovery . momentum turning positive after a downturn. Selective positioning rewarded, large beta still risky.
  • Markup . broad-based uptrend, breadth confirming. High-beta tokens and concentration in leading narratives historically rewarded.
  • Distribution . topping signals, narrowing breadth, leadership rotating. The regime where momentum-chasing punishes most.
  • Markdown . broad-based downtrend. Capital preservation rewarded over re-entry timing.
  • Unclear . mixed signals. Balanced positioning with patience tends to outperform conviction trades.

The data we pull

  • Top-100 momentum. For every token in the top 100 by market cap, we pull 24h and 7d price changes.
  • BTC dominance. Pulled directly from CoinGecko's global endpoint. Falls back to a top-100-derived estimate if the API call fails.
  • Breadth. The % of top-100 tokens with positive 7d change.
  • Volatility proxy. Average absolute value of 24h % changes across the top-100.

Classification. heuristic baseline

Before any AI runs, we compute a deterministic baseline label from the data so the dashboard never shows an empty state:

if (avg7d > 5 AND breadth === "improving") → Markup else if (avg7d < -5 AND breadth === "weakening") → Markdown else if (avg7d > 0 AND breadth !== "weakening") → Early Recovery else if (avg7d < 0) → Distribution else → Unclear

Volatility and risk are derived from the same inputs:

vol = volScalar > 7 ? "elevated" : volScalar > 3 ? "moderate" : "low" risk = vol === "elevated" OR breadth === "weakening" ? "elevated" : vol === "moderate" OR breadth === "stable" ? "moderate" : "low"

AI refinement (optional)

If ANTHROPIC_API_KEY is configured, we pass the same numeric inputs to Claude with a tight prompt asking for the label and a one-sentence read. Claude can re-label between the same five categories but never invents new ones. If the response is malformed, we fall back to the heuristic. the dashboard never breaks because the AI did.

The one-liner you see at the top of the dashboard ("Selective positioning rewarded, momentum confirming" etc.) is always written by Claude when available, falling back to a static per-label sentence otherwise.

Refresh cadence + caching

Regime is cached for 10 minutes. The cron-generated daily brief uses the same shared cache so two requests in the same window get the same label without re-running the model. Regime can change between requests, but rarely within minutes.

What this does NOT do

  • Predict the next regime change. only labels the current state.
  • Use technical indicators (RSI, MACD, etc.). we don't think these add signal at the regime level.
  • Use order-book or options data. out of scope for v1.
  • Personalize the regime to a user. same label for everyone.