Skip to page content
SAVRN
Search Plan a project

Open-weight model · Text classification

finbert-crypto-stock-news-sentiment

by David Kurniawan HuangYiYang/finbert-crypto-stock-news-sentiment

finbert-crypto-stock-news-sentiment is an open-weight model for text classification from David Kurniawan, released under Apache License 2.0. It has 110M parameters and a 512-token context. At 16-bit it needs about 0.3 GB of GPU memory, which fits on 1x MI300X from $1.85 an hour, at the lowest prices in the SAVRN Index.

Classifies a news headline as positive, negative or neutral for holders of the asset it is filed under. Fine-tuned from ProsusAI/finbert on headlines filed under Bitcoin, gold (the GLD fund) and US stocks (the SPY fund). It describes the tone of the news.

Parameters110M
Context512
Weights438.7 MB
Licenseapache-2.0
AccessOpen weights
Monthly Downloads—

Runs On

What it takes to serve finbert-crypto-stock-news-sentiment (110M parameters): the memory its weights need at each precision, and the cheapest way to rent enough data-center GPUs to hold them.

PrecisionWeightsMemory neededCheapest setupPer hourAlso fits
16-bit 0.2 GB 0.3 GB 1x MI300X (192 GB)
Vultr
$1.85 1x H100 $1.99 · 1x MI325X $2.00
8-bit 0.1 GB 0.1 GB 1x MI300X (192 GB)
Vultr
$1.85 1x H100 $1.99 · 1x MI325X $2.00
4-bit 0.1 GB 0.1 GB 1x MI300X (192 GB)
Vultr
$1.85 1x H100 $1.99 · 1x MI325X $2.00

Memory is the weights at that precision plus 20% for the runtime and a short context; a long context needs more. Prices are the lowest on-demand hourly rates in the SAVRN Index, read Oct 18, 2026.

finbert-crypto-stock-news-sentiment on every accelerator the SAVRN Index prices, at every precision

Model Card

By David Kurniawan, published under apache-2.0, revision 15d274d4cf4c.

Classifies a news headline as positive, negative or neutral for holders of the asset it is filed under. Fine-tuned from ProsusAI/finbert on headlines filed under Bitcoin, gold (the GLD fund) and US stocks (the SPY fund). It describes the tone of the news. It does not forecast prices. Scored once on a held-out test set of 854 headlines from 2026-04-01 to 2026-10-14, after every choice had been made on validation data. The test set holds more positive and negative headlines than the news feed does, so the figures are shown as drawn and also re-weighted to the feed's natural mix. McNemar's exact test against the base model: p = 9e-77. On headlines where both the label and the prediction are…

Read David Kurniawan's full model card

FinBERT for crypto and stock news sentiment

Classifies a news headline as positive, negative or neutral for holders of the asset it is filed under. Fine-tuned from ProsusAI/finbert on headlines filed under Bitcoin, gold (the GLD fund) and US stocks (the SPY fund). Internal version name: finbert-tone-2.

It describes the tone of the news. It does not forecast prices.

Results

Scored once on a held-out test set of 854 headlines from 2026-04-01 to 2026-10-14, after every choice had been made on validation data. The test set holds more positive and negative headlines than the news feed does, so the figures are shown as drawn and also re-weighted to the feed's natural mix.

Accuracy Macro-F1
This model 84.0% 0.826
This model, re-weighted to the feed's mix 93.4% 0.841
Base ProsusAI/finbert, no fine-tuning 44.1% 0.446

McNemar's exact test against the base model: p = 9e-77.

Class Precision Recall F1 Headlines
positive 68.2% 95.5% 0.796 155
negative 71.8% 95.4% 0.819 152
neutral 97.5% 77.5% 0.864 547
Asset Headlines Accuracy Macro-F1
BTC/USD 427 83.6% 0.840
SPY 427 84.3% 0.760

On headlines where both the label and the prediction are positive or negative, the model picks the same direction 99.0% of the time (296 headlines).

An earlier natural-mix test set of 826 headlines, already used to evaluate the previous version, gives accuracy 87.3% and macro-F1 0.814; because it was reused it is a secondary figure.

