Skip to content

News Sentiment Dataset

Access AI-powered sentiment analysis derived from financial news. FinBrain’s NLP models process thousands of articles daily and distill each ticker’s news flow into a single daily sentiment score, helping you gauge market mood and momentum.

The News Sentiment dataset provides:

  • Sentiment Score: Normalized numeric score from -1 (bearish) to +1 (bullish) — one score per ticker per trading day
  • Array-Based Data: Historical sentiment returned as an array of date/score objects
  • Pre-Open Delivery: Each day’s score is finalized before the US market opens and does not change intraday
  • Consistent History: The live pipeline and the historical backfill share identical scoring logic, so history matches what the live feed delivered — values are not restated
  • Historical Data: 5+ years of sentiment history (since 2021) for backtesting
  • Flexible Filtering: Filter by date range or limit the number of results
Coverage Detail
Universe 12,000+ US-listed stocks and ETFs (NYSE and NASDAQ), including every S&P 500 and Dow 30 constituent
Granularity One score per ticker per trading day
Update Frequency Daily, finalized before US market open

Score density follows news flow: thinly covered names carry sparser meaningful observations than large caps. Selected international markets have partial sentiment coverage; check ticker availability via the tickers endpoint.

Sentiment scores have 5+ years of historical data available for backtesting and trend analysis.

Range Interpretation
0.5 to 1.0 Strong bullish sentiment
0.2 to 0.5 Moderate bullish sentiment
-0.2 to 0.2 Neutral sentiment
-0.5 to -0.2 Moderate bearish sentiment
-1.0 to -0.5 Strong bearish sentiment

Sentiment scores are returned as numbers in the v2 API.

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
df = fb.sentiments.ticker("AAPL", as_dataframe=True)
print(df)

You can also filter by date range or limit results:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
# Get sentiment with date range
df = fb.sentiments.ticker("AAPL", date_from="2025-01-01", date_to="2025-06-30",
as_dataframe=True)
print(df.head(30))

For complete code examples in Python, JavaScript, C++, Rust, and cURL, see the API Reference.

Plot sentiment scores with the built-in SDK chart:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
# One-line interactive sentiment chart
fb.plot.sentiments("TSLA")
Sentiments Chart
TSLA news sentiment over time

Generate trading signals based on sentiment thresholds:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
def get_sentiment_signal(symbol):
"""Generate trading signal from sentiment score"""
df = fb.sentiments.ticker(symbol, as_dataframe=True)
if df.empty:
return "no_data"
latest_score = df["score"].iloc[0]
if latest_score > 0.5:
return "strong_buy"
elif latest_score > 0.2:
return "buy"
elif latest_score < -0.5:
return "strong_sell"
elif latest_score < -0.2:
return "sell"
else:
return "hold"
signal = get_sentiment_signal("TSLA")
print(f"Signal: {signal}")

Screen a watchlist for tickers with extreme sentiment:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
watchlist = ["AAPL", "GOOGL", "MSFT", "AMZN", "NVDA", "TSLA"]
bullish = []
bearish = []
for symbol in watchlist:
df = fb.sentiments.ticker(symbol, as_dataframe=True)
if not df.empty:
score = df["score"].iloc[0]
if score > 0.5:
bullish.append((symbol, score))
elif score < -0.5:
bearish.append((symbol, score))
print("Bullish tickers:", bullish)
print("Bearish tickers:", bearish)

Enhance prediction confidence when sentiment aligns with expected price movement:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
def analyze_ticker(symbol):
"""High conviction signals when predictions and sentiment align"""
# Get predictions
pred_result = fb.predictions.ticker(symbol, prediction_type="daily")
expected_short = pred_result["metadata"]["expectedShortTerm"]
# Get sentiment
sent_df = fb.sentiments.ticker(symbol, as_dataframe=True)
sent_score = sent_df["score"].iloc[0]
# Stronger signal when expected move and sentiment align
if expected_short > 0.5 and sent_score > 0.3:
return "high_conviction_buy"
elif expected_short < -0.5 and sent_score < -0.3:
return "high_conviction_sell"
else:
return "mixed_signals"
result = analyze_ticker("AAPL")
print(result)