Skip to main content

Lightweight Python client to download official ASX short position daily CSVs with local caching

Project description

asxshorts

PyPI version Python versions License: MIT CI

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

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.

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

asxshorts-0.1.0.tar.gz (48.4 kB view details)

Uploaded Source

Built Distribution

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

asxshorts-0.1.0-py3-none-any.whl (26.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: asxshorts-0.1.0.tar.gz
  • Upload date:
  • Size: 48.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.9

File hashes

Hashes for asxshorts-0.1.0.tar.gz
Algorithm Hash digest
SHA256 78ec472db98c2db80693777359a7ccf8fc37481c79a3c327ee53794299475fa8
MD5 99e42ff57823784975a118e3584ab8e2
BLAKE2b-256 ac0bd8fcc74dd715bc4abc647effd66753c0ea683fd66d728f722a9120d74398

See more details on using hashes here.

File details

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

File metadata

  • Download URL: asxshorts-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 26.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.9

File hashes

Hashes for asxshorts-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 adbdfcce7002f9a7f4cf56427524645c68a2ec58c4e465fa84544f92c7ec2300
MD5 e193446fa06c7ebcf8f960f4837f7a87
BLAKE2b-256 5a12383736acf4892f71befa49096fbb6ae6880617f74cd04100d41fdb7681c8

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