How institutions use AnaChart’s analyst dataset

Most analyst data products tell you what Wall Street thinks. AnaChart tells you whether they’ve been right.

The dataset on Snowflake and BigQuery is the same one we use to score analysts on anachart.com — 833,000+ verified price target and rating events across 9,687 US tickers, 23 years of history, resolved to canonical analyst and broker-dealer identities. Below are the questions buyers actually open the data with, and the queries that answer them. All examples run as-is against the BMN100 (NASDAQ 100) listing on Snowflake; the broader universe runs the same patterns on the full table.

Score any analyst’s hit rate, by name

Consensus is a blunt instrument. The same name covering Apple in 2007 and 2026 is one career, not two — and a hit rate that ignores firm moves throws away most of the signal. AnaChart resolves analysts to a canonical identity, so the same person stays the same row across changes of employer. Twenty-three years of price targets per analyst means you can score 12-month accuracy without the duct-taping that other vendor feeds force on you.

For a true 12-month forward hit rate, subscribers join with their own price feed. The query below uses the dataset’s own close-price snapshots from later actions as a proxy for “where the stock was about a year later” — good enough to rank analysts in evaluation, fully replaceable in production.

WITH calls AS (
  SELECT
    a.canonical_analyst_name,
    a.date              AS call_date,
    a.price_target_after AS pt_target,
    -- close on the action that lands ~1 year after this call
    (SELECT close_price
       FROM PUBLIC.NASDAQPTRATINGS b
      WHERE b.ticker = a.ticker
        AND b.date BETWEEN DATEADD('day', 252, a.date) AND DATEADD('day', 365, a.date)
        AND b.close_price IS NOT NULL
      ORDER BY ABS(DATEDIFF('day', a.date, b.date) - 252)
      LIMIT 1)          AS close_1y
  FROM PUBLIC.NASDAQPTRATINGS a
  WHERE a.ticker = 'AAPL'
    AND a.price_target_after IS NOT NULL
)
SELECT
  canonical_analyst_name,
  COUNT(*)                                                                        AS calls_with_1y_followup,
  ROUND(AVG(ABS(pt_target - close_1y) / close_1y * 100), 2)                       AS avg_1y_error_pct,
  ROUND(SUM(IFF(ABS(pt_target - close_1y) <= 0.10 * close_1y, 1, 0))::FLOAT
        / COUNT(*) * 100, 2)                                                      AS within_10pct_rate
FROM calls
WHERE close_1y IS NOT NULL
GROUP BY canonical_analyst_name
HAVING COUNT(*) >= 5
ORDER BY within_10pct_rate DESC
LIMIT 25;

Build factor signals from analyst behavior

Price targets are numerical, ratings are categorical, and the gap between them is information. A Buy held while the analyst quietly trims the price target is one of the more reliable conviction-loss signatures in this data — and it never shows up in a ratings-only feed. With pre and post target values on every event and broker-level cross-section, you can build target-momentum factors, dispersion factors, and revision-quality factors that test cleanly back to 2004.

The query below surfaces stock-day pairs where multiple analysts trimmed price targets without changing rating — a common precursor to negative earnings surprises in the data we’ve seen.

SELECT
  date,
  ticker,
  COUNT(*) AS total_actions,
  SUM(IFF(rating_after = rating_before
          AND price_target_after < price_target_before, 1, 0)) AS quiet_pt_cuts,
  SUM(IFF(rating_after = rating_before
          AND price_target_after > price_target_before, 1, 0)) AS quiet_pt_raises,
  SUM(IFF(rating_after_simplified = 'SELL'
          AND rating_before_simplified <> 'SELL', 1, 0))       AS new_downgrades_to_sell
FROM PUBLIC.NASDAQPTRATINGS
WHERE date >= DATEADD('year', -2, CURRENT_DATE())
  AND price_target_after  IS NOT NULL
  AND price_target_before IS NOT NULL
GROUP BY date, ticker
HAVING quiet_pt_cuts >= 2
ORDER BY date DESC, quiet_pt_cuts DESC
LIMIT 100;

Audit IR coverage from the inside

Every public company has sell-side coverage. Most IR teams don’t have a clean way to see, at the analyst level, whose calls on their stock have aged well and whose haven’t. Pull twenty-three years of coverage on your ticker, see who’s still active and who’s drifted, and use that for IR Day prep, sell-side prioritization, and the questions you actually take in earnings Q&A.

