LunarCrush
For P&H Capital
Confidential
Trial dataset v1.0 · 14 Aug 2026

Hourly social for 260 assets. Two years of history, up to this hour.

Everything LunarCrush has, hour by hour, for the 260 of the Binance spot top 300 we cover: posts, contributors, interactions, sentiment, spam, our composite scores and market context. 4,584,840 rows, 17,520 bars per asset, 2024-08-11 00:00 to 2026-08-10 23:00 UTC. Runs to the current hour, with bar_maturity on every row so you pick your own freshness line: 4,973,938 settled, 20,638 still maturing.

Rows
4.58M
260 assets, Binance spot top 300
Covered
281/288
21 not covered, 19 not crypto
Settled rows
4.57M
20,638 maturing, flagged not hidden
Columns per bar
23
7 social, 4 composite, 7 market context, plus keys, knowledge time, bar maturity and an OHLC flag
01 · Files

Take it straight into the lake

Every file carries a SHA-256 in MANIFEST.json. The dataset joins to the universe file on asset.

Loading file list…

    
02 · Point-in-time

Why nothing in this file moves

LunarCrush hourly metrics keep changing for about 72 hours after a bucket closes: posts inside a fresh bucket keep accruing interactions, and late discovery adds posts retroactively. After that the bucket is memorialized. We verified it rather than asserting it, by re-polling the same hourly series and diffing bar for bar: every bar older than 72h came back byte-identical, and every revision sat inside the window.

The delivery is cut at 2026-08-10 23:00 UTC, which was already 93 hours old when the file was written. Re-pull this window in six months and you get the same numbers.

Memorialized · what you receivedOlder than 72h. Byte-stable, reproducible, safe to backtest against.
Hot window · excludedThe last ~72h. Interaction counts still climbing, late posts still landing.
Current bucket · excludedIncomplete by definition. Never let a partial bar into a fit.
Every row carries its own knowledge_time. That column is time + 72h, the moment the bar's value was final. It is a deterministic offset from the settlement rule rather than a per-bar observation of when the value settled. Filter knowledge_time <= your_decision_time and the lookahead question is closed at the query layer instead of in a methodology paragraph. Two caveats: this is a point-in-time snapshot, not an as-of service, because the API has no as_of parameter and always returns current best knowledge. And do not reconcile these bars against the 24h rollup endpoints, which are computed on a different path and sit 1 to 3 percent off the sum of hourly bars by construction.
03 · Schema

What is in each row

(asset, time) is the composite key. time is a UTC hour bucket, left labelled, stored naive so it joins to your Binance bars with no timezone coercion. Nulls are genuine "no observation", never silent zeros.

Social

The signal columns

  • posts_createdsum
  • posts_activenever sum
  • contributors_createdsum
  • contributors_activenever sum
  • interactionssum
  • sentimentweighted avg
  • spamexcluded above

Composite and keys

Cross-sectional, plus the PIT column

  • galaxy_score0 to 100
  • alt_rank1 = best
  • social_dominance% of crypto social
  • market_dominance% of mcap
  • knowledge_timetime + 72h

Market context

Convenience only, use your own marks

  • open high low closecross-venue
  • volume_24hcross-venue
  • market_capUSD
  • circulating_supplyunits
Aggregating across hours. posts_active and contributors_active are distinct-entity counts inside the bucket, so they cannot be summed across hours. We measured it rather than warning about it in the abstract: across 35,003 asset-days in the top 50, summing 24 hourly bars against the true daily bar gives 1.0x for interactions, posts_created and contributors_created, which is exact, but 5.8x for posts_active and 7.7x for contributors_active. That is why the daily file exists. The market columns are cross-venue aggregates rather than Binance prints, so they will not tie out to your execution data.

First rows, BTC

04 · Freshness

Market candles close. Social candles mature.

Social data is not less precise than market data, it is revised. Every value here is a real count of real public activity we observed. What changes is whether it is final. The closest thing you already model is macro data: nobody calls non-farm payrolls imprecise, they call it revised, keep vintages, and backtest against what was knowable on the day.

We re-polled the same hourly series and diffed it bar by bar. Every bar older than roughly 72 hours came back byte-identical. So rather than truncating the delivery at that line and throwing away the freshest data, we ship to the current hour and label every row.

bar_maturityAgeRowsWhat to expect
settled72h and older4,973,938 byte-stable on re-poll, safe to backtest
maturing24 to 72h13,783 still accruing, revisions shrinking
provisionalunder 24h6,855 freshest and most revisable
Draw your own line. WHERE bar_maturity = 'settled' is the conservative read. WHERE knowledge_time <= your_decision_time is the same idea as a timestamp. If your book tolerates a small revision you can trade this far fresher than 72 hours, and that is your call rather than ours. Judge a revision against the topic's own volatility: a 5 to 10 percent revision sits inside a series whose genuine hour-over-hour moves routinely run 50 to 1,000 percent. Full discussion in SOCIAL-DATA-REVISIONS.md.
The daily file exists because two columns do not roll up. Summing 24 hourly bars against the true daily bar gives 1.0x at the median for interactions, posts_created and contributors_created, but 5.8x for posts_active and 7.7x for contributors_active, which are distinct-entity counts inside the bucket. Daily runs back to 2020-01-01, well before the hourly window opens.
05 · Universe

The Binance spot top 300, and what we cover

The universe is the live Binance spot book from data-api.binance.vision, collapsed to base assets across USD-quoted pairs and ranked by 24h volume. The exchange snapshot ships in the bundle so you can re-run the cut yourself without an API key.

