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.
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.
| Column | Type | Description |
|---|---|---|
| ticker | text · not null | Equity ticker the bucket is about (bare symbol; not normalized against a master list at this layer). |
| available_date | date · not null | PUBLIC-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. |
| source | text · not null | Which 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_count | bigint | Count 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_mentions | bigint | Un-deduplicated total ticker-mention volume that day (novel or not), including syndicated repeats. 0 on empty grid days. |
| avg_sentiment | double precision | Mean per-story FinBERT score across novel stories for this ticker/source/day (~[-1,1]). NULL (not 0) on days with zero novel stories. |
| pos_count | bigint | Count of novel stories this ticker/source/day labeled positive. 0 on empty grid days. |
| neg_count | bigint | Count of novel stories this ticker/source/day labeled negative. 0 on empty grid days. |
| neu_count | bigint | Count of novel stories this ticker/source/day labeled neutral. 0 on empty grid days. |
| buzz | numeric | article_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_index | double precision | Exponentially 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.