A robust stock, crypto, and forex classifier with async support.
Project description
ticker-classifier
Introduction
ticker-classifier is a small Python library for classifying ticker-like symbols (for example AAPL, BTC, EUR, GOLD) into a simple market/category representation.
It uses Yahoo Finance for equities, CoinGecko for cryptocurrencies and a few heuristics for currencies/commodities. The output indicates the most likely category, a display name, market cap when available, and a yahoo_lookup value to fetch further data if desired.
Table of Contents 🗂
- Key Features
- Installation
- Usage
- API
- Development
- Release and Versioning
- Citation
- Contributing
- License
Key Features 🔑
- Classify symbols as
Equity,Crypto,Forex,Commodity,IndexorUnknown. - Adds
sectorandindustrymetadata for many equity tickers (for exampleAAPL,NVDA). - Adds a compact
company_profilepayload for equity/ETF symbols (exchange, country, currency, industry group, website, market-cap category). - Uses multiple public APIs and simple heuristics to make robust decisions.
- Uses a generic Yahoo search fallback for unknown symbols so index names/aliases (for example
NASDAQ,FTSE,HANGSENG) can be resolved without manual per-ticker shortcuts. - Uses exact CoinGecko coin-name matching to resolve name-style crypto queries (for example
BITCOIN) and returns canonical symbols (BTC) instead of unrelated meme/derivative coins. - When CoinGecko price/market-cap requests are rate-limited or unavailable, crypto candidates can fallback to TradingView quote data to keep category detection resilient.
- Provides both synchronous and asynchronous APIs.
- Lightweight disk cache to avoid repeated lookups (
TickerCache).
Installation ⚙️
Install from pypi using this command:
pip install ticker-classifier
Usage ⌨️
Basic synchronous usage:
from ticker_classifier.classifier import TickerClassifier
classifier = TickerClassifier()
symbols = ["AAPL", "BTC", "EUR", "GOLD", "UNKNOWN123"]
results = classifier.classify(symbols)
for r in results:
print(r)
Example asynchronous usage:
import asyncio
from ticker_classifier.classifier import TickerClassifier
async def main():
classifier = TickerClassifier()
symbols = ["AAPL", "BTC", "ETH", "JPY"]
results = await classifier.classify_async(symbols)
for r in results:
print(r)
asyncio.run(main())
The output for each symbol is a dictionary like:
{'category': 'EQUITY', 'ticker': 'AAPL', 'name': 'Apple Inc.', 'market_cap': 4029017227264, 'sector': 'Information Technology', 'industry': 'Electronic Equipment, Instruments & Components', 'company_profile': {'industry_group': 'Technology Hardware & Equipment', 'country': 'United States', 'exchange': 'NASDAQ Global Select', 'currency': 'USD', 'website': 'http://www.apple.com', 'market_cap_category': 'Mega Cap'}, 'yahoo_lookup': 'AAPL', 'alternatives': ['crypto'], 'source': 'api'}
{'category': 'crypto', 'ticker': 'BTC', 'name': 'Bitcoin', 'market_cap': 1736590593460.9607, 'yahoo_lookup': 'BTC-USD', 'alternatives': ['stock'], 'source': 'api'}
{'category': 'crypto', 'ticker': 'ETH', 'name': 'Ethereum', 'market_cap': 338145915081.1455, 'yahoo_lookup': 'ETH-USD', 'alternatives': ['stock'], 'source': 'cache'}
{'category': 'forex', 'ticker': 'JPY', 'name': 'JPY Currency', 'market_cap': None, 'yahoo_lookup': 'JPYUSD=X', 'alternatives': ['stock'], 'source': 'cache'}
Notes
- The classifier caches positive classifications (non-
Unknown) in an SQLite database (defaultticker_cache.db) for24hours by default. - You can customize the cache filename and expiry by passing
db_nameandhours_to_expiretoTickerClassifier.
API
ticker_classifier.classifier.TickerClassifierclassify(symbols: List[str]) -> List[dict]– synchronous classification.classify_async(symbols: List[str]) -> List[dict]– async classification.ticker_classifier.apis.yahoo.YahooClient– low-level Yahoo quote fetcher (sync + async helpers).ticker_classifier.apis.coingecko.CoinGeckoClient– crypto lookup + market cap helpers (sync + async).ticker_classifier.db.cache.TickerCache– tiny SQLite-backed cache used byTickerClassifier.
Development
Run formatting and linting tools you prefer (project uses black code style).
Run a quick smoke check by running the classifier.py module directly:
& .venv\Scripts\python.exe ticker_classifier\classifier.py
If you add tests, run them with your chosen test runner (e.g. pytest).
Release and Versioning
This package is published to PyPI through GitHub Actions:
- Workflow:
.github/workflows/publish.yml - Trigger: GitHub Release published
- Publisher:
pypa/gh-action-pypi-publishusing trusted publishing (OIDC)
Release flow:
- Update version in
pyproject.toml. - Update
ticker_classifier/__init__.py__version__to match. - Commit and push.
- Create a GitHub release with tag
vX.Y.Z(orX.Y.Z).
The publish workflow validates that the release tag version matches pyproject.toml before uploading to PyPI.
Citation ✍️
If you use this project in your research, please cite as follows (adjust metadata accordingly):
@misc{ticker-classifier,
author = {Stephan Akkerman},
title = {ticker-classifier},
year = {2025},
publisher = {GitHub},
howpublished = {\url{https://github.com/StephanAkkerman/ticker-classifier}}
}
Contributing 🛠
Contributions are welcome. Suggested workflow:
- Fork the repository and create a feature branch.
- Run tests and format your changes with
black. - Open a pull request with a clear description of the change.
Please open issues for feature requests or bugs and include a small reproducible example when possible.
License 📜
This project is licensed under the MIT License. See the LICENSE file for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ticker_classifier-0.1.3.tar.gz.
File metadata
- Download URL: ticker_classifier-0.1.3.tar.gz
- Upload date:
- Size: 21.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f7cbba80f0a1f6629258d2e1bab7db6cf5281ef3cf95322546d48c8f5c77e61
|
|
| MD5 |
045ada5f2297b01cc89e94ec2896196c
|
|
| BLAKE2b-256 |
14e80be656d8e422c87fb3d09f71d52b9fd107c88c285415342a34c70299f44f
|
Provenance
The following attestation bundles were made for ticker_classifier-0.1.3.tar.gz:
Publisher:
publish.yml on StephanAkkerman/ticker-classifier
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ticker_classifier-0.1.3.tar.gz -
Subject digest:
2f7cbba80f0a1f6629258d2e1bab7db6cf5281ef3cf95322546d48c8f5c77e61 - Sigstore transparency entry: 1281020293
- Sigstore integration time:
-
Permalink:
StephanAkkerman/ticker-classifier@7076acd36cf0b478c1430abb1e5c9ec75a852107 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/StephanAkkerman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7076acd36cf0b478c1430abb1e5c9ec75a852107 -
Trigger Event:
release
-
Statement type:
File details
Details for the file ticker_classifier-0.1.3-py3-none-any.whl.
File metadata
- Download URL: ticker_classifier-0.1.3-py3-none-any.whl
- Upload date:
- Size: 21.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
efd9a95a190ed850952beb3a2930e31dd9e2716c9504075e6b5f19219ecc2d3f
|
|
| MD5 |
ce2e99a22c705651f841b9c3ec883194
|
|
| BLAKE2b-256 |
ed841f802aa4b712b59f25be4da24b5c1f562ba533af5ae833b3a64d35ab974d
|
Provenance
The following attestation bundles were made for ticker_classifier-0.1.3-py3-none-any.whl:
Publisher:
publish.yml on StephanAkkerman/ticker-classifier
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ticker_classifier-0.1.3-py3-none-any.whl -
Subject digest:
efd9a95a190ed850952beb3a2930e31dd9e2716c9504075e6b5f19219ecc2d3f - Sigstore transparency entry: 1281020297
- Sigstore integration time:
-
Permalink:
StephanAkkerman/ticker-classifier@7076acd36cf0b478c1430abb1e5c9ec75a852107 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/StephanAkkerman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7076acd36cf0b478c1430abb1e5c9ec75a852107 -
Trigger Event:
release
-
Statement type: