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.
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.
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.
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.
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.
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 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.
- 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 isBUY, ≤ -0.5 isSELL, ≤ -1.5 isSTRONG_SELL, anything in between isHOLD.
- Bubble scores cache for
10 minutesper request. After that window the next request triggers a fresh fan-out. - When SoSoValue rate-limits, the failed source contributes
nulland 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.
- 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.
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.