The math

How POD scores are calculated.

POD scores blend five SoSoValue data sources into one number from 0 to 100. No magic, no model weights kept secret. The full pipeline is documented below.

Pipeline

Each source returns a z-score (how unusual today's reading is vs its recent history) and a weight. POD takes the weighted average of the z-scores, then squashes it through a logistic function to get a 0–100 score:

compositeZ = sum(zᵢ × wᵢ) / sum(wᵢ)
podScore   = round(100 / (1 + e^(-compositeZ)))

compositeZ = 0 maps to score 50 (neutral). A composite of +1.0 maps to 73; +2.0 to 88; -1.5 to 18.

The five sources
ETF flow/etfs/summary-history
weight 40%

Daily net inflow / outflow on spot crypto ETFs. Compares latest day against the trailing 30-day mean and standard deviation.

ETF flow is the cleanest measure of institutional appetite. A single $300M outflow day matters more than a thousand retail tweets.

Macro events/macro/events
weight 20%

Tier-1 macro events (FOMC, CPI, NFP) scheduled in the next 48 hours. Pre-positions defensively when a high-impact print is imminent.

Even a strong asset-specific signal gets overruled when an FOMC print is 6 hours away. POD respects that.

News sentiment/news
weight 15%

Recent featured news per asset, scored for sentiment polarity and confidence. Decays exponentially with age.

Headlines are noisy. They get the smallest weight, but a unanimous sentiment shift across 20 stories matters.

BTC treasuries/btc-treasuries
weight 20%

Velocity of public-company BTC purchases over the last 30 days. Rising = real fiduciary capital deploying. Applies to BTC; passes through 0 for other assets.

When MicroStrategy or a sovereign buys $500M of BTC, that is patient capital. The signal is slow but stickier than ETF flow.

VC funding/fundraising/list
weight 5%

VC capital deployed into crypto sectors over the last 30 days vs the prior 30 days. Cycle indicator.

Fundraising leads narratives by months. Small weight because it is structural, not tactical.

Weights sum to 1.00. Per-asset weights can shift when a source returns no data (e.g. BTC_TREASURY contributes 0 weight for ETH because it does not apply); composites then renormalize across the contributing sources.

Confidence rules
  • A score is flagged low confidence when fewer than three sources contributed, or when |compositeZ| < 0.3 (the signal is too neutral to act on).
  • Low-confidence scores still render in the bubbles canvas, but the Trade button in the Telegram bot disables and the drawer shows the reason.
  • Direction labels: composite ≥ 1.5 is STRONG_BUY, ≥ 0.5 is BUY, ≤ -0.5 is SELL, ≤ -1.5 is STRONG_SELL, anything in between is HOLD.
Freshness
  • Bubble scores cache for 10 minutes per request. After that window the next request triggers a fresh fan-out.
  • When SoSoValue rate-limits, the failed source contributes null and the composite falls back to the remaining sources. We never invent data.
  • ETF flow data updates after market close. Weekend scores hold the Friday read — the drawer shows the data's actual timestamp, not when the page rendered.
Limitations
  • POD scores are research signals, not investment advice. No backtest replaces real risk management.
  • Trade execution runs on the SoDEX testnet. There is no real money at risk and no real money to be made. Receipts are real on-chain transactions on ValueChain testnet.
  • The composite blend is fixed in code; we do not yet train weights on outcomes. Per-asset learning is a Wave-2 concern.
  • SoSoValue free-tier rate limits cap the concurrent fan-out. Heavy traffic can cause individual sources to skip; the drawer surfaces this honestly.
Verify

Every claim on this page is testable. /api/scores returns the live numbers behind the bubbles. Source code lives in packages/signal-engine; each contribution carries the exact rationale the bubble drawer renders.

See live scores →Raw APISource on GitHub