asxshorts
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, andtyper
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=Trueto 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)
| File | Size | Uploaded | |
|---|---|---|---|
| asxshorts-0.1.2.tar.gz | 50.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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