5 min read · 2026-08-28
A reading is worth nothing if it cannot say how it was taken.
There is a particular kind of financial tool that shows you a number and expects you to be impressed. It says BUY, or it gives a confidence of 87%, and it does not tell you why. You are supposed to trust it because the interface looks expensive.
I find this genuinely irritating, and not only because it is often wrong. It is because a number you cannot argue with is useless even when it is right. If I cannot see the reasoning, I cannot tell the difference between a good call and a lucky one, and I cannot learn anything from either.
The Pulse Engine is my attempt at the other thing. It still prints one score, from minus ten to plus ten. But every score can be taken apart.
The system reads two independent things on every cycle.
The first is price. Thirty days of open, high, low, close and volume from Yahoo Finance, which gives the ordinary technical picture: which way the thing is moving, how fast, and whether it looks stretched.
The second is news. Up to three hundred articles from twelve chosen RSS feeds, fetched at the same time rather than one after another.
The important design decision is that these are never quietly blended into one mush. They are measured separately and combined at a step you can look at, because when the two disagree that disagreement is information. Prices rising while coverage turns negative is a different situation from both moving together, and a system that averages them away has thrown out the interesting part.
News is messier than price, in two specific ways.
The same story gets filed by six different outlets. If you count all six you have not found six pieces of evidence, you have found one story shouted six times. The engine compares articles against each other using Jaccard similarity, which is a simple measure of how much two pieces of text overlap, and counts near-identical stories once.
The second problem is that general-purpose sentiment tools do not understand finance. The engine uses VADER, which scores text as positive or negative, but VADER on its own reads a phrase like "bond yields plunge" as bad news because "plunge" is a bad word in ordinary English. In markets it is not necessarily bad at all. So a financial word list is injected into it, teaching it what these words mean in this context.
This is worth stating plainly: this is a word-list approach, not a language model. It is fast, cheap, and you can audit exactly why it scored something the way it did. It will also miss sarcasm and unusual phrasing. That is a real limitation and it is written on the project page rather than hidden.
The final score is built from six parts: trend direction, price momentum, RSI, news sentiment, trend strength, and the wider market or sector context.
Each asset class weights those six differently, because a commodity and a technology stock do not react to the same signals in the same proportion, and pretending they do is how you get a system that works on one thing and quietly fails on another.
Here is the part that took the longest. Every signal carries a built explanation naming which of the six components moved it and by how much. Not a general description of the method, an explanation of that specific reading on that specific day.
It changes what the tool is for. Instead of "the system says buy", you get "this is positive mainly because trend strength and momentum are high, while sentiment is slightly negative". Now you can disagree with it. You can decide the sentiment reading is more important than the model thinks. The tool has stopped being an oracle and started being a colleague who shows their work.
Eight categories of event are also detected separately, so that something like a central bank decision does not disappear into an average of general news.
Explaining a single reading is not enough. A system can explain itself clearly and still be wrong every time.
So the engine keeps its history. Snapshots are written to compressed files on disk, kept in full detail for seven days, in reduced form for thirty, and deleted at sixty. A backtester then measures hit rate by signal strength, which answers the question that actually matters: when this thing says strongly positive, what usually happens next?
That number is allowed to be disappointing. The point of building it is that the platform can be checked against its own record rather than believed because of its interface.
One rule sat underneath all of this: it had to run without paid infrastructure. No server to rent, no database to provision, no API key that costs money.
That constraint explains most of the architecture. The history is files on disk rather than a hosted database, because a database is a subscription and a subscription is a thing that can lapse. Twenty-four assets are rescanned every thirty minutes by a background thread inside the application itself rather than by a scheduling service.
And it is not financial advice. It produces a reading and its reasoning. The decision stays with the person reading it, which is the entire reason the reasoning has to be visible.
An explainable market analysis system that combines technical indicators and news sentiment to generate clear buy/sell signals with reasoning through an interactive dashboard
has a charter of its own