agentsclimarketplace

Analyst tracker

Skill rgourley/quant-garage/skills/analyst-tracker

Track sell-side analyst positioning on a name via Benzinga Analyst Ratings. Pulls every rating event over the lookback window, classifies each as upgrade / downgrade / initiation / reiteration / drop-coverage / PT-change, aggregates the latest rating and price target per firm, and reports the current consensus (median PT across firms plus buy/hold/sell distribution). Uses Massive's built-in Benzinga integration. Requires Stocks Basic + Benzinga Analyst Ratings entitlement.From its SKILL.md

Install
npx -y skills add rgourley/quant-garage --skill analyst-tracker

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

4.8 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it

analyst-tracker

You hand over a ticker. The skill pulls every analyst rating event Benzinga has on record over the lookback window, buckets each firm's raw rating string to a standard scale (buy / hold / sell), classifies the event (upgrade / downgrade / initiation / reiteration / PT-change / drop-coverage), aggregates the latest per firm, and reports the consensus median price target plus buy/hold/sell distribution.

This is the sell-side lens the repo was missing. Pairs cleanly with insider-flow (internal vs external sentiment on the same name) and guidance-tracker (analyst reaction vs management's own projections).

When to invoke

  • A PM asks "how is sell-side positioning shifting on NVDA?"
  • Fundamental analyst wants to see who's changed their view and by how much
  • Screening for consensus PT vs current price gap as a mean-reversion cue
  • The user says "analyst ratings", "sell-side", "upgrades", "downgrades", "price target", "consensus"

Not for: analyst quality or track record (Benzinga returns the ratings, not the historical accuracy). Not for real-time (Benzinga updates within minutes but this is not a tick feed).

What you need

  • A ticker (--ticker, required)
  • MASSIVE_API_KEY exported
  • Stocks Basic plan + Benzinga Analyst Ratings entitlement. The endpoint returns NOT_AUTHORIZED without it; skill emits a clean tier caveat rather than a raw error.

Optional:

  • --lookback-days (default 180): calendar-day window back from today.

What you get back

Two output layers from one run.

Layer 1: canonical JSON matching output-schema.json. Per-event: date, firm, analyst, rating_raw, rating_bucket (buy / hold / sell / other / unknown), previous_rating_raw, event_label (upgrade / downgrade / initiation / reiteration / price_target_change_only / drop_coverage / other), price_target, previous_price_target, pt_direction, pt_delta_pct. Top-level summary with event counts, per-firm latest rating distribution, and consensus median / low / high price target.

Layer 2: rendered note. Header + summary line + rating distribution + consensus PT, timeline of the last 25 events, one-line Take. See references/rendering.md.

How it works

  1. Pull ratings via GET /benzinga/v1/ratings?ticker={T}&date.gte={D}&limit=1000&sort=date.desc.
  2. Bucket rating strings using standard synonym sets. Buy set: buy, strong buy, outperform, overweight, positive, add, accumulate, top pick. Hold set: hold, neutral, market perform, equal-weight, in-line. Sell set: sell, underperform, underweight, reduce, negative. Anything else lands in "other".
  3. Classify each event. Rating actions like initiates_coverage_on, upgrade, downgrade, maintains, reiterates map directly. When Benzinga omits the action but the bucket changed, infer upgrade/downgrade from the bucket transition.
  4. Detect price-target-only changes. Reiterated rating + changed PT gets labeled price_target_change_only.
  5. Aggregate latest per firm. Because ratings come newest-first, the first row per firm gives the latest state. Median across firms is the consensus PT; buy/hold/sell counts describe the distribution.

Foundations used

Output mode: note

Narrative note with a timeline. A single-name analyst history is typically 20-100 events over 6 months; note format reads better than a wide table.

Endpoints used

  • GET /benzinga/v1/ratings?ticker={T}&date.gte={D} — every rating event for the ticker in the window.

Doesn't handle (yet)

  • Firm track record. No historical accuracy metric per firm or analyst.
  • Consensus rating vs consensus PT reconciliation. Firms often raise PT while keeping a Hold rating (or vice versa); these are reported separately, not reconciled.
  • Guidance overlay. Pair with guidance-tracker for a workflow composite: "did the analyst move after management guided?"
  • Bulls Bears Say text. The endpoint returns rating actions and PTs; the narrative from Bulls Bears Say is a separate endpoint.
  • Peer comparison. No "is NVDA's PT delta above peer set median?" Queued as a composite.

These are clean PR extensions. Output schema is forward-compatible.

What ships with it: 4 files

6.5 KB alongside SKILL.md

references/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.