Skip to main content

A robust stock, crypto, and forex classifier with async support.

Project description

ticker-classifier


GitHub Actions Workflow Status License Code style: black

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 🔑

  • Classify symbols as Equity, Crypto, Forex, Commodity, Index or Unknown.
  • Uses multiple public APIs and simple heuristics to make robust decisions.
  • Provides both synchronous and asynchronous APIs.
  • Lightweight disk cache to avoid repeated lookups (TickerCache).

Installation ⚙️

Install from pip using the provided requirements.txt or install the package directly from the repository for latest changes:

pip install -r requirements.txt

or

pip install git+https://github.com/StephanAkkerman/ticker-classifier.git

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, '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 (default ticker_cache.db) for 24 hours by default.
  • You can customize the cache filename and expiry by passing db_name and hours_to_expire to TickerClassifier.

API

  • ticker_classifier.classifier.TickerClassifier
  • classify(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 by TickerClassifier.

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-publish using trusted publishing (OIDC)

Release flow:

  1. Update version in pyproject.toml.
  2. Update ticker_classifier/__init__.py __version__ to match.
  3. Commit and push.
  4. Create a GitHub release with tag vX.Y.Z (or X.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:

  1. Fork the repository and create a feature branch.
  2. Run tests and format your changes with black.
  3. 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.

https://github.com/StephanAkkerman/ticker-classifier/graphs/contributors

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

ticker_classifier-0.1.0.tar.gz (15.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ticker_classifier-0.1.0-py3-none-any.whl (14.9 kB view details)

Uploaded Python 3

File details

Details for the file ticker_classifier-0.1.0.tar.gz.

File metadata

  • Download URL: ticker_classifier-0.1.0.tar.gz
  • Upload date:
  • Size: 15.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ticker_classifier-0.1.0.tar.gz
Algorithm Hash digest
SHA256 908bd8e9b3b2eca42170e9f8b3b83842e9462010dd5aa7efe7d5da0c674930fc
MD5 198d423888a13180c60353d32cf6b023
BLAKE2b-256 d4c91490c0a9d45df24d287e9a4bf08125d1c699a8fd4ba04977a78aa8dd0fdd

See more details on using hashes here.

Provenance

The following attestation bundles were made for ticker_classifier-0.1.0.tar.gz:

Publisher: publish.yml on StephanAkkerman/ticker-classifier

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ticker_classifier-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for ticker_classifier-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4b529d801b0ae7c6f79d528c87e9eb8073680495fde72bd4857948a4937fe879
MD5 97ff08653ccde506d6f62d2c1b7fa30d
BLAKE2b-256 615919e09b8fae7151c3d24da035609b4bfbbad17fd6eaa897a2924c69206574

See more details on using hashes here.

Provenance

The following attestation bundles were made for ticker_classifier-0.1.0-py3-none-any.whl:

Publisher: publish.yml on StephanAkkerman/ticker-classifier

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page