FINARA
METHOD

How Finara decides, including what it refuses to do

Market-signal apps have a bad reputation, mostly deserved: a confident verdict, no reasoning, and no record of whether the last one was right. Finara is the inverse. The verdict is the least interesting part — what matters is that you can open it, see what produced it, and check what its past verdicts were worth. This is the whole method, including the parts that do not work yet.

One number is a category error

A news effect plays out over days. A momentum effect plays out over months. Average them and you get a number with no horizon attached — it cannot be right or wrong, because you were never told when to check. So the engine outputs two scores per asset:

  • Tactical (days to weeks) — news tone, corporate events, short-term reaction statistics, positioning at extremes. Drives alerts and signal flips.
  • Strategic (months) — valuation, trend, medium-term positioning, gated by the macro regime. Drives allocation, and it is what the interface leads with.

They disagree often. That is information, not a defect: a company can be cheap, unloved, and still have bad news this week.

The five pillars

Each is measured from public data, scored to a comparable scale, and shown with its inputs on the asset page.

Valuation & fundamentals
MONTHS–YEARS

Earnings yield, price-to-sales and margins against the company's own history rather than a universal ‘cheap’ threshold, plus growth and profitability trend.

Mostly a brake: without it, a composite of news and momentum will happily recommend whatever is being hyped hardest this week.

Trend & momentum
WEEKS–MONTHS

Three-to-twelve-month returns, position against the 50- and 200-day averages, distance from the 52-week high — computed from raw price bars, not taken from a vendor.

Time-series momentum is among the most replicated effects there is, and the 200-day filter earns its place mainly by cutting drawdowns.

Events & revisions
DAYS–WEEKS

Earnings surprises and guidance, the direction of analyst estimate changes, and insider transactions from SEC Form 4 filings.

Post-earnings drift is one of the oldest surviving anomalies. Revisions are used, never target levels — targets are systematically optimistic.

News tone
DAYS

Per-headline sentiment with time decay, scored by a finance-specific lexicon rather than an API's opinion. An unmatched headline scores zero, never a guess.

Deterministic matters more than clever here: a stored signal has to stay reproducible a year later, and every score traces to the words that caused it.

Positioning
DAYS–MONTHS

Retail attention and bullish ratios, short interest, crypto Fear & Greed. Rule-based rather than linearly weighted.

Its sign flips: moderate crowd interest confirms a move, extreme crowd interest has historically preceded the reversal of one. A single weight cannot say ‘helpful until it isn't’.

Macro regime
THE GATE

Rate trend, yield-curve slope, credit spreads, VIX, crypto Fear & Greed — changing pillar weights rather than adding another score.

Momentum is downweighted in panic regimes because momentum crashes cluster there. It is also what makes bonds tractable: they barely respond to headlines or crowds.

Four things it refuses to do

Constraints did more for this engine than features did.

  • No chart patterns. Weak evidence, unfalsifiable definitions, and a doorway for a story to walk into the score.
  • No price targets as upside. Their revisions carry signal; their levels are close to noise.
  • Buzz never sets direction. Attention forecasts how much something will move, not which way — so it widens the uncertainty band and is structurally incapable of tilting a call bullish. A tenfold spike in mentions makes the engine less certain, not more excited.
  • No learned weights, yet. Weights stay hand-set and near-equal until there is enough stored history to test alternatives. Overfitting is how composite signals die, and it dies invisibly — the backtest looks wonderful right up to deployment.

The bug that taught me the most

For a while, the engine's highest-conviction calls were on the assets it knew least about. An index fund would score 100 while a mega-cap with complete data scored 78.

Not a coding error — a modelling one. The composite averaged over available pillars, so one strong reading passed through at full strength. The engine was systematically most extreme where it had the least evidence, which is precisely backwards, and invisible to anyone reading only the verdicts.

Now a score is pulled toward neutral in proportion to how much of its own evidence is missing, counting only the pillars that composite actually consumes:

SATURATED SCORES
50
Assets sitting at ≥95 or ≤5, across the tracked set.
MEAN STRATEGIC SCORE
61.957.5
The engine stopped being loudest where it knew least.

One subtlety I would have missed without stopping: some pillars are not missing, they are inapplicable. An ETF files no earnings; a commodity has no cash flows. Penalising an ETF for lacking earnings it can never have is punishing it for being an ETF. So the engine separates "no data this run" from "not a thing that exists for this asset class", and only the first costs confidence. Every call shows how many pillars it was actually based on, so a one-source call cannot wear the clothes of a five-source one.

The second bug, which looked like a feature

The trend pillar used to saturate at a 12.5% move over 90 days — modest. It could not distinguish an index up 17.6% at 13.4% volatility from a chip stock up 23.1% at 39.6% volatility. Both maxed out. Dividing the move by the asset's own realised volatility pushed saturation out to three sigma and freed the range where real trends live:

PINNED AT THE EXTREME
92
Of 18 tracked assets, readings stuck at |trend| ≥ 80.
SPREAD, TOP SEVEN
19 pts47 pts
Room to rank things that genuinely differ.

I had rejected that change six days earlier as "just re-weighting". That reasoning was wrong, and the correction generalises: the test for a scoring change is whether the current scale separates the things it is asked to separate — not whether you prefer the resulting order. Half the book was pinned. It separated nothing.

Where a weighted sum runs out

Some patterns are interactions, and a linear model flattens them, so they are named explicitly and fire with their evidence attached: high short interest plus a catalyst plus turning momentum; insider cluster buying into weak sentiment and improving trend; a large beat with raised guidance, which historically drifts for weeks.

The interesting one is divergence — the news is positive and the price did not move. The literature supports two opposite readings: the market disbelieves the news, or the move simply has not happened yet. Those imply opposite trades and the engine cannot yet tell which is right. So it does the only honest thing available: it dampens the strength of the news pillar without changing its direction, and the card states what was measured and stops. It stays direction-free until there is enough closed history to settle it.

Why every call is versioned

Every signal is stored with the engine version that produced it. When the scoring rules change, the version bumps and the track record for the new version starts at zero.

This is inconvenient and not negotiable: pooling calls across versions scores two different engines as one, and the resulting number describes nothing that exists. It means the honest answer to "does it work" is sometimes "the current version is days old, calls take ten trading days to close, ask again in a fortnight" — which is what the app says, instead of showing a flattering number from an engine it no longer runs.

What free data tiers actually cost

Everything runs on free plans, and that shaped the architecture more than any feature did. Rate limits are budgets: one provider allows sixty calls a minute, so the scoring job is paced at a symbol every three seconds rather than run in parallel.

Going faster does not produce missing data — it produces fabricated data, because a failed call falls back to a mock. That is the worst possible failure for a product like this, so two pillars are exempt from the fallback entirely: positioning and fundamentals return nothing rather than something invented. A missing pillar is honest. A fabricated one flows straight into a score.

The part I do not know

Sixty-one percent of current calls are buys. That could mean the market is broadly up — the regime layer does read risk-on — or it could mean the thresholds are skewed. Reasoning cannot distinguish those. Only closed calls can: if a rising market is the explanation, hit rates should hold up against a do-nothing baseline; if the thresholds are wrong, the buys are numerous and no better than doing nothing.

So the engine is frozen while that history accumulates. Every version bump restarts the clock — I bumped it four times in two days at one point, which postpones the answer indefinitely. An easy trap, when shipping feels like progress and waiting does not.

What it is, plainly

Finara gives one buy / hold / sell call per asset with the evidence behind it, tracks a portfolio you record yourself, and publishes how its past calls turned out. It is deterministic — same inputs, same score — rather than a language model with an opinion.

It never connects to a broker, places an order, or touches money. It is not financial advice and makes no personal recommendations: it shows market-wide readings and leaves the decision where it belongs. It is a phone app you add to your home screen, free during early access.

See it on a real asset
Free while in early access. No card.
Get free access
← Back to Finara