Training

  • Method: LoRA r=16, lr=0.0001 with 10% linear warm-up, class-weighted cross-entropy, merged.
  • Head: dense 768->256, ReLU, dropout 0.3, dense 256->3; set model.classifier to this before loading.
  • Input: the headline, at most 128 tokens.
  • Training window: 2015-01-02 to 2026-03-24; test window 2026-04-01 to 2026-10-14. Splits are in time order, never shuffled.
  • Labels: written by language-model labellers (claude sonnet subagent, rubric v2, claude subagent, rubric v2) under a fixed written rubric, with agreement checks. The headlines themselves are not redistributed.
  • Calibration: divide the logits by a temperature of 1.5 before the softmax.

Usage

The classifier head has two layers, which from_pretrained does not build by itself. Loaded the usual way, the head would be new random weights and the scores meaningless, so put the saved head back after loading:

import torch
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
from transformers import AutoModelForSequenceClassification, AutoTokenizer

repo = "HuangYiYang/finbert-crypto-stock-news-sentiment"
tokenizer = AutoTokenizer.from_pretrained(repo)
model = AutoModelForSequenceClassification.from_pretrained(repo)

state = load_file(hf_hub_download(repo, "model.safetensors"))
hidden, width = state["classifier.0.weight"].shape
head = torch.nn.Sequential(
    torch.nn.Linear(width, hidden), torch.nn.ReLU(), torch.nn.Dropout(0.0),
    torch.nn.Linear(hidden, state["classifier.3.weight"].shape[0]),
)
prefix = "classifier."
head_state = {k.removeprefix(prefix): v for k, v in state.items() if k.startswith(prefix)}
head.load_state_dict(head_state)
model.classifier = head
model.eval()

text = "Bitcoin plunges 15% as exchange hack wipes out billions"
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=128)
with torch.no_grad():
    probs = (model(**inputs).logits / 1.5).softmax(-1)[0]
print({model.config.id2label[i]: round(float(p), 3) for i, p in enumerate(probs)})

Limitations

  • Trained on three markets: Bitcoin, gold and US stocks. The test set covers Bitcoin and US stocks only: after removing headlines too similar to ones already labelled, gold had almost no headlines left in the test window, so gold has no separate test figure. Other assets and other kinds of text (articles, social posts) are untested.
  • Much of the news filed under the gold fund is general market commentary, so it is labelled for the market it describes, not for gold.
  • The base FinBERT was fine-tuned on Financial PhraseBank: full sentences about companies, labelled for investors. This model's inputs are short headlines, including crypto news and economic-data templates, labelled for holders of the asset they are filed under. The gap between the two is why the base model scores low here.
  • English headlines only.
  • Labels come from language-model labellers under a rubric, not from human annotators.
  • The tone of a headline says nothing about where the price goes next.

Paper

A paper describing this model is in preparation; the arXiv link will be added here. Code: https://github.com/LouSens/RADAR.

Configuration

Architecture
BertForSequenceClassification
Context length (tokens)
512
Layers
12
Hidden size
768
Feed-forward size
3,072
Attention heads
12
Vocabulary size
30,522
Model type
bert

Identity and Version

Repository
HuangYiYang/finbert-crypto-stock-news-sentiment
Publisher
David Kurniawan
Task
Text classification
Modality
Text
Library
transformers
Parameters
110M parameters
Languages
en
Revision
15d274d4cf4c5293a429d78f2f48138d33c74168
First published
2026-10-16
Last updated
2026-10-16

Files and Weights

7 files, 439.5 MB in total. The weights are 1 file totalling 438.7 MB in safetensors.

Weights1 file · 438.7 MB
Configuration2 files · 3.7 KB
Tokenizer2 files · 712.0 KB
Documentation1 file · 5.2 KB
Repository1 file · 1.5 KB
Every file
FileTypeSizeSHA-256
model.safetensorsWeights438.7 MB a5d8477640ce
config.jsonConfiguration964 B —
model_card.jsonConfiguration2.7 KB —
README.mdDocumentation5.2 KB —
.gitattributesRepository1.5 KB —
tokenizer.jsonTokenizer711.6 KB —
tokenizer_config.jsonTokenizer366 B —

License and Download

License
apache-2.0
Access
Open weights, no gate
Download size
438.7 MB
Download from David Kurniawan

Released by David Kurniawan through its official repository on Hugging Face. Read the license.

Built From

Memory Requirements

PrecisionWeights in memory
As published438.7 MB
16-bit0.2 GB
8-bit0.1 GB
4-bit0.1 GB

Weights only, from the published parameter count; the key-value cache and runtime add to this.

Questions About finbert-crypto-stock-news-sentiment

How much GPU memory does finbert-crypto-stock-news-sentiment need?

