Obscura

News and Reddit Sentiment by Source

The daily ticker sentiment panel broken out by where the mentions came from - news articles versus finance discussion forums - with one row per ticker, day and source, carried forward across days with no mentions so a downstream join never sees a hole. Scored from a rolling news window rather than the full historical corpus.

news_sentiment_by_source - the dataset name to pass to the Obscura API.

Category Web attention Columns 11 Refresh Daily Entity key ticker Point-in-time available_date

What one row means

One (ticker, day, source) bucket of the sentiment panel - a read-only `news_sentiment_by_source` MATERIALIZED VIEW: a source-partitioned daily rollup of FinBERT-scored ticker mentions from Common Crawl News (source='news') or Reddit (source='reddit_wsb' | 'reddit_finance'), carried forward across gap days on a dense per-(ticker,source) daily grid so downstream joins never see holes. Rebuilt each sentiment_ingest run.

One row per One row per (ticker, available_date, source) - unique index (ticker, available_date, source). Densified onto a per-(ticker,source) daily calendar grid..

Point-in-time availability

Every Obscura dataset carries available_date: the calendar day the publisher made the row available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the same thing on every dataset in the catalog.

For news_sentiment_by_source: published: available_date = the public-availability day of the underlying stories (WARC-Date for CC-NEWS, created_utc for Reddit), carried through from news_sentiment_events. UTC calendar day.

Refresh cadence

Obscura refreshes news_sentiment_by_source daily - the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.

Schema - 11 columns

The full public column list for news_sentiment_by_source, with the meaning of every field. The same schema is served unauthenticated at https://api.obscura.trade/v1/catalog/news_sentiment_by_source.

ColumnTypeDescription
tickertext · not nullEquity ticker the bucket is about (bare symbol; not normalized against a master list at this layer).
available_datedate · not nullPUBLIC-availability day of the bucket on the dense per-(ticker,source) grid; equals the underlying stories' public day on active days, carried forward on gap days. The column consumers key on. UTC day.
sourcetext · not nullWhich pipeline the stories came from: 'news' (Common Crawl News), 'reddit_wsb', or 'reddit_finance'. Kept separate so news vs Reddit sentiment can be compared or weighted independently.
article_countbigintCount of NOVEL stories (distinct story_hash) for this ticker/source/day - novel = not seen for this ticker within the prior 91 days. 0 on empty grid days.
raw_mentionsbigintUn-deduplicated total ticker-mention volume that day (novel or not), including syndicated repeats. 0 on empty grid days.
avg_sentimentdouble precisionMean per-story FinBERT score across novel stories for this ticker/source/day (~[-1,1]). NULL (not 0) on days with zero novel stories.
pos_countbigintCount of novel stories this ticker/source/day labeled positive. 0 on empty grid days.
neg_countbigintCount of novel stories this ticker/source/day labeled negative. 0 on empty grid days.
neu_countbigintCount of novel stories this ticker/source/day labeled neutral. 0 on empty grid days.
buzznumericarticle_count over its trailing 30-day moving average for this (ticker, source) - today's novel volume as a multiple of its own recent baseline (>1 = above normal). NULL when the trailing average is non-positive.
sentiment_indexdouble precisionExponentially time-decayed sentiment (30-day half-life): the last known avg_sentiment forward-filled and decayed toward zero on quiet days; 0.0 before this (ticker, source)'s first-ever story.

Access news_sentiment_by_source

Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.

import obscura

client = obscura.Client("obs_live_…")

df = client.query(
    dataset="news_sentiment_by_source",
    symbols=["NVDA", "AAPL"],
    start="2024-01-01",
)

Create a free account Browse all 122 datasets

Frequently asked questions

What is in the news_sentiment_by_source dataset?

The daily ticker sentiment panel broken out by where the mentions came from - news articles versus finance discussion forums - with one row per ticker, day and source, carried forward across days with no mentions so a downstream join never sees a hole. Scored from a rolling news window rather than the full historical corpus. One (ticker, day, source) bucket of the sentiment panel - a read-only `news_sentiment_by_source` MATERIALIZED VIEW: a source-partitioned daily rollup of FinBERT-scored ticker mentions from Common Crawl News (source='news') or Reddit (source='reddit_wsb' | 'reddit_finance'), carried forward across gap days on a dense per-(ticker,source) daily grid so downstream joins never see holes. Rebuilt each sentiment_ingest run.

How do I avoid look-ahead bias with news_sentiment_by_source?

Filter on news_sentiment_by_source.available_date, the day the publisher made the row public. For this dataset that date is derived as follows - published: available_date = the public-availability day of the underlying stories (WARC-Date for CC-NEWS, created_utc for Reddit), carried through from news_sentiment_events. UTC calendar day. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.

In what formats can I get news_sentiment_by_source?

As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="news_sentiment_by_source". The column schema is public at https://api.obscura.trade/v1/catalog/news_sentiment_by_source.

Can I filter news_sentiment_by_source by company or symbol?

Yes. news_sentiment_by_source carries ticker, the column the API's symbols filter resolves against.

How often is news_sentiment_by_source updated?

Obscura refreshes news_sentiment_by_source on a daily schedule - that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.

Related datasets

GDELT Global News Event DatabaseGeopolitical and economic events extracted from worldwide news by the GDELT project, coded by actor, action and location… GitHub Repository Activity (Stars and Commits)Activity on tracked GitHub repositories: stars, forks and commit frequency, one row per repository per capture. For comp… Google Search Interest by TickerGoogle search interest over time for the full US equity universe by ticker, back two decades. Scores are 0-100 rescaled … Search Interest, DailyDaily Google search interest per US equity ticker as one continuous series, already rescaled so values are comparable ac… Hacker News Front Page StoriesFront-page stories from Hacker News, captured with their score, comment count and the moment they surfaced. One row per … Daily News Sentiment by TickerDaily sentiment for one ticker across every source combined. Mentions of the company in news articles and in finance dis… Government Open Data Portal ListingsDataset listings harvested from government open-data portals running CKAN: one row per published dataset, with its title… Telegram Crypto Channel MentionsDaily counts of crypto token mentions in public Telegram channels - how often each channel named each token, how many di…