Skip to main content

asxshorts

PyPI version Python versions License: MIT

Lightweight Python client to download official ASIC short position daily CSVs across a date range, with local caching.

👉 Examples: examples

Features

  • 🚀 Simple API: Fetch short selling data with just a few lines of code
  • 💾 Local Caching: Automatic file-based caching with atomic operations
  • 🔄 Retry Logic: Built-in exponential backoff for robust data fetching
  • 📊 Multiple Formats: Typed models + dicts, optional pandas/polars adapters
  • 🖥️ CLI Interface: Command-line tool for quick data access
  • 🛡️ Type Safe: Full type hints and mypy compatibility
  • Minimal Dependencies: Only requires requests, python-dateutil, and typer

Installation

# Basic installation
pip install asxshorts

# With pandas support
pip install asxshorts[pandas]

# With polars support
pip install asxshorts[polars]

# Development installation
pip install asxshorts[dev]

Quick Start

Python API

from datetime import date
from asxshorts import ShortsClient

# Create client
client = ShortsClient()

# Fetch data for a specific date
res = client.fetch_day(date(2024, 1, 15))
print(f"Found {res.record_count} records (from_cache={res.from_cache})")

# Fetch data for a date range
rng = client.fetch_range(
    start=date(2024, 1, 15),
    end=date(2024, 1, 19)
)
print(f"Total records: {rng.total_records}")

# Each record is a dictionary with normalized fields
for record in res.records[:3]:
    d = record.report_date
    print(f"{d}: {record.asx_code} - {record.percent_short}")

Pandas Integration

from asxshorts.adapters import create_pandas_adapter, to_pandas

# Create pandas adapter
adapter = create_pandas_adapter()

# Fetch as DataFrame via adapter
df = adapter.fetch_day_df(date(2024, 1, 15))
print(df.head())

# Or convert existing records
df2 = to_pandas([r.model_dump() for r in res.records])

# Date range as DataFrame
df = adapter.fetch_range_df(
    start=date(2024, 1, 15),
    end=date(2024, 1, 19)
)

Polars Integration

from asxshorts.adapters import create_polars_adapter, to_polars

# Create polars adapter
adapter = create_polars_adapter()

# Fetch as Polars DataFrame
df = adapter.fetch_day_df(date(2024, 1, 15))
print(df.head())

# Or convert existing records
df2 = to_polars([r.model_dump() for r in res.records])

Command Line Interface

# Fetch data for a specific date
asxshorts fetch 2024-01-15

# Fetch yesterday's data
asxshorts fetch yesterday

# Fetch date range and save to file
asxshorts range 2024-01-15 2024-01-19 --output data.json

# Show cache statistics
asxshorts cache stats

# Clear cache
asxshorts cache clear

# Clean up old cache files
asxshorts cache cleanup --max-age 30

Configuration

Environment Variables

# Custom cache directory
export asxshorts_CACHE_DIR="/path/to/cache"

# Custom base URL
export asxshorts_BASE_URL="https://download.asic.gov.au"

# Custom user agent
export asxshorts_USER_AGENT="MyApp/1.0"

Client Configuration

from asxshorts import ShortsClient

client = ShortsClient(
    cache_dir="/custom/cache/path",
    timeout=30.0,
    retries=5,
    backoff=1.0
)

Data Format

Each record contains the following normalized fields:

{
    "report_date": "2024-01-15",   # date
    "asx_code": "ABC",            # ASX code
    "company_name": "…",          # optional
    "short_sold": 1000000,         # int
    "issued_shares": 10000000,     # int
    "percent_short": 10.0          # float
}

Caching

  • Files are cached in ~/.cache/asxshorts/ by default
  • Cache uses atomic writes with file locking for thread safety
  • Cached files are named by date: 2024-01-15.csv
  • Use force=True to bypass cache and fetch fresh data

Error Handling

from asxshorts import ShortsClient
from asxshorts.errors import NotFoundError, FetchError, RateLimitError

client = ShortsClient()

try:
    records = client.fetch_day(date(2024, 1, 15))
except NotFoundError:
    print("No data available for this date")
except RateLimitError as e:
    print(f"Rate limited, retry after {e.retry_after} seconds")
except FetchError as e:
    print(f"Failed to fetch data: {e}")

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT License - see LICENSE file for details.


Note: This package resolves daily CSV URLs via the official ASIC short-selling index. Please respect ASIC/ASX terms and usage limits.

Release files for asxshorts 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for asxshorts 0.1.2
File Size Uploaded
asxshorts-0.1.2.tar.gz 50.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for asxshorts 0.1.2
File Interpreter ABI Platform
asxshorts-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 76.5 kB

Release files / asxshorts-0.1.2.tar.gz

Download URL asxshorts-0.1.2.tar.gz
Size 50.0 kB
Tags Source
SHA-256 checksum
How to use checksums
6f324c072db0679ac7dbbdfd2c498d621a0fd6604a640cc7bef780b01c77896b
BLAKE2b-256 checksum
How to use checksums
75fbbf04b619391d039a0795c5c2a87db116aed00da9e1664bec8c852e6dbe0f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.

Transparency log

Release files / asxshorts-0.1.2-py3-none-any.whl

Download URL asxshorts-0.1.2-py3-none-any.whl
Size 26.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
aae724af48eeebd0dc605b829b385c27bc8b7b5596964cad133dafaaf930326a
BLAKE2b-256 checksum
How to use checksums
6dadbdbbb4dfa3b345a1a5a9e6263118030b8940e3e5f0646c737eaeb9ced4ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page