About 0.3 GB at 16-bit and 0.1 GB at 4-bit: the weights (110M parameters) plus a working margin. A long context needs more.

What is the cheapest GPU to run finbert-crypto-stock-news-sentiment on?

At 16-bit, 1x MI300X from $1.85 an hour; at 4-bit, 1x MI300X from $1.85 an hour, at the lowest on-demand prices the SAVRN Index lists.

Can I use finbert-crypto-stock-news-sentiment commercially?

Yes. finbert-crypto-stock-news-sentiment is released under Apache License 2.0. The Apache License 2.0 is a permissive open-source license. It permits commercial use, modification and redistribution. It requires keeping the license and copyright notices and any NOTICE file, stating significant changes, and it includes an express patent grant from contributors.

What is finbert-crypto-stock-news-sentiment's context length?

512 tokens, from the maximum position embeddings in its published configuration.

Similar Models

Model · Text classification

bionerd-re

Joshy Alphonse

BioNERD's own typed relation-extraction model "C": microsoft/BiomedNLP-BiomedBERT-base-uncased-abstract-fulltext (MIT) fine-tuned on the BioRED Train split (public domain) as an entity-marker sequence classifier. No accuracy is claimed here. BioNERD shows its measured labels in the app's model catalog, each tied to this exact artefact.

Open weights mit 109M parameters 512 tokens transformers

Model · Text classification

topic-classification-bert

KC

This model was fine-tuned on the AG News dataset (fancyzhx/agnews) for four-class news topic classification: The dataset was divided into 108,000 training examples, 12,000 validation examples, and 7,600 test examples. A random seed of 42 was used. This model is intended for English news topic classification into the four AG News categories: World, Sports, Business, and Sci/Tech. It was developed for educational purposes and experimentation with BERT adaptation methods. The model is trained on English news data and may not generalize well to other domains or languages. It only supports the four categories present in AG News. Performance on real-world data may differ from the reported…

Open weights 109M parameters 512 tokens transformers

Model · Text classification

bert-base-agnews-topic-classification

Dalila Ku

Full fine-tuning of bert-base-uncased for 4-class news topic classification, delivered as part of assignment U2T01 (Adapting BERT for NLP tasks — Trends in Data Science, Unit 2, Universidad Politécnica de Yucatán). bert-base-uncased with a linear classification head on top of the [CLS] token's last hidden state, mapping to 4 topic classes: World, Sports, Business, Sci/Tech. - 10% of the official train split was held out as validation; the official test split was left untouched. - 4 balanced classes. Two adaptation methods were trained and compared; full fine-tuning is the delivered model, since it beat the feature-based baseline by a margin well above the run-to-run noise floor (±1–3 points…

Open weights apache-2.0 109M parameters 512 tokens

Model · Text classification

ft-agnews

Dalila Ku

This model is a fine-tuned version of bert-base-uncased on an unknown dataset. It achieves the following results on the evaluation set: The following hyperparameters were used during training: - learningrate: 5e-05 - trainbatchsize: 32 - evalbatchsize: 64 - lrschedulertype: linear - numepochs: 2 - Transformers 5.16.1 - Pytorch 2.11.0+cu128 - Datasets 4.8.5 - Tokenizers 0.23.1

Open weights apache-2.0 109M parameters 512 tokens transformers

Model · Text classification

finbert

Prosus AI

FinBERT is a pre-trained NLP model to analyze sentiment of financial text. It is built by further training the BERT language model in the finance domain, using a large financial corpus and thereby fine-tuning it for financial sentiment classification. Financial PhraseBank by Malo et al. (2014) is used for fine-tuning. For more details, please see the paper FinBERT: Financial Sentiment Analysis with Pre-trained Language Models and our related blog post on Medium. The model will give softmax outputs for three labels: positive, negative or neutral. To get the scores for all three labels, pass topk=None to the classifier. This model was trained using the Financial PhraseBank dataset: The…

Open weights cc-by-nc-sa-4.0 109M parameters 512 tokens transformers

Model · Text classification

multi-domain-sentiment-bert

ADITYA GUPTA

This is the model card of a transformers model that has been pushed on the Hub. Users (both direct and downstream) should be made aware of the risks, biases and limitations of the model. Use the code below to get started with the model. Carbon emissions can be estimated using the Machine Learning Impact calculator presented in Lacoste et al. (2019).

Open weights 109M parameters 512 tokens transformers