Instructions to use Kenpache/finbert-multilingual-v2-large with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Kenpache/finbert-multilingual-v2-large with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-classification", model="Kenpache/finbert-multilingual-v2-large")# Load model directly from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("Kenpache/finbert-multilingual-v2-large") model = AutoModelForSequenceClassification.from_pretrained("Kenpache/finbert-multilingual-v2-large", device_map="auto") - Notebooks
- Google Colab
- Kaggle
Financial Sentiment, 7 Languages — Large
Sentiment of financial news, in seven languages, from one model. Feed it a headline
or a sentence in English, Chinese, Japanese, Spanish, German, French or Arabic — get
back negative, neutral or positive.
from transformers import pipeline
clf = pipeline("text-classification", model="Kenpache/finbert-multilingual-v2-large")
clf("The company reported record quarterly earnings, driven by strong demand.")
# [{'label': 'positive', 'score': 0.9445}]
clf("Die Aktie verlor nach der Gewinnwarnung deutlich an Wert.")
# [{'label': 'negative', 'score': 0.9435}]
clf("该公司宣布大规模裁员计划,股价应声下跌。")
# [{'label': 'negative', 'score': 0.9436}]
| Task | Financial sentiment, 3 classes (negative / neutral / positive) |
| Languages | 7 — en · zh · ja · es · de · fr · ar |
| Accuracy | 88.9% |
| Parameters | 560M (fp32, 2.1 GB) |
| Backbone | FacebookAI/xlm-roberta-large |
One model covers all seven languages — no per-language checkpoints, no translation step, no language ID in front of it. Mixed-language pipelines just work.
Smaller sibling:
Kenpache/finbert-multilingual-v2
— 307M parameters, 87.2% on the same evaluation set. Take this one for accuracy, that
one for footprint.
Accuracy
Measured on a held-out test set of 4,993 financial news sentences across the seven
languages, published as
Kenpache/financial-sentiment-eval-7lang.
| Metric | Score |
|---|---|
| Accuracy | 0.8892 |
| F1 (weighted) | 0.8890 |
Per language
This is the table to read before adopting the model — it tells you whether your language is covered properly, not just the average.
| Language | Items | Accuracy | |
|---|---|---|---|
| Spanish | es |
905 | 0.9193 |
| German | de |
650 | 0.9062 |
| Chinese | zh |
1,023 | 0.8974 |
| Arabic | ar |
73 | 0.8904 |
| Japanese | ja |
1,063 | 0.8852 |
| English | en |
780 | 0.8615 |
| French | fr |
499 | 0.8477 |
Every one of the seven languages is above 84%, and English is not at the top — Spanish and German are. That matters more than it looks: most "multilingual" financial models are English models with a multilingual tokenizer, and they collapse on CJK and right-to-left text. This one holds its level across scripts — Latin, Chinese, Japanese and Arabic alike.
Arabic is measured on 73 items, so treat its number as indicative rather than precise.
Reproducing these numbers
The evaluation set is public, and so is the protocol — max_length=192, fp32, raw text
with no normalisation:
import pandas as pd, torch
from datasets import load_dataset
from transformers import AutoModelForSequenceClassification, AutoTokenizer
ds = load_dataset("Kenpache/financial-sentiment-eval-7lang", split="test").to_pandas()
REPO = "Kenpache/finbert-multilingual-v2-large"
tok = AutoTokenizer.from_pretrained(REPO)
model = AutoModelForSequenceClassification.from_pretrained(REPO).eval()
preds = []
with torch.no_grad():
for i in range(0, len(ds), 64):
enc = tok(ds.sentence[i:i + 64].tolist(), return_tensors="pt",
padding=True, truncation=True, max_length=192)
preds += [model.config.id2label[j].lower()
for j in model(**enc).logits.argmax(-1).tolist()]
print((pd.Series(preds) == ds.label).mean()) # 0.8892
Per class
| Class | Precision | Recall | F1 | Support |
|---|---|---|---|---|
| negative | 0.8820 | 0.9135 | 0.8975 | 1,260 |
| neutral | 0.9049 | 0.8508 | 0.8770 | 2,158 |
| positive | 0.8758 | 0.9225 | 0.8986 | 1,575 |
No class collapse: the three F1 scores sit within 2.2 points of each other, and neutral
— the majority class, and the usual dumping ground for models that learned to hedge — has
the lowest F1 of the three rather than the highest.
Polarity errors are rare. Across all 4,993 items, negative is called positive 14
times and positive is called negative 24 times — 38 cases, 0.8% of the set.
Practically all remaining error sits on the boundary with neutral. The model may fail to
register a weak signal; it very seldom reverses one.
Comparison on the English subset
Both models were run on the English portion — 780 items — of
Kenpache/financial-sentiment-eval-7lang,
under one identical protocol: max_length=192, fp32, raw text, argmax over the three
classes, no tuning or threshold fitting for either model.
| Model | Accuracy | F1 (weighted) |
|---|---|---|
| This model | 0.8615 | 0.8616 |
ProsusAI/finbert |
0.7218 | 0.7224 |
Two things belong next to those numbers. ProsusAI/finbert is an English-only model, so
the comparison is confined to the English subset — which is, as the table above shows,
this model's weakest language of the seven. And it was trained under a different
annotation convention: most of its errors on this set are neutral items assigned a
direction, so part of the gap reflects differing label conventions rather than capability.
These figures describe behaviour on this evaluation set only, under the protocol stated above. They are not a general claim about either model.
Usage
pip install transformers torch
Pipeline
from transformers import pipeline
clf = pipeline("text-classification", model="Kenpache/finbert-multilingual-v2-large")
clf("Les bénéfices du groupe ont augmenté de 15% au premier trimestre.")
# [{'label': 'positive', 'score': 0.9443}]
Batch a whole list in one call:
texts = ["株価は決算発表後に急落した。",
"La compañía anunció un despido masivo y sus acciones se desplomaron.",
"Quarterly revenue beat analyst expectations by a wide margin."]
clf(texts, batch_size=32)
# [{'label': 'negative', 'score': 0.9458},
# {'label': 'negative', 'score': 0.9462},
# {'label': 'positive', 'score': 0.9467}]
Add top_k=None to get the full probability distribution over all three classes instead
of the winner only — useful when you want to threshold on confidence rather than take
the argmax.
Direct loading
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
REPO = "Kenpache/finbert-multilingual-v2-large"
tokenizer = AutoTokenizer.from_pretrained(REPO)
model = AutoModelForSequenceClassification.from_pretrained(REPO).eval()
text = "Der Umsatz blieb im Vergleich zum Vorjahr unverändert."
enc = tokenizer(text, return_tensors="pt", truncation=True, max_length=192)
with torch.no_grad():
probs = torch.softmax(model(**enc).logits, dim=-1)[0]
for i, p in enumerate(probs):
print(f"{model.config.id2label[i]:8} {p:.4f}")
# negative 0.0234
# neutral 0.9491
# positive 0.0275
On GPU
clf = pipeline("text-classification", model=REPO, device=0) # CUDA
clf = pipeline("text-classification", model=REPO, device="mps") # Apple Silicon
CUDA, Apple Silicon and plain CPU all work. At 560M parameters inference is comfortable on a laptop, though noticeably heavier than the 307M sibling.
Use max_length=192 to reproduce the numbers above. The hard ceiling of the backbone
is 512 tokens — enough for headlines and single sentences, which is what this model is
for, but do not expect it to take long documents.
Limitations
- Sentence-level, not document-level. The model is built for headlines and single sentences. Feeding a full article gives you one label for the whole thing, which is rarely what you want — split it first. The 512-token ceiling enforces this anyway.
- Financial sentiment is not general sentiment. "Shares fell 3% on the news" is negative in a market sense with no emotional language at all. On product reviews or social media this model is the wrong tool.
neutralis a convention, not a fact. The boundary between neutral and mildly positive/negative is where human annotators disagree most, and the model inherits that ambiguity. If a decision hinges on that boundary, use the probabilities and a threshold instead of the argmax.- Arabic coverage is thin in evaluation (73 items). The other six languages are measured on 499–1,063 items each.
- Seven languages. The backbone is pretrained on a hundred, but this classifier was tuned for these seven. Other languages will produce output, but it is untested.
- Not investment advice. The output is a sentiment label on a text, not a signal to trade on.
Intended use
Good fits:
- tagging multilingual financial news feeds in real time
- market-sentiment dashboards and indices across regions
- pre-screening research corpora before human analysis
- backtesting sentiment-based features on multilingual sources
Poor fits: general-purpose sentiment, long documents, languages outside the seven, anything where the neutral boundary carries legal or financial weight on its own.
Files
| File | What it is |
|---|---|
model.safetensors |
weights, fp32, 2.1 GB |
config.json |
XLM-RoBERTa config with id2label (negative / neutral / positive) |
tokenizer.json, sentencepiece.bpe.model, tokenizer_config.json |
tokenizer |
License
Apache 2.0.
Built on FacebookAI/xlm-roberta-large,
which is MIT-licensed; that attribution is preserved here.
Citation
@misc{finbert_multilingual_v2_large,
title = {Financial Sentiment, 7 Languages — Large},
author = {Kenpache},
year = {2026},
url = {https://huggingface.co/Kenpache/finbert-multilingual-v2-large}
}
- Downloads last month
- 10
Model tree for Kenpache/finbert-multilingual-v2-large
Base model
FacebookAI/xlm-roberta-large