WITH ranked AS (
  SELECT
    canonical_analyst_name,
    broker_number,
    rating_after,
    price_target_after,
    date,
    ROW_NUMBER() OVER (PARTITION BY canonical_analyst_name
                       ORDER BY date DESC) AS rn,
    COUNT(*)     OVER (PARTITION BY canonical_analyst_name) AS total_actions,
    MAX(date)    OVER (PARTITION BY canonical_analyst_name) AS last_action_date
  FROM PUBLIC.NASDAQPTRATINGS
  WHERE ticker = 'NVDA'
    AND date >= DATEADD('year', -5, CURRENT_DATE())
)
SELECT
  canonical_analyst_name,
  broker_number,
  rating_after          AS current_rating,
  price_target_after    AS current_target,
  last_action_date,
  total_actions,
  IFF(last_action_date >= DATEADD('day', -90, CURRENT_DATE()),
      'ACTIVE', 'STALE') AS coverage_status
FROM ranked
WHERE rn = 1
ORDER BY total_actions DESC;

Backtest consensus the way you want, not the way it was sold to you

The consensus number on most data terminals is a black box. You don’t see who’s in, who’s been late to revise, who’s stale. With the full event-level history and source attribution per row, you can rebuild consensus on your own terms — equally weighted, recency weighted, accuracy weighted — and test where the signal leads price. When the broker-level move and the simple consensus diverge, that part is usually where the alpha is.

The query below builds an accuracy-weighted consensus target for AAPL: each analyst’s most recent target is weighted by their historical at-call accuracy on that ticker, then compared to the equally weighted simple consensus.

WITH at_call_accuracy AS (
  SELECT
    canonical_analyst_name,
    SUM(IFF(ABS(price_target_after - close_price) <= 0.10 * close_price, 1, 0))::FLOAT
      / NULLIF(COUNT(*), 0) AS accuracy
  FROM PUBLIC.NASDAQPTRATINGS
  WHERE ticker = 'AAPL'
    AND close_price > 0
    AND price_target_after IS NOT NULL
  GROUP BY canonical_analyst_name
  HAVING COUNT(*) >= 5
),
latest_target AS (
  SELECT
    canonical_analyst_name,
    price_target_after AS current_target,
    ROW_NUMBER() OVER (PARTITION BY canonical_analyst_name
                       ORDER BY date DESC) AS rn
  FROM PUBLIC.NASDAQPTRATINGS
  WHERE ticker = 'AAPL'
    AND price_target_after IS NOT NULL
)
SELECT
  COUNT(*)                                                                AS contributing_analysts,
  ROUND(AVG(current_target), 2)                                           AS simple_consensus,
  ROUND(SUM(current_target * accuracy) / NULLIF(SUM(accuracy), 0), 2)     AS accuracy_weighted_consensus
FROM latest_target l
JOIN at_call_accuracy a USING (canonical_analyst_name)
WHERE l.rn = 1;

Defend research with source-level provenance

Every row carries a source URL. For research that has to defend its provenance — academic publication, expert testimony, compliance review, a portfolio note that goes to a client — every event is traceable back to a public disclosure. Duplicates across vendor feeds are removed. Misattributions caused by analyst firm moves are resolved to canonical identity. The data is auditable to the row.

SELECT
  date,
  ticker,
  rating_before_simplified || ' -> ' || rating_after_simplified AS rating_change,
  price_target_before,
  price_target_after,
  (price_target_after - price_target_before) AS pt_change,
  source_url
FROM PUBLIC.NASDAQPTRATINGS
WHERE canonical_analyst_name = 'TONI SACCONAGHI'
ORDER BY date;

What’s in the dataset

833,361 verified analyst events across 9,687 US tickers, dense from 2016 onward. 7,193 canonical analyst identities. 425 broker-dealers covered. Each row carries before and after price targets (nominal and split-adjusted), before and after ratings (raw and simplified Buy / Hold / Sell), close and split-adjusted close on the action date, and a source URL. New actions appended on a daily cadence. The current NASDAQ 100 subset (BMN100) is available for self-serve evaluation on Snowflake — 80,800+ events, 100 tickers, 2005 to present.

Access

The dataset is available on Snowflake Marketplace and Google Cloud’s BigQuery Analytics Hub. NASDAQ 100 access is self-serve. Broader universe — additional tickers, deeper history, custom slices, private exchange — is available to institutional subscribers on request.

Snowflake Marketplace (BMN100 — NASDAQ 100): app.snowflake.com/marketplace/listing/GZU6Z7386TB

Snowflake Marketplace (AAPL sample): AAPL analyst ratings and price targets sample

Google Cloud Marketplace: console.cloud.google.com/marketplace


Don’t have a Snowflake or BigQuery account? Skip the third-party sign-up entirely. The Custom Data Reports service delivers the same data as a formatted report — just describe what you need in plain English, we query the database and send you Excel or PDF directly. No marketplace account required, no ETL to set up. From $149 — we aim to fulfil same day, up to 48 hours.

Talk to us: [email protected] · Calendly