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: All FinBrain tracked markets including US equities, crypto, forex, and more
DetailDescription
MarketsAll FinBrain markets
Update FrequencyReal-time / multiple times daily
HistoryRolling recent articles
API Endpoint/v2/news/{symbol}
Score RangeInterpretationSignal
Above 0.5Strongly positiveBullish sentiment
0.1 to 0.5Mildly positiveSlightly bullish
-0.1 to 0.1NeutralNo strong signal
-0.5 to -0.1Mildly negativeSlightly bearish
Below -0.5Strongly negativeBearish 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 (index) 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}")