Skip to main content

Free Python library for Pakistan Stock Exchange (PSX) data — historical prices, live quotes, KSE-100, sectors, indices

Project description

psxdata — Python Library for Pakistan Stock Exchange (PSX) Data

CI PyPI Documentation Python License: MIT

Full documentation at psxdata.readthedocs.io

psxdata is a Python library for downloading Pakistan Stock Exchange (PSX) data — historical OHLCV prices, real-time quotes, KSE-100 index constituents, sector summaries, fundamentals, debt market instruments, and margin-eligible stocks. Free, open-source, and actively maintained.

Alpha release note

0.1.0a1 — Core scraping, caching, and public API are complete. The FastAPI REST layer and full documentation are in progress. APIs may change before 1.0.


Installation

pip install psxdata

Requires Python 3.11+.


Quick Start

import psxdata

# Historical OHLCV data
df = psxdata.stocks("ENGRO", start="2024-01-01", end="2024-12-31")

# All listed tickers
all_tickers = psxdata.tickers()

# KSE-100 index constituents
kse100 = psxdata.indices("KSE100")

# Live quote
q = psxdata.quote("LUCK")

# Sector summary
sectors = psxdata.sectors()

# Debt market instruments
debt = psxdata.debt_market()

# Margin-eligible stocks
scrips = psxdata.eligible_scrips()

API Reference

Function Description
psxdata.stocks(symbol, start, end) Historical OHLCV DataFrame for a ticker
psxdata.tickers() All listed tickers (1000+)
psxdata.quote(symbol) Live quote row for a ticker
psxdata.indices(name) Constituents of a named index (e.g. "KSE100")
psxdata.sectors() Sector aggregates DataFrame (37 sectors)
psxdata.fundamentals(symbol) Financial reports for a ticker
psxdata.debt_market() Debt market instruments (TFCs, Sukuks, etc.)
psxdata.eligible_scrips() Margin trading eligible stocks

Why psxdata

Existing solutions for PSX data tend to hardcode date formats and column positions that break silently when PSX changes its HTML. psxdata is designed differently:

  • Dynamic column extraction from <th> tags — survives column reordering
  • Multi-format date parsing with fuzzy fallback via dateutil
  • Exponential backoff retries — 3 attempts, 1s/2s delays
  • Disk cache (~/.psxdata/cache/) — historical data cached forever, live data for 15 min
  • Data validation — OHLC constraint checks, duplicate/future date detection

Planned REST API

The FastAPI layer is planned for Phase 4.

Endpoint Description
GET /health Health check
GET /stocks All tickers
GET /stocks/{symbol}/historical?start=&end= Historical OHLCV
GET /stocks/{symbol}/quote Real-time quote
GET /stocks/{symbol}/fundamentals Fundamentals
GET /indices/{name} Index constituents
GET /sectors Sector aggregates
GET /debt-market Debt instruments
GET /eligible-scrips Margin eligible stocks

All responses: {"data": ..., "meta": {"timestamp": "...", "cached": bool}}


Development Status

See the roadmap issue for the full phase breakdown.

  • ✅ Phase 0 — PSX endpoint research and HTML fixture capture
  • ✅ Phase 0.5 — Repository setup, CI/CD, community files
  • ✅ Phase 2 — Core engineering (BaseScraper, parsers, cache, utils)
  • ✅ Phase 3 — Scrapers (historical, real-time, indices, sectors, fundamentals, screener, debt, eligible scrips)
  • ✅ Phase 3 API — Public Python package interface
  • 🔲 Phase 4 — FastAPI REST layer
  • 🔲 Phase 5 — Full test suite (API layer tests pending)
  • ✅ Phase 6 — Packaging & PyPI publish
  • 🔲 Phase 7 — Documentation

Contributing

Contributions are welcome. See CONTRIBUTING.md and open an issue before starting non-trivial work.


Architecture

See ARCHITECTURE.md for the component diagram, data flow, and design decisions.

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

psxdata-0.1.0a3.tar.gz (27.5 kB view details)

Uploaded Source

Built Distribution

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

psxdata-0.1.0a3-py3-none-any.whl (34.0 kB view details)

Uploaded Python 3

File details

Details for the file psxdata-0.1.0a3.tar.gz.

File metadata

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

File hashes

Hashes for psxdata-0.1.0a3.tar.gz
Algorithm Hash digest
SHA256 0f55a7fc6f7f3daa7827caa36d6a4b4de5e3a91a20811a4d33b5ce8f8317ef0c
MD5 efdcd0e9538d7c7c876b7d37dbdea480
BLAKE2b-256 80e42b13739f19e4dd904d81cf245e1a5054bdf823eb9f2d2df378c182c0ef12

See more details on using hashes here.

Provenance

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

Publisher: publish.yml on mtauha/psxdata

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

File details

Details for the file psxdata-0.1.0a3-py3-none-any.whl.

File metadata

  • Download URL: psxdata-0.1.0a3-py3-none-any.whl
  • Upload date:
  • Size: 34.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for psxdata-0.1.0a3-py3-none-any.whl
Algorithm Hash digest
SHA256 b919e6fdad1cfea5ada861da8f9ce0015aa86998c279fef6ae5997ed71632eb2
MD5 2a6c483648e19d1cfb6b60b10bf7c8b4
BLAKE2b-256 ed75540d4b590a6aa7dbadccca6c5b297d82f901300dec647a279abcd7b64177

See more details on using hashes here.

Provenance

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

Publisher: publish.yml on mtauha/psxdata

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