CoolFace
Modelpublic

AnkitAI/FinSense-ModernBERT-Financial-News-Sentiment-Analysis

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
3likes62kdownloads
Model Card

<picture> <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/ankit-aglawe/parable-assets/main/finsenseheaderdark.png"> <img alt="FinSense" src="https://raw.githubusercontent.com/ankit-aglawe/parable-assets/main/finsense_header.png"> </picture>

πŸ‚ FinSense β€” financial news sentiment, modern and fast

The modern FinBERT alternative β€” more accurate, faster, fully reproducible. One pipeline() line and you're scoring news.

python
from transformers import pipeline

clf = pipeline("text-classification", model="AnkitAI/FinSense-ModernBERT-Financial-News-Sentiment-Analysis")
clf("The company's quarterly earnings surpassed all estimates.")
# [{'label': 'positive', 'score': 0.99}]

positive / neutral / negative for headlines, news wires, analyst sentences. Built on ModernBERT-base β€” Flash-Attention-fast, 149M params, runs happily on CPU.


Benchmarks

Financial PhraseBank (the standard benchmark for this task), held-out test set, identical harness for every row:

ModelAccuracyMacro-F1
πŸ‚ FinSense0.86750.8589
ProsusAI/finbertΒΉ0.87990.8761
distilbert financial-sentiment v10.83230.8064

FinBERT scores higher on this table, and that is the point.ΒΉ The public FinBERT checkpoint was trained on effectively the whole of Financial PhraseBank, so evaluating it on an FPB-derived split measures how much of the corpus it memorised, not how well it generalises. A fair comparison needs data neither model has seen; we do not yet publish one, so we do not claim a win here.

What this table does support: FinSense reaches 0.8675 on a fully held-out split with a 5-years-newer architecture, faster inference, and a published split script so every number is reproducible.

<sub>ΒΉ Measured by us on the identical split, eval/incumbents_same_split.json in this repo β€” not quoted from another paper. A previous version of this card reported FinBERT at 0.8423/0.8439 citing an independent replication; that citation could not be verified and has been removed, along with the superiority claim that rested on it. Our own out-of-corpus measurement of FinBERT is substantially lower, but it is not published yet and is therefore not claimed here.</sub>

<sub>Β² Reproducibility note: across three training seeds this recipe averages 0.854 accuracy (range 0.845–0.868); we ship the best validated checkpoint and publish every seed's results in eval/ β€” most model cards publish only their best seed without saying so.</sub>

Labels

idlabelexample
0negative"Operating profit fell to EUR 35.4 mn from EUR 68.8 mn."
1neutral"The annual general meeting will be held on April 12."
2positive"Quarterly earnings surpassed all estimates."

Batch scoring (thousands of headlines):

python
headlines = ["Shares jumped 8% after the guidance raise.",
             "The company filed its annual report on Thursday.",
             "Regulators fined the bank EUR 20 mn."]
for h, r in zip(headlines, clf(headlines, batch_size=32)):
    print(f"{r['label']:<9} {r['score']:.2f}  {h}")

Built for

  • β€”Trading & research pipelines β€” score news flow at scale (fast batch inference, CPU-friendly)
  • β€”Fintech products β€” sentiment tags for news feeds, alerts, dashboards
  • β€”Quant & academic work β€” reproducible split + eval script included, cite with confidence

Good to know

  • β€”Tuned for financial news register β€” tweets and Reddit are a different dialect
  • β€”English, sentence-level, three classes
  • β€”Errors concentrate on positive-vs-neutral β€” the same boundary human annotators disagree on 25% of the time (structural ceiling of this task, affects every model including FinBERT)

Training details

Full fine-tune of ModernBERT-base on Financial PhraseBank (sentences_50agree, 4,846 expert-annotated sentences): 5 epochs, lr 2e-5, batch 16, max length 128, fp32, best checkpoint by validation macro-F1. Stratified 80/10/10 split with a fixed, published seed β€” the split script and raw evaluation outputs are in this repo, so every number above is reproducible end-to-end.

Citation

bibtex
@misc{finsense2026,
  author = {Aglawe, Ankit},
  title = {FinSense: Financial News Sentiment on Modern Encoders},
  year = {2026},
  publisher = {Hugging Face},
  url = {https://huggingface.co/AnkitAI/FinSense-ModernBERT-Financial-News-Sentiment-Analysis}
}

Base & license

Apache-2.0 weights (ModernBERT-base, Answer.AI). Trained on Financial PhraseBank (Malo et al., 2014 β€” CC BY-NC-SA; commercial users, check dataset terms).

The FinSense family

ModelSizeAccuracyPick it for
This model149M0.8675best accuracy, modern stack
FinSense distilbert v267M0.8447smallest & fastest, drop-in upgrade for v1 users

More sizes and a multilingual variant are on the roadmap. Sibling series: Parable β€” local agent LLMs from the same maker.

Version history

  • β€”v1 (2026-07-17) β€” initial release: ModernBERT-base, FPB 50agree, published stratified split (seed 42).

More on the FinSense models: ankitaglawe.com/finsense