Of the 300: 260 are covered and delivered, 19 are not crypto at all (Binance tokenized equities like AAPLB and NVDAB, plus EUR), and 21 are crypto we do not carry. A further 3 carry an entity_flag where Binance volume runs well above the market cap we report for that coin, which usually means the ticker resolves to a different project. All 300 rows are in coverage_300.csv with the answer and the join key.

Pull live on lunarcrush_id, not on the ticker. Tickers collide, including with equities, and the id is what reproduces this file.

#AssetNameBinance 24h volumeLunarCrush idPull by BarsCoverageNote
Loading…
08 · SQL console

Query the Parquet in your browser

Optional, and it stays cold until you ask for it. Opening the console loads DuckDB-WASM and reads the Parquet straight off our CDN with HTTP range requests. No server, no auth, no telemetry, and nothing leaves your machine.

To keep it quick, the console loads a 17 MB slice: all 300 assets, the social and composite columns, and the most recent six months. It is the same schema and the same numbers as the download, just a smaller window, and it is registered as social. The full 24-month file is registered too, as social_full, if you want to hit it from here rather than downloading it. The first query against social_full streams row groups over HTTP and takes one to three minutes depending on your line; if you want the whole thing, the download link is faster.

09 · Methodology

How the 300 were chosen

Short version, because this is universe selection and not the product. We do not carry Binance market data; the contract list is only how we decided which assets to send you.

Selection

Deterministic, and shipped as a script

  • Perpetual contracts on Binance589
  • After collapsing size prefixes and quote variants531 assets
  • Ranked on summed 24h USD volume, top300
  • Snapshot date2026-08-14

Notes

Things that would otherwise surprise you

  • 1000PEPE maps to asset PEPEsocial is per asset
  • USDT, USDC and coin-margined summedone row per asset
  • Ranking sourceCoinGecko derivatives feed
  • Reproduce withbuild_universe.py
Reproducing the universe. The ranking snapshot we cut from ships as binance_ranking_snapshot_2026-08-14.json and build_universe.py turns it back into this list deterministically. Rebuilding the cut as of an arbitrary past date is not possible from this bundle, because we do not hold historical Binance liquidity ranks. Send your own universe list and we will deliver against it. fapi.binance.com refuses US-origin requests with an HTTP 451, which is why the snapshot comes from the CoinGecko derivatives feed.
06 · Entity resolution

A ticker is not a key, and we index equities too

LunarCrush covers stocks as well as coins, so a bare ticker lookup can return the wrong asset class entirely. Every asset here was resolved against the LunarCrush coin universe using market capitalisation as the discriminator: a candidate whose market cap is orders of magnitude away from the project behind the Binance contract is the wrong entity no matter how well its name matches.

258 resolved to a coin entity and were pulled by numeric id. 30 resolved by cashtag only and carry entity_confidence = ticker_only, meaning the topic has data but no coin record to verify against. 12 were dropped rather than shipped.

#TickerBinance listsWhy it was dropped
19BTWBitwayticker resolves to 'Banana Tape Wall', market cap 62x off the token
83REREticker resolves to 'Everest Re Group Ltd', market cap 213x off the token
172LALagrangeticker resolves to 'LAToken', market cap 66x off the token
179KITEKitecashtag engagement is orders of magnitude out of scale with the asset, so the ticker is catching unrelated text rather than this project
191AINInfinity Groundticker resolves to 'AI Network', market cap 6x off the token
198OPENOpenLedgerticker resolves to 'Opendoor Technologies Inc.', market cap 90x off the token
19944cashtag engagement is orders of magnitude out of scale with the asset, so the ticker is catching unrelated text rather than this project
206METMeteoraticker resolves to 'MetLife, Inc.', market cap 689x off the token
210MIRAMiraticker resolves to 'MIRA Pharmaceuticals, Inc.', market cap 3x off the token
211TRUSTIntuitionticker resolves to 'Trust The Process', market cap 87x off the token
259ARXArciumticker resolves to 'Accelerant Holdings', market cap 127x off the token
296SPACESpacecointicker resolves to 'Space Token', market cap 161x off the token
Pull on lunarcrush_id, never on the bare ticker. Every one of the 300 rows in universe_300.csv carries lunarcrush_id, entity_confidence, resolved_by and resolution_evidence, including the dropped ones. Using the id column reproduces this file exactly.
07 · Known limits

What independent auditors found

We handed this bundle to independent reviewers and told them to try to reject it. Everything here is what came back, reproduced from the delivered files. Section 6 of the README has the long form.

The universe is survivorship-biased

Structural, we cannot fix it retroactively

  • Selected from a snapshot dated2026-08-14, end of sample
  • Assets that died before thenabsent by construction
  • The fixsend us your PIT membership

A covered bar is not a populated bar

Screen on density, not coverage_pct

  • populated_pct_interactionsper asset
  • populated_pct_posts_createdper asset
  • populated_pct_closesparse early on

galaxy_score breaks in early 2025

Methodology change, not a market move

  • Universe median Feb 2025~45
  • Universe median Apr 2025~57
  • Do not compare across itz-score within regime

Composites are concurrent

Descriptive state, not signals

  • galaxy_score, alt_rankcarry live price
  • Same-bar correlationvery high
  • Forward poweressentially none

1.3% of priced bars are impossible

Flagged, not silently repaired

  • high < low or close out of rangeflagged
  • Every row carriesohlc_valid
  • Market columns arecross-venue, not Binance

Open items

Under investigation

  • Sentiment nulls, mid 2026under 1% to ~7%
  • Daily file internal gapsmany assets
  • Per-asset shape indaily_bars
Which of these will actually move your numbers. In order: the survivorship-biased universe, the sparse close column early in the window, and the galaxy_score break. The rest are a filter away.