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:
| Bullish | Neutral | Bearish |
|---|---|---|
| Strong Buy | Hold | Sell |
| Buy | Neutral | Strong Sell |
| Outperform | Market Perform | Underperform |
| Overweight | Equal Weight | Underweight |
| Accumulate | — | Reduce |
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 Target | Implication |
|---|---|
| Target 20%+ above current | Strong upside expected |
| Target 5-20% above | Moderate upside |
| Target near current price | Fairly valued |
| Target below current | Downside 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:
| Action | Meaning | Typical Impact |
|---|---|---|
| Upgrade | Rating improved (e.g., Hold → Buy) | Positive price reaction |
| Downgrade | Rating lowered (e.g., Buy → Hold) | Negative price reaction |
| Initiation | Analyst starts coverage | Depends on rating |
| Price Target Raise | Increased expected value | Moderately positive |
| Price Target Cut | Decreased expected value | Moderately 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 DataFramedf = 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 onlyupgrades = df[df["type"] == "Upgrade"]print(f"\nRecent upgrades: {len(upgrades)}")
# Get average price targetavg_target = df["targetPrice"].mean()print(f"Average analyst target: ${avg_target:.2f}")
# Count by signal typesignal_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:
| Factor | Consideration |
|---|---|
| Conflicts of interest | Investment banks may rate clients favorably |
| Herding behavior | Analysts often move together |
| Lagging indicators | Ratings often follow price moves |
| Sell ratings are rare | Most ratings are Buy or Hold |
| Consensus can be wrong | Popular 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
- Analyst ratings range from Strong Buy to Strong Sell (with various terminologies)
- Price targets represent 12-month expected values
- Rating changes (upgrades/downgrades) often move stocks more than initial ratings
- Analyst consensus provides sentiment but isn’t always predictive
- Consider conflicts of interest and herding behavior
Track analyst ratings and price targets with the Analyst Ratings Dataset and API Reference.