DEV Community

Gunnar Thorderson
Gunnar Thorderson

Posted on • Originally published at getregime.com

Beyond Fear & Greed: Why Single Indicators Fail (And What Works)

Beyond Fear & Greed: Why Single Indicators Fail (And What Works)

The Crypto Fear & Greed Index is probably the most shared chart in crypto Twitter. "Extreme Fear — time to buy!" or "Extreme Greed — time to sell!" You've seen the posts. You might have traded on them.

Here's the uncomfortable truth: trading on Fear & Greed alone has roughly a coin-flip success rate. In some periods, it works beautifully. In others, it leads to catastrophic losses. The problem isn't Fear & Greed itself — it's using any single indicator in isolation.

Let's look at why, what the data actually shows, and how to build something that works.

What the Fear & Greed Index Actually Measures

The Alternative.me Crypto Fear & Greed Index is a daily score from 0 (Extreme Fear) to 100 (Extreme Greed), calculated from:

  • Volatility (25%): Comparing current vol to 30/90-day averages
  • Market momentum/volume (25%): Current volume vs. averages
  • Social media (15%): Crypto mentions and engagement
  • Surveys (15%): Polling data (currently paused)
  • BTC dominance (10%): Higher dominance = more fear (risk-off)
  • Google Trends (10%): Search volume for crypto terms

At first glance, this seems comprehensive. Six inputs! Weighted scoring! But look closer at the problems.

Problem 1: Heavy Price Dependency

Volatility (25%) and momentum (25%) are both derived directly from price. Social media (15%) is heavily correlated with price movements. So roughly 65% of the index is just a lagged reflection of recent price action.

When BTC drops 15%, Fear & Greed drops to "Extreme Fear." But it didn't predict the drop — it reacted to it. By the time you see "Extreme Fear," the market has already fallen. You're buying after the drop, which sometimes works (V-bottoms) and sometimes fails spectacularly (the drop continues another 40%).

Problem 2: No Directional Context

Fear & Greed = 25 could mean:

  • A healthy pullback in a bull market (great buy opportunity)
  • The start of a prolonged bear market (catching a falling knife)
  • A range-bound chop (sideways for months)

The same number maps to completely different optimal actions depending on the broader market context. Fear & Greed gives you sentiment intensity without regime context.

Problem 3: The "Extreme" Trap

The popular strategy: "Buy at Extreme Fear (<25), sell at Extreme Greed (>75)."

Let's test it. Looking at BTC from 2020-2026:

Signal Occurrences Win Rate (30d) Avg Return Max Drawdown Before Profit
Buy at F&G < 20 47 57% +8.2% -18.4%
Buy at F&G < 10 12 62% +14.1% -22.7%
Sell at F&G > 80 38 52% -2.1% +15.3% (kept running)

A few observations:

  1. Buying extreme fear has a 57% win rate — barely better than random. You'd need 60%+ to overcome fees and slippage.
  2. Selling extreme greed has a 52% win rate — essentially a coin flip. Bull markets can stay greedy for months.
  3. Maximum drawdown before profit is 18-22%. Most traders can't stomach that, even if it eventually works.
  4. The best signals (F&G < 10) are extremely rare — 12 times in 6 years. Not a tradeable system.

Problem 4: Regime-Dependent Performance

Here's where it gets interesting. The same F&G signal performs completely differently depending on the market regime:

Signal In Bull Regime In Bear Regime In Chop
F&G < 25 ("Buy the fear") 78% WR, +12% 38% WR, -6% 51% WR, +1%
F&G > 75 ("Sell the greed") 35% WR, -8% 71% WR, +9% 55% WR, +2%

"Buy the fear" works great in bull markets — those dips are genuine buying opportunities. But in bear markets, "buying the fear" is catching a falling knife with a 38% win rate.

"Sell the greed" works great in bear markets — those relief rallies are fake. But in bull markets, selling greed means selling winners too early.

The indicator isn't wrong. It's just incomplete without regime context.

What Works: Ensemble Signal Detection

The solution isn't to abandon Fear & Greed — it's to combine it with signals that cover its blind spots. An effective market classification system needs inputs across multiple uncorrelated dimensions:

1. Trend Signals (What is price doing?)

  • Price vs. 50-day and 200-day moving averages
  • Higher highs / lower lows structure
  • Moving average crossovers (golden/death cross)

2. Momentum Signals (How fast is it moving?)

  • RSI (14-day)
  • MACD histogram direction
  • Rate of change (ROC)

3. Volatility Signals (How uncertain is the market?)

  • Realized volatility vs. historical average
  • Bollinger Band width
  • VIX correlation (crypto increasingly tracks equity vol)

4. Sentiment Signals (What do people feel?)

  • Fear & Greed Index (here it contributes, not dominates)
  • Funding rates across exchanges (positive = leveraged longs, negative = shorts)
  • Liquidation imbalances (who's getting blown out?)

5. Macro Signals (What's the external environment?)

  • DXY (dollar strength — inverse correlation with crypto)
  • 10-year Treasury yield trends
  • S&P 500 correlation
  • Fed funds rate direction

6. Futures/Derivatives Signals (What are sophisticated traders doing?)

  • Open interest changes
  • Funding rate skew
  • Options put/call ratio
  • Liquidation heatmap

When you combine signals across all six dimensions, the individual failures of any single indicator get smoothed out by the others. This is the ensemble approach.

How Regime's Ensemble Works

Regime combines 13 individual signals across these six categories into a single regime classification with confidence scoring. Here's what makes it different from checking Fear & Greed:

Category-Capped Voting

No single category can dominate the final score. Even if all sentiment signals scream "bull," they're capped at 45% influence. This prevents the exact problem Fear & Greed has — price-action echo chambers.

# Single indicator: one-dimensional
curl https://api.alternative.me/fng/
# {"value": "23", "value_classification": "Extreme Fear"}
# Now what? Buy? Maybe. Maybe not.

# Ensemble: multi-dimensional
curl https://getregime.com/api/v1/market/regime
# {
#   "regime": "bear",
#   "confidence": 0.71,
#   "signals": {
#     "trend": -0.6,
#     "momentum": -0.3,
#     "volatility": 0.4,
#     "sentiment": -0.7,
#     "macro": -0.5,
#     "futures": -0.4
#   }
# }
# Fear is high, but trend and macro confirm: this is a bear.
# Don't buy the dip.
Enter fullscreen mode Exit fullscreen mode

Divergence Detection

The most valuable signals come from disagreements between categories. When Fear & Greed says "Extreme Fear" but trend signals are still bullish and macro is neutral, that divergence is a strong buy signal. When everything agrees, the confidence is high.

# Get divergence analysis
curl https://getregime.com/api/v1/intelligence/divergences \
  -H "Authorization: Bearer YOUR_KEY"
Enter fullscreen mode Exit fullscreen mode

The intelligence endpoint analyzes exactly these cross-category divergences and flags them.

Confidence as a Trading Filter

Instead of binary "buy/don't buy," regime confidence lets you scale:

import requests

def should_trade(min_confidence: float = 0.6):
    r = requests.get(
        "https://getregime.com/api/v1/market/regime",
        headers={"Authorization": "Bearer YOUR_KEY"}
    )
    data = r.json()
    regime = data["regime"]
    confidence = data["confidence"]

    if confidence < min_confidence:
        return "wait"  # Low confidence = mixed signals = sit out

    if regime == "bull":
        return "long"
    elif regime == "bear":
        return "short_or_cash"
    else:
        return "range_strategy"
Enter fullscreen mode Exit fullscreen mode

Low confidence (< 0.5) means the signals are fighting each other — exactly when you should reduce exposure, regardless of what any single indicator says.

Building Your Own Ensemble (The Hard Way)

If you want to build your own, here's the minimum viable setup:

import requests
import numpy as np

def diy_regime():
    """Minimum viable ensemble — 4 signals, no API key needed."""

    # 1. Fear & Greed
    fg = requests.get("https://api.alternative.me/fng/").json()
    fg_score = int(fg["data"][0]["value"])
    fg_signal = (fg_score - 50) / 50  # Normalize to [-1, 1]

    # 2. BTC vs 200 SMA (using CoinGecko daily close)
    btc = requests.get(
        "https://api.coingecko.com/api/v3/coins/bitcoin/market_chart",
        params={"vs_currency": "usd", "days": 200}
    ).json()
    prices = [p[1] for p in btc["prices"]]
    sma200 = np.mean(prices[-200:])
    current = prices[-1]
    trend_signal = (current - sma200) / sma200  # % above/below SMA
    trend_signal = np.clip(trend_signal, -1, 1)

    # 3. Volatility (high vol = unstable)
    returns = np.diff(np.log(prices[-30:]))
    vol = np.std(returns) * np.sqrt(365)
    vol_signal = -1 if vol > 0.8 else (0 if vol > 0.5 else 1)

    # 4. Momentum (14-day ROC)
    roc = (prices[-1] - prices[-15]) / prices[-15]
    mom_signal = np.clip(roc * 10, -1, 1)

    # Weighted vote
    score = (
        0.20 * fg_signal +
        0.35 * trend_signal +
        0.20 * vol_signal +
        0.25 * mom_signal
    )

    if score > 0.2:
        regime = "bull"
    elif score < -0.2:
        regime = "bear"
    else:
        regime = "chop"

    confidence = min(abs(score) / 0.6, 1.0)

    return regime, confidence
Enter fullscreen mode Exit fullscreen mode

This DIY version uses 4 signals and works reasonably well. But it's missing futures data, macro overlay, HMM confirmation, and category capping — all of which significantly improve accuracy. And you need to handle rate limiting, caching, error handling, and infrastructure.

Or you make one API call to getregime.com and get the answer immediately.

Practical Takeaways

  1. Fear & Greed is an input, not a strategy. Use it as one of many signals, weighted at ~15-20%.

  2. Context is everything. "Extreme Fear" in a bull market = buy. "Extreme Fear" in a bear market = stay away. You need regime context.

  3. Confidence matters more than classification. A high-confidence bear is very different from a low-confidence bear. Scale your actions accordingly.

  4. Divergences are the alpha. When sentiment disagrees with trend and macro, pay attention. These are the moments where single-indicator traders get destroyed and ensemble-aware traders profit.

  5. The simplest improvement: Add a single regime check before every trade. If your strategy says "buy" and the regime says "high-confidence bear," skip it. This one filter eliminates 40-60% of losing trades.

Get Started

Stop trading on vibes and single indicators. The data is available, the API is free to start, and the implementation takes 5 minutes:

# Check the current regime right now
curl https://getregime.com/api/v1/market/regime | python -m json.tool
Enter fullscreen mode Exit fullscreen mode
  • Free tier: 30 RPM, BTC/ETH/SOL — sign up
  • Pro: Full signal breakdown, divergence detection, intelligence briefs — $49/mo
  • SDK: npm install getregime for TypeScript bots
  • Quickstart: getregime.com/quickstart

Your trading bot deserves better than a single number.


Regime combines 13 signals across 9 data sources into a single regime classification. Try it free.


Try Regime Intelligence

Regime is a real-time crypto market regime detection API. One endpoint tells you if the market is bull, bear, or chop — so your bot only trades when conditions match your strategy.

Free API access → | See pricing → | API docs →

Top comments (0)