Skip to content
Hero Background Light

What Do Analyst Ratings Mean? Buy, Hold, Sell Explained

What Do Analyst Ratings Mean? Buy, Hold, Sell Explained

Wall Street analysts spend their careers researching companies and issuing ratings. But what do terms like “Strong Buy,” “Hold,” or “Underweight” actually mean? And should you follow their recommendations?

What Are Analyst Ratings?

Analyst ratings are recommendations issued by research analysts at investment banks, brokerage firms, and independent research companies. These analysts study companies in depth—reviewing financials, interviewing management, analyzing competitors—and publish their conclusions.

A typical analyst report includes:

  • A rating (Buy, Hold, Sell, or variations)
  • A price target (expected stock price in 12 months)
  • Investment thesis (reasoning behind the rating)
  • Financial projections (revenue, earnings estimates)

Understanding Rating Scales

Different firms use different terminology, but they generally map to three categories:

BullishNeutralBearish
Strong BuyHoldSell
BuyNeutralStrong Sell
OutperformMarket PerformUnderperform
OverweightEqual WeightUnderweight
AccumulateReduce

What Each Rating Means

Buy / Outperform / Overweight The analyst expects the stock to outperform the market or its sector. They recommend increasing your position.

Hold / Neutral / Market Perform The analyst expects the stock to perform in line with the market. Not recommending new purchases, but not selling either.

Sell / Underperform / Underweight The analyst expects the stock to underperform. They recommend reducing or eliminating your position.

What Are Price Targets?

A price target is the analyst’s prediction of where a stock’s price will be in 12 months. It’s calculated using valuation models like:

  • Discounted Cash Flow (DCF) – Future cash flows discounted to present value
  • Comparable Analysis – Multiples compared to similar companies
  • Sum of the Parts – Valuing divisions separately

How to Interpret Price Targets

Current Price vs TargetImplication
Target 20%+ above currentStrong upside expected
Target 5-20% aboveModerate upside
Target near current priceFairly valued
Target below currentDownside risk

Example: If a stock trades at $100 and an analyst sets a $130 target, they expect 30% upside.

The Analyst Upgrade/Downgrade Cycle

Rating changes often move stocks more than initial ratings:

ActionMeaningTypical Impact
UpgradeRating improved (e.g., Hold → Buy)Positive price reaction
DowngradeRating lowered (e.g., Buy → Hold)Negative price reaction
InitiationAnalyst starts coverageDepends on rating
Price Target RaiseIncreased expected valueModerately positive
Price Target CutDecreased expected valueModerately negative

Upgrades and downgrades are particularly impactful because they signal a change in the analyst’s view.

Tracking Analyst Ratings Data

You can access analyst ratings and price targets through the FinBrain API:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
# Get analyst ratings as DataFrame
df = fb.analyst_ratings.ticker("S&P 500", "AAPL", as_dataframe=True)
print(df.head())
# type institution signal targetPrice
# date
# 2024-01-15 Upgrade Goldman Sachs Buy 210.00
# 2024-01-10 Reiterated Morgan Stanley Overweight 225.00
# Filter for upgrades only
upgrades = df[df["type"] == "Upgrade"]
print(f"\nRecent upgrades: {len(upgrades)}")
# Get average price target
avg_target = df["targetPrice"].mean()
print(f"Average analyst target: ${avg_target:.2f}")
# Count by signal type
signal_counts = df["signal"].value_counts()
print(f"\nRating distribution:\n{signal_counts}")

Building Signals from Analyst Data

Consensus Tracking

Track how many analysts are bullish vs bearish:

def analyst_consensus(df):
"""Calculate analyst consensus from ratings"""
bullish_signals = ["Buy", "Strong Buy", "Outperform", "Overweight"]
bearish_signals = ["Sell", "Strong Sell", "Underperform", "Underweight"]
bullish = df[df["signal"].isin(bullish_signals)]
bearish = df[df["signal"].isin(bearish_signals)]
total = len(df)
if total == 0:
return "no_coverage"
bull_pct = len(bullish) / total
bear_pct = len(bearish) / total
if bull_pct > 0.7:
return "strong_consensus_buy"
elif bull_pct > 0.5:
return "moderate_buy"
elif bear_pct > 0.5:
return "moderate_sell"
elif bear_pct > 0.7:
return "strong_consensus_sell"
else:
return "mixed"
consensus = analyst_consensus(df)
print(f"Analyst consensus: {consensus}")

Upgrade Momentum

Track recent upgrades vs downgrades:

from datetime import datetime, timedelta
def upgrade_momentum(df, days=30):
"""Calculate upgrade/downgrade momentum"""
cutoff = datetime.now() - timedelta(days=days)
recent = df[df.index >= cutoff]
upgrades = len(recent[recent["type"] == "Upgrade"])
downgrades = len(recent[recent["type"] == "Downgrade"])
if upgrades > downgrades:
return f"positive ({upgrades} upgrades, {downgrades} downgrades)"
elif downgrades > upgrades:
return f"negative ({upgrades} upgrades, {downgrades} downgrades)"
else:
return "neutral"

Limitations of Analyst Ratings

Keep these factors in mind:

FactorConsideration
Conflicts of interestInvestment banks may rate clients favorably
Herding behaviorAnalysts often move together
Lagging indicatorsRatings often follow price moves
Sell ratings are rareMost ratings are Buy or Hold
Consensus can be wrongPopular stocks get over-covered

The Sell Rating Problem

Studies show that fewer than 10% of analyst ratings are Sells. This “ratings inflation” means:

  • A Hold often means “we’d sell but can’t say it”
  • A downgrade to Hold from Buy is often bearish
  • True Sell ratings are significant events

Key Takeaways

  1. Analyst ratings range from Strong Buy to Strong Sell (with various terminologies)
  2. Price targets represent 12-month expected values
  3. Rating changes (upgrades/downgrades) often move stocks more than initial ratings
  4. Analyst consensus provides sentiment but isn’t always predictive
  5. Consider conflicts of interest and herding behavior

Track analyst ratings and price targets with the Analyst Ratings Dataset and API Reference.