Skip to main content

High-performance financial charting library for OHLC data visualization with technical indicators

Project description

PyCharting

PyPI version Python versions License: MIT

High‑performance financial charting library for OHLC data visualization with technical indicators.

Overview

PyCharting lets you render large OHLC time series (hundreds of thousands to millions of candles) in the browser with a single Python call.
It runs a lightweight FastAPI server locally, streams your data to a uPlot-based frontend, and gives you an interactive viewport with overlays and indicator subplots.

PyCharting demo

Features

  • Million‑point OHLC charts: optimized for large numeric indices and dense intraday data.
  • Overlays on price: moving averages, EMAs, or any arbitrary overlay series.
  • Indicator subplots: RSI-style and stochastic-style oscillators rendered as separate panels.
  • Viewport management: server‑side slicing and caching for smooth pan/zoom on huge arrays.
  • FastAPI + uPlot stack: Python on the backend, ultra‑light JS on the frontend.
  • Simple Python API: one main entry point, plot(...), plus helpers to manage the server.

Installation

From PyPI

Install the latest released version from PyPI:

pip install pycharting

This will install the pycharting package along with its runtime dependencies (numpy, pandas, fastapi, uvicorn, and friends).

From source

If you want to develop or run against main:

git clone https://github.com/alihaskar/pycharting.git
cd pycharting
pip install -e .

If you use Poetry instead of pip:

git clone https://github.com/alihaskar/pycharting.git
cd pycharting
poetry install

Quick start

The primary API is a single plot function that takes OHLC arrays (plus optional overlays and subplots), starts a local server, and opens your default browser on the interactive chart. You normally import everything you need like this:

from pycharting import plot, stop_server, get_server_status

When you run this script, PyCharting will:

  • spin up a local FastAPI server on an available port,
  • register your OHLC series and overlays in a session,
  • open your default browser to a minimal full‑page chart UI showing price and overlays.

Overlays vs subplots

Once you have your OHLC series, you pass additional series to plot in two different ways:

overlays = {
    "SMA_50": sma(close, 50),      # rendered on top of price
    "EMA_200": ema(close, 200),
}

subplots = {
    "RSI_like": rsi_like_series,   # rendered in its own panel below price
    "Stoch_like": stoch_series,
}

plot(
    index,
    open_,
    high,
    low,
    close,
    overlays=overlays,
    subplots=subplots,
)
  • Overlays share the same y‑axis as price and are drawn directly on the candlestick chart (moving averages, bands, signals on price).
  • Subplots are stacked independent charts below the main panel with their own y‑scales (oscillators, volume, breadth measures).

See demo.py for a full example that generates synthetic data and wires up both overlays and indicator-style subplots.

Run the demo from the project root:

python demo.py

You should see something similar to the screenshot above: a price panel with overlays, plus RSI-like and stochastic-like subplots underneath.

Python API

The public API is intentionally small and focused. All functions are available from the top-level pycharting package.

plot

from typing import Dict, Any, Optional, Union

import numpy as np
import pandas as pd
from pycharting import plot

ArrayLike = Union[np.ndarray, pd.Series, list]

result: Dict[str, Any] = plot(
    index: ArrayLike,
    open: ArrayLike,
    high: ArrayLike,
    low: ArrayLike,
    close: ArrayLike,
    overlays: Optional[Dict[str, ArrayLike]] = None,
    subplots: Optional[Dict[str, ArrayLike]] = None,
    session_id: str = "default",
    port: Optional[int] = None,
    open_browser: bool = True,
    server_timeout: float = 2.0,
)
  • index: numeric or datetime-like x-axis values (internally treated as numeric indices).
  • open/high/low/close: price series of identical length.
  • overlays: mapping of overlay name to series (same length as close), rendered on the main price chart.
  • subplots: mapping of subplot name to series, rendered as additional charts stacked vertically.
  • session_id: identifier for the data session; can be used to host multiple concurrent charts.
  • port: optional port override; if None, PyCharting picks an available port.
  • open_browser: if False, you get the URL back in result["url"] but the browser is not opened automatically.

The returned dict includes:

  • status: "success" or "error",
  • url: full chart URL (including session query),
  • server_url: base FastAPI server URL,
  • session_id: the session identifier you passed in,
  • data_points: number of OHLC rows,
  • server_running: boolean.

stop_server

from pycharting import stop_server

stop_server()

Stops the active chart server if it is running. This is useful in long‑running processes and demos to clean up after you are done exploring charts.

get_server_status

from pycharting import get_server_status

status = get_server_status()
print(status)

Returns a small dict with:

  • running: whether the server is alive,
  • server_info: host/port and other metadata if running,
  • active_sessions: number of registered data sessions.

Project structure

The library follows a modern src/ layout:

pycharting/
├── src/
│   ├── core/         # Chart server lifecycle and internals
│   ├── data/         # Data ingestion, validation, and slicing
│   ├── api/          # FastAPI routes and Python API surface
│   └── web/          # Static frontend (HTML + JS for charts)
├── tests/            # Test suite
├── data/             # Sample CSVs and fixtures
└── pyproject.toml    # Project configuration

Contributing

Contributions, bug reports, and feature suggestions are welcome. Please open an issue or pull request on GitHub.

Basic workflow:

  1. Fork the repository.
  2. Create a feature branch: git checkout -b feature/my-feature.
  3. Make changes and add tests.
  4. Run the test suite.
  5. Open a pull request against main.

License

PyCharting is licensed under the MIT License.

Links

  • PyPI: https://pypi.org/project/pycharting/
  • Source: https://github.com/alihaskar/pycharting
  • Issues: https://github.com/alihaskar/pycharting/issues

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

pycharting-0.2.14.tar.gz (44.3 kB view details)

Uploaded Source

Built Distribution

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

pycharting-0.2.14-py3-none-any.whl (49.2 kB view details)

Uploaded Python 3

File details

Details for the file pycharting-0.2.14.tar.gz.

File metadata

  • Download URL: pycharting-0.2.14.tar.gz
  • Upload date:
  • Size: 44.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.12.3 Windows/11

File hashes

Hashes for pycharting-0.2.14.tar.gz
Algorithm Hash digest
SHA256 419ba399e860dc69af92f327e47bb93c93d3679d9538912d9340dc8d0f464a13
MD5 2b8d582a5068a1715f7942f66af0e3b3
BLAKE2b-256 ee06c563abc248ef0c5336a806cc35e381deb53cad6172f514e5e8517b237f81

See more details on using hashes here.

File details

Details for the file pycharting-0.2.14-py3-none-any.whl.

File metadata

  • Download URL: pycharting-0.2.14-py3-none-any.whl
  • Upload date:
  • Size: 49.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.12.3 Windows/11

File hashes

Hashes for pycharting-0.2.14-py3-none-any.whl
Algorithm Hash digest
SHA256 cf3d37eb8091e87af88160b235a9e79a5b8445d3cc9875061f2e0a2e001d505e
MD5 a3af75a9b858cd95cf10abc2fda9eb4c
BLAKE2b-256 2c53f8e935a35b240ca530cddf117dd4237fa02e02be2ac95f7a06cee5f28425

See more details on using hashes here.

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