Skip to content

News Dataset

Access real-time financial news articles with AI-powered sentiment analysis for any stock ticker. FinBrain’s news dataset aggregates headlines from major financial publications and scores each article for market sentiment, giving you a comprehensive view of the news landscape around your positions.

The News dataset provides:

  • News Article Headlines: Full headline text for each article with publication dates
  • Source Attribution: Publication name for every article (e.g., Reuters, Bloomberg, Yahoo Finance)
  • Direct Article URLs: Links to the original source article
  • AI Sentiment Scores: Normalized score from -1 (bearish) to +1 (bullish), nullable when unavailable
  • Coverage: US-listed stocks and ETFs, with partial coverage of selected international markets
Detail Description
Markets US equities & ETFs (primary); partial international coverage
Update Frequency Real-time / multiple times daily
History Rolling recent articles
API Endpoint /v2/news/{symbol}
Score Range Interpretation Signal
Above 0.5 Strongly positive Bullish sentiment
0.1 to 0.5 Mildly positive Slightly bullish
-0.1 to 0.1 Neutral No strong signal
-0.5 to -0.1 Mildly negative Slightly bearish
Below -0.5 Strongly negative Bearish sentiment

Note: The sentiment field can be null when no score is available for an article. Always handle this case in your code.

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

For complete endpoint details, parameters, and response schema, see the News API Reference.

Surface only the most positive or negative news articles for a ticker:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
df = fb.news.ticker("TSLA", as_dataframe=True)
# Filter articles with strong sentiment
bullish_news = df[df["sentiment"].notna() & (df["sentiment"] > 0.5)]
bearish_news = df[df["sentiment"].notna() & (df["sentiment"] < -0.5)]
print(f"Strongly bullish articles: {len(bullish_news)}")
for _, a in bullish_news.iterrows():
print(f" [{a['sentiment']:.2f}] {a['headline']}")
print(f"\nStrongly bearish articles: {len(bearish_news)}")
for _, a in bearish_news.iterrows():
print(f" [{a['sentiment']:.2f}] {a['headline']}")

Compute an average sentiment score per day from individual article scores:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
df = fb.news.ticker("NVDA", as_dataframe=True)
# Filter out articles without sentiment scores
scored = df[df["sentiment"].notna()].copy()
# Group by date and compute daily average
daily_avg = scored.groupby(scored.index).agg(
avg_sentiment=("sentiment", "mean"),
article_count=("sentiment", "count")
)
for date, row in daily_avg.sort_index().iterrows():
print(f"{date}: avg sentiment = {row['avg_sentiment']:.3f} ({int(row['article_count'])} articles)")

Monitor how news volume and sentiment shift over time for early signals:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
df = fb.news.ticker("AMZN", as_dataframe=True)
# Compute daily volume and average sentiment
daily = df.groupby(df.index).agg(
count=("headline", "count"),
avg_sentiment=("sentiment", "mean")
)
for date, row in daily.sort_index().iterrows():
sent_str = f"{row['avg_sentiment']:.3f}" if row["avg_sentiment"] == row["avg_sentiment"] else "N/A"
print(f"{date}: {int(row['count'])} articles, avg sentiment: {sent_str}")