Bloomberg Terminal costs $24,240/year. I built something that does the sentiment analysis part for $0.02 per article. It's not Bloomberg. It doesn't do terminal access, charting, or messaging. But if all you need is "what's the market saying about NVDA right now?", it gets you 90% of the way for 0.001% of the cost.
Why I Built This
I was building a trading signal pipeline and needed financial sentiment data. My options were:
- Pay Bloomberg $24K/year (lol no)
- Use Finnhub's sentiment endpoint ($500/year, but the sentiment is basic. Just positive/negative with no confidence score)
- Scrape it myself
I went with option 3. Spent a few weeks scraping Yahoo Finance, Google News, and SEC EDGAR, wiring up VADER for quick sentiment, then an LLM for the headlines VADER gets wrong.
Then I realized other people probably have the same problem, packaged it as an Apify actor, and put it on the store.
The Part Where VADER Embarrassed Me
My first version only had VADER (the rule-based sentiment model). I was feeling good about it until I ran it on this headline:
"Nvidia Stock Drops. Not Even Elon Musk Can Give Shares a Boost."
VADER scored it bullish +0.83. It saw "Boost" and "Give" and decided this was positive news.
The stock was down 3.28% that day.
That's when I added the LLM model as a second option. The LLM correctly scores this bearish -0.95 because it actually reads the sentence instead of counting words.
VADER is still useful though. It's instant (~1ms), deterministic, and costs $0.02/article. For scanning 200 articles to find the 10 that matter, it's fine. But for making a decision about a specific stock? Use the LLM at $0.05/article. The extra $0.03 is worth not misreading a bearish headline as bullish.
What It Actually Does
You give it tickers. It scrapes four sources:
- Yahoo Finance RSS: per-ticker news, usually 10-30 articles per ticker
- Google News RSS: aggregated across 80,000+ publishers, catches stuff Yahoo misses
- SEC EDGAR: 8-K, 10-K, 10-Q filings. This is the one most people forget. Material events show up here before they hit the news.
- AI Search: fills gaps the RSS feeds miss ($0.03/search, optional)
Each article gets a sentiment score, a confidence level, and a composite score that factors in how trustworthy the source is. A Reuters article saying "AAPL beat earnings" matters more than some random Substack saying "AAPL TO THE MOON 🚀🚀🚀", so the composite score weights accordingly (Reuters = 0.90 credibility, random blog = 0.40).
You can also tack on live market data per ticker (current price, market cap, P/E, short interest, next earnings date). Costs an extra $0.01/ticker.
The Code
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("scionic_dev/financial-news-sentiment").call(
run_input={
"tickers": ["AAPL", "NVDA", "TSLA"],
"sources": ["google_news", "sec_edgar"],
"maxArticles": 20,
"sentimentModel": "vader",
"enrichWithMarketData": True,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
price = item.get("current_price", "N/A")
print(f"{item['sentiment_label']:>7s} {item['sentiment_score']:+.2f} ${price} | {item['title'][:60]}")
Output:
bullish +0.85 $247.99 | Apple Inc. Stock Position Raised by Groupama Asset Man
bearish -0.62 $172.70 | Nvidia faces headwinds as China export restrictions ti
bullish +0.45 $178.22 | Tesla Deliveries Beat Estimates for Q1 2026
JS version if that's your thing:
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('scionic_dev/financial-news-sentiment').call({
tickers: ['AAPL', 'NVDA'],
sources: ['google_news', 'yahoo_finance'],
maxArticles: 15,
sentimentModel: 'llm',
enrichWithMarketData: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(i => console.log(`${i.sentiment_label} ${i.composite_score.toFixed(3)} | ${i.title}`));
What Each Record Looks Like
{
"title": "Top Analysts See Solid Upside in Nvidia Stock",
"source": "google_news",
"sentiment_label": "bullish",
"sentiment_score": 0.850,
"sentiment_confidence": 0.95,
"composite_score": 0.547,
"tickers": ["NVDA"],
"companies": ["Nvidia"],
"sectors": ["Technology"],
"current_price": 172.70,
"price_change_pct": -3.28,
"market_cap": 4197473583104,
"pe_ratio": 35.24,
"short_ratio": 1.32,
"earnings_date": "2026-05-20",
"published_at": "2026-03-21T07:10:39Z"
}
Sentiment, price, and fundamentals in one object. Pipe it into whatever you're building.
Things That Tripped Me Up
Google News RSS is weirdly inconsistent. Some days you get 50 articles for AAPL, other days you get 8. I still don't know why. The workaround is combining it with Yahoo Finance RSS so you always have a baseline. If anyone knows why Google News RSS volume fluctuates like this, I'm genuinely curious.
SEC EDGAR rate limits are strict. 10 requests/second, and they mean it. I got my IP temporarily blocked during testing because I was hammering it during an earnings dump. Added proper rate limiting and a polite User-Agent header. The SEC actually checks this.
VADER's financial vocabulary is incomplete. Words like "downgrade", "restructuring", and "dilution" should be negative in a financial context but VADER treats them as neutral. I added a custom financial lexicon on top of the base VADER scores. It helps, but the LLM model is just fundamentally better at financial text. VADER is a word counter with attitude. It doesn't understand sentences.
Deduplication was harder than expected. The same Reuters article shows up on Yahoo Finance, Google News, AND in a dozen syndication partners. Without dedup, you'd get the same article 5 times, each counting toward your sentiment average and skewing it. I hash title + source + ticker to catch dupes. Not perfect but catches 95%+ of them.
What It Costs
Quick version: a typical run analyzing 20 articles about one stock with VADER costs about $0.41. With the LLM model and market data, closer to $1.60.
For context:
- Bloomberg: $24,240/year for everything
- Finnhub Pro: $6,000/year for their sentiment API
- This thing at $0.02/article with daily monitoring across 5 tickers: ~$400/year
The comparison to Bloomberg is unfair. Bloomberg does a thousand things I don't. But if sentiment data is all you need, you don't need Bloomberg.
What I'd Build Next
Webhook alerts are the obvious one. Get a push notification when sentiment on a watched ticker drops below some threshold. Right now you have to poll by scheduling runs, which works but isn't real-time.
Historical sentiment tracking would be interesting too. Run it daily, store the results, plot sentiment over time against price. I suspect there's a leading indicator buried in there but I haven't done the analysis yet.
If anyone's working with crypto and wants the same thing for that market (CoinDesk, The Block, on-chain data as sources), let me know. Same architecture, just different scrapers.
Try It
Runs on Apify. Free tier gives you $5/month in credits, enough for about 250 articles with VADER.
Not financial advice. The sentiment model is wrong sometimes (see the Nvidia example above). Do your own research. But as a data input into your own analysis, it beats paying $24K or scraping everything yourself.
What do you use for financial sentiment data? I'm curious what else is out there that I might have missed.
Top comments (2)
Nice I'll try it out and come with a review
Great product and insight