Metadata-Version: 2.1
Name: wraquant
Version: 0.1.0
Summary: The ultimate quant finance toolkit for Python
Keywords: quantitative-finance,trading,risk-management,portfolio-optimization,technical-analysis,backtesting,time-series,volatility,garch,regime-detection,options-pricing,machine-learning,bayesian,econometrics,market-microstructure
Author-Email: William Astley <william.astley@algebraicwealth.com>
License: MIT
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Office/Business :: Financial
Classifier: Topic :: Office/Business :: Financial :: Investment
Classifier: Topic :: Scientific/Engineering :: Mathematics
Classifier: Topic :: Scientific/Engineering :: Information Analysis
Classifier: Typing :: Typed
Project-URL: Homepage, https://github.com/pr1m8/wraquant
Project-URL: Documentation, https://wraquant.readthedocs.io
Project-URL: Repository, https://github.com/pr1m8/wraquant
Project-URL: Changelog, https://github.com/pr1m8/wraquant/blob/main/CHANGELOG.md
Project-URL: Issues, https://github.com/pr1m8/wraquant/issues
Requires-Python: >=3.13
Requires-Dist: numpy>=2.4.2
Requires-Dist: scipy>=1.17.1
Requires-Dist: pandas>=3.0.1
Requires-Dist: statsmodels>=0.14.6
Requires-Dist: pydantic>=2.12.5
Requires-Dist: pydantic-settings>=2.13.1
Requires-Dist: structlog>=25.5.0
Requires-Dist: python-dateutil>=2.9.0.post0
Provides-Extra: accelerate
Requires-Dist: polars>=1.38.1; extra == "accelerate"
Requires-Dist: pyarrow>=23.0.1; extra == "accelerate"
Requires-Dist: duckdb>=1.4.4; extra == "accelerate"
Requires-Dist: numba>=0.64.0; extra == "accelerate"
Requires-Dist: bottleneck>=1.6.0; extra == "accelerate"
Requires-Dist: numexpr>=2.14.1; extra == "accelerate"
Requires-Dist: joblib>=1.5.3; extra == "accelerate"
Requires-Dist: orjson>=3.11.7; extra == "accelerate"
Requires-Dist: msgpack>=1.1.2; extra == "accelerate"
Provides-Extra: symbolic
Requires-Dist: sympy>=1.14.0; extra == "symbolic"
Requires-Dist: symengine>=0.14.1; extra == "symbolic"
Requires-Dist: mpmath>=1.3.0; extra == "symbolic"
Requires-Dist: patsy>=1.0.2; extra == "symbolic"
Requires-Dist: numdifftools>=0.9.42; extra == "symbolic"
Provides-Extra: logging
Requires-Dist: loguru>=0.7.3; extra == "logging"
Requires-Dist: rich>=14.3.3; extra == "logging"
Requires-Dist: tenacity>=9.1.4; extra == "logging"
Provides-Extra: ml
Requires-Dist: scikit-learn>=1.8.0; extra == "ml"
Provides-Extra: market-data
Requires-Dist: yfinance>=1.2.0; extra == "market-data"
Requires-Dist: pandas-datareader>=0.10.0; extra == "market-data"
Requires-Dist: fredapi>=0.5.2; extra == "market-data"
Requires-Dist: nasdaq-data-link>=1.0.4; extra == "market-data"
Requires-Dist: exchange-calendars>=4.13.1; extra == "market-data"
Requires-Dist: pandas-market-calendars>=5.3.1; extra == "market-data"
Provides-Extra: timeseries
Requires-Dist: pmdarima>=2.1.1; extra == "timeseries"
Requires-Dist: arch>=8.0.0; extra == "timeseries"
Requires-Dist: linearmodels>=7.0; extra == "timeseries"
Requires-Dist: sktime>=0.8.0; extra == "timeseries"
Requires-Dist: skforecast>=0.19.1; extra == "timeseries"
Requires-Dist: statsforecast>=2.0.1; extra == "timeseries"
Requires-Dist: mlforecast>=1.0.2; extra == "timeseries"
Requires-Dist: neuralforecast>=3.1.5; extra == "timeseries"
Requires-Dist: hierarchicalforecast>=1.4.0; extra == "timeseries"
Requires-Dist: tslearn>=0.8.0; extra == "timeseries"
Requires-Dist: tsfresh>=0.21.1; extra == "timeseries"
Requires-Dist: ruptures>=1.1.10; extra == "timeseries"
Requires-Dist: stumpy>=1.14.1; extra == "timeseries"
Requires-Dist: pywavelets>=1.9.0; extra == "timeseries"
Provides-Extra: cleaning
Requires-Dist: pyjanitor>=0.32.20; extra == "cleaning"
Requires-Dist: ftfy>=6.3.1; extra == "cleaning"
Requires-Dist: unidecode>=1.4.0; extra == "cleaning"
Requires-Dist: rapidfuzz>=3.14.3; extra == "cleaning"
Requires-Dist: python-slugify>=8.0.4; extra == "cleaning"
Requires-Dist: dateparser>=1.3.0; extra == "cleaning"
Requires-Dist: price-parser>=0.5.0; extra == "cleaning"
Requires-Dist: country-converter>=1.3.2; extra == "cleaning"
Provides-Extra: validation
Requires-Dist: pandera>=0.29.0; extra == "validation"
Requires-Dist: great-expectations>=1.13.0; extra == "validation"
Requires-Dist: frictionless>=5.18.1; extra == "validation"
Requires-Dist: pydantic-extra-types>=2.11.0; extra == "validation"
Requires-Dist: email-validator>=2.3.0; extra == "validation"
Provides-Extra: etl
Requires-Dist: dlt>=1.22.2; extra == "etl"
Requires-Dist: petl>=1.7.17; extra == "etl"
Requires-Dist: ibis-framework>=12.0.0; extra == "etl"
Requires-Dist: fsspec>=2026.2.0; extra == "etl"
Requires-Dist: smart-open>=7.5.1; extra == "etl"
Requires-Dist: s3fs>=2026.2.0; extra == "etl"
Requires-Dist: gcsfs>=2026.2.0; extra == "etl"
Requires-Dist: adlfs>=2026.2.0; extra == "etl"
Requires-Dist: sqlalchemy>=2.0.48; extra == "etl"
Requires-Dist: sqlmodel>=0.0.37; extra == "etl"
Requires-Dist: asyncpg>=0.31.0; extra == "etl"
Requires-Dist: psycopg>=3.3.3; extra == "etl"
Requires-Dist: connectorx>=0.4.5; extra == "etl"
Provides-Extra: warehouse
Requires-Dist: dbt-core>=1.11.6; extra == "warehouse"
Requires-Dist: dbt-duckdb>=1.10.1; extra == "warehouse"
Requires-Dist: dbt-postgres>=1.10.0; extra == "warehouse"
Provides-Extra: ingestion
Requires-Dist: httpx>=0.28.1; extra == "ingestion"
Requires-Dist: aiohttp>=3.13.3; extra == "ingestion"
Requires-Dist: websockets>=16.0; extra == "ingestion"
Requires-Dist: requests>=2.32.5; extra == "ingestion"
Requires-Dist: beautifulsoup4>=4.14.3; extra == "ingestion"
Requires-Dist: lxml>=6.0.2; extra == "ingestion"
Requires-Dist: xmltodict>=1.0.4; extra == "ingestion"
Provides-Extra: workflow
Requires-Dist: prefect>=3.6.20; extra == "workflow"
Requires-Dist: dagster>=1.12.17; extra == "workflow"
Requires-Dist: apscheduler>=3.11.2; extra == "workflow"
Requires-Dist: watchdog>=6.0.0; extra == "workflow"
Requires-Dist: questionary>=2.1.1; extra == "workflow"
Requires-Dist: rich-click>=1.9.7; extra == "workflow"
Requires-Dist: python-dotenv>=1.2.2; extra == "workflow"
Requires-Dist: diskcache>=5.6.3; extra == "workflow"
Provides-Extra: profiling
Requires-Dist: pyinstrument>=5.1.2; extra == "profiling"
Requires-Dist: snakeviz>=2.2.2; extra == "profiling"
Requires-Dist: scalene>=2.1.4; extra == "profiling"
Requires-Dist: memory-profiler>=0.61.0; extra == "profiling"
Requires-Dist: line-profiler>=5.0.2; extra == "profiling"
Provides-Extra: dev
Requires-Dist: pre-commit>=4.5.1; extra == "dev"
Requires-Dist: pre-commit-hooks>=6.0.0; extra == "dev"
Requires-Dist: ipykernel>=7.2.0; extra == "dev"
Requires-Dist: jupyterlab>=4.5.5; extra == "dev"
Requires-Dist: notebook>=7.5.4; extra == "dev"
Requires-Dist: pytest>=9.0.2; extra == "dev"
Requires-Dist: pytest-cov>=7.0.0; extra == "dev"
Requires-Dist: hypothesis>=6.151.9; extra == "dev"
Requires-Dist: ruff>=0.15.4; extra == "dev"
Requires-Dist: mypy>=1.19.1; extra == "dev"
Requires-Dist: pyright>=1.1.408; extra == "dev"
Provides-Extra: optimization
Requires-Dist: cvxpy>=1.8.1; extra == "optimization"
Requires-Dist: cvxopt>=1.3.3; extra == "optimization"
Requires-Dist: osqp>=1.1.1; extra == "optimization"
Requires-Dist: scs>=3.2.11; extra == "optimization"
Requires-Dist: clarabel>=0.11.1; extra == "optimization"
Requires-Dist: qpsolvers>=4.8.2; extra == "optimization"
Requires-Dist: pulp>=3.3.0; extra == "optimization"
Requires-Dist: ortools>=9.15.6755; extra == "optimization"
Requires-Dist: pyomo>=6.10.0; extra == "optimization"
Requires-Dist: pymoo>=0.6.1.6; extra == "optimization"
Provides-Extra: regimes
Requires-Dist: hmmlearn>=0.3.3; extra == "regimes"
Requires-Dist: pomegranate>=1.1.2; extra == "regimes"
Requires-Dist: pykalman>=0.11.2; extra == "regimes"
Requires-Dist: filterpy>=1.4.5; extra == "regimes"
Requires-Dist: statsmodels>=0.14.6; extra == "regimes"
Requires-Dist: dynamax>=1.0.1; extra == "regimes"
Requires-Dist: tensorflow-probability>=0.25.0; extra == "regimes"
Requires-Dist: pymc>=5.28.0; extra == "regimes"
Requires-Dist: pyro-ppl>=1.9.1; extra == "regimes"
Requires-Dist: ruptures>=1.1.10; extra == "regimes"
Requires-Dist: river>=0.19.0; extra == "regimes"
Requires-Dist: pybats>=0.0.5; extra == "regimes"
Requires-Dist: darts>=0.20.0; extra == "regimes"
Requires-Dist: bayesian-filters>=1.4.5; extra == "regimes"
Provides-Extra: pde
Requires-Dist: devito>=4.8.21; extra == "pde"
Requires-Dist: py-pde>=0.51.0; extra == "pde"
Requires-Dist: FiPy>=4.0.2; extra == "pde"
Requires-Dist: sfepy>=2025.4; extra == "pde"
Requires-Dist: findiff>=0.13.1; extra == "pde"
Requires-Dist: pyamg>=5.3.0; extra == "pde"
Requires-Dist: scikit-fem>=12.0.1; extra == "pde"
Requires-Dist: meshio>=5.3.5; extra == "pde"
Requires-Dist: pygmsh>=7.1.17; extra == "pde"
Requires-Dist: gmsh>=4.15.1; extra == "pde"
Requires-Dist: diffeqpy>=2.5.5; extra == "pde"
Provides-Extra: backtesting
Requires-Dist: vectorbt>=0.28.2; extra == "backtesting"
Requires-Dist: zipline-reloaded>=3.0.4; extra == "backtesting"
Requires-Dist: backtrader>=1.9.78.123; extra == "backtesting"
Requires-Dist: backtesting>=0.6.5; extra == "backtesting"
Requires-Dist: bt>=1.1.3; extra == "backtesting"
Requires-Dist: empyrical-reloaded>=0.5.12; extra == "backtesting"
Requires-Dist: pyfolio-reloaded>=0.9.7; extra == "backtesting"
Requires-Dist: alphalens-reloaded>=0.4.3; extra == "backtesting"
Requires-Dist: quantstats>=0.0.81; extra == "backtesting"
Requires-Dist: quantstats-reloaded>=0.1.0; extra == "backtesting"
Requires-Dist: ffn>=1.1.3; extra == "backtesting"
Provides-Extra: risk
Requires-Dist: pyportfolioopt>=1.6.0; extra == "risk"
Requires-Dist: riskfolio-lib>=7.2.1; extra == "risk"
Requires-Dist: skfolio>=0.15.5; extra == "risk"
Requires-Dist: copulas>=0.14.0; extra == "risk"
Requires-Dist: copulae>=0.7.9; extra == "risk"
Requires-Dist: pyvinecopulib>=0.7.5; extra == "risk"
Requires-Dist: pyextremes>=2.2.4; extra == "risk"
Provides-Extra: pricing
Requires-Dist: QuantLib>=1.41; extra == "pricing"
Requires-Dist: rateslib>=2.6.0; extra == "pricing"
Requires-Dist: financepy>=1.0.1; extra == "pricing"
Requires-Dist: mibian>=0.1.3; extra == "pricing"
Requires-Dist: py-vollib-gen>=1.0.1; extra == "pricing"
Requires-Dist: py-vollib-vectorized>=0.1.1; extra == "pricing"
Requires-Dist: QuantLib-Risks; python_version < "3.13" and extra == "pricing"
Provides-Extra: stochastic
Requires-Dist: sdepy>=1.2.0; extra == "stochastic"
Requires-Dist: sdeint>=0.3.0; extra == "stochastic"
Requires-Dist: stochastic>=0.4.0; extra == "stochastic"
Requires-Dist: torchsde>=0.2.6; extra == "stochastic"
Provides-Extra: lp-extra
Requires-Dist: highspy>=1.13.1; extra == "lp-extra"
Requires-Dist: mip>=1.17.1; extra == "lp-extra"
Requires-Dist: swiglpk>=5.0.13; extra == "lp-extra"
Provides-Extra: conic-extra
Requires-Dist: ecos>=2.0.14; extra == "conic-extra"
Provides-Extra: nlp-extra
Requires-Dist: casadi>=3.7.2; extra == "nlp-extra"
Requires-Dist: nlopt>=2.10.0; extra == "nlp-extra"
Provides-Extra: causal
Requires-Dist: dowhy>=0.14; extra == "causal"
Requires-Dist: econml>=0.12.0; extra == "causal"
Requires-Dist: DoubleML>=0.11.2; extra == "causal"
Provides-Extra: quant-math
Requires-Dist: jax>=0.9.1; extra == "quant-math"
Requires-Dist: jaxlib>=0.9.1; extra == "quant-math"
Requires-Dist: jaxopt>=0.8.5; extra == "quant-math"
Requires-Dist: optax>=0.2.7; extra == "quant-math"
Requires-Dist: chex>=0.1.91; extra == "quant-math"
Requires-Dist: equinox>=0.13.4; extra == "quant-math"
Requires-Dist: diffrax>=0.7.2; extra == "quant-math"
Requires-Dist: lineax>=0.1.0; extra == "quant-math"
Requires-Dist: optimistix>=0.1.0; extra == "quant-math"
Requires-Dist: jaxtyping>=0.3.9; extra == "quant-math"
Requires-Dist: einops>=0.8.2; extra == "quant-math"
Provides-Extra: bayes
Requires-Dist: pymc>=5.28.0; extra == "bayes"
Requires-Dist: arviz>=1.0.0; extra == "bayes"
Requires-Dist: bambi>=0.16.0; extra == "bayes"
Requires-Dist: numpyro>=0.20.0; extra == "bayes"
Requires-Dist: blackjax>=1.2.5; extra == "bayes"
Requires-Dist: emcee>=3.1.6; extra == "bayes"
Requires-Dist: dynesty>=3.0.0; extra == "bayes"
Requires-Dist: cmdstanpy>=1.3.0; extra == "bayes"
Requires-Dist: pyro-ppl>=1.9.1; extra == "bayes"
Provides-Extra: viz
Requires-Dist: matplotlib>=3.10.8; extra == "viz"
Requires-Dist: seaborn>=0.13.2; extra == "viz"
Requires-Dist: plotly>=6.6.0; extra == "viz"
Requires-Dist: kaleido>=1.2.0; extra == "viz"
Requires-Dist: bokeh>=3.8.2; extra == "viz"
Requires-Dist: altair>=6.0.0; extra == "viz"
Requires-Dist: holoviews>=1.22.1; extra == "viz"
Requires-Dist: hvplot>=0.12.2; extra == "viz"
Requires-Dist: datashader>=0.18.2; extra == "viz"
Requires-Dist: pyvista>=0.47.1; extra == "viz"
Provides-Extra: scale
Requires-Dist: dask>=2026.1.2; extra == "scale"
Requires-Dist: dask-ml>=2025.1.0; extra == "scale"
Requires-Dist: ray>=2.54.0; extra == "scale"
Provides-Extra: dashboard
Requires-Dist: streamlit>=1.45.0; extra == "dashboard"
Requires-Dist: plotly>=6.6.0; extra == "dashboard"
Description-Content-Type: text/markdown

# wraquant

[![Tests](https://github.com/algebraicwealth/wraquant/actions/workflows/tests.yml/badge.svg)](https://github.com/algebraicwealth/wraquant/actions/workflows/tests.yml)
[![Coverage](https://codecov.io/gh/algebraicwealth/wraquant/branch/main/graph/badge.svg)](https://codecov.io/gh/algebraicwealth/wraquant)
[![Docs](https://readthedocs.org/projects/wraquant/badge/?version=latest)](https://wraquant.readthedocs.io)
[![PyPI](https://img.shields.io/pypi/v/wraquant)](https://pypi.org/project/wraquant/)
[![Python](https://img.shields.io/pypi/pyversions/wraquant)](https://pypi.org/project/wraquant/)
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)

**The ultimate quantitative finance toolkit for Python.**

1,000+ functions | 3,200+ tests | 24 modules | 265 TA indicators

## Features

- **Risk Management** -- VaR/CVaR, GARCH-VaR, beta estimation, factor risk, portfolio analytics, tail risk, stress testing, copulas, credit risk
- **Regime Detection** -- Gaussian HMM, Markov-switching, Kalman filter/smoother/UKF, regime scoring, labels, regime-aware portfolios
- **Volatility Modeling** -- Full GARCH family (EGARCH, GJR, FIGARCH, HARCH, APARCH), Hawkes processes, stochastic vol, realized vol estimators
- **Technical Analysis** -- 265 indicators across 19 modules (momentum, overlap, volume, trend, volatility, patterns, cycles, Fibonacci, support/resistance, exotic, and more)
- **Machine Learning** -- LSTM/GRU/Transformer (PyTorch), sklearn pipelines, walk-forward validation, SHAP importance, online regression
- **Derivatives Pricing** -- Black-Scholes, FBSDE solvers, characteristic function pricing (Heston, VG, NIG, CGMY), SABR, rough Bergomi, CIR, Vasicek
- **Portfolio Optimization** -- Mean-variance, risk parity, Black-Litterman, HRP, convex/linear/nonlinear optimization
- **Backtesting** -- Vectorized engine, 15+ performance metrics, walk-forward optimization, comprehensive tearsheets, regime-conditional sizing
- **Time Series** -- Auto-forecasting, SSA/EMD decomposition, ARIMA diagnostics, stochastic processes (OU, jump-diffusion), anomaly detection
- **Statistics** -- Robust stats, advanced distributions, distance correlation, copula selection, factor analysis, cointegration
- **Econometrics** -- Panel data, IV/2SLS, VAR/VECM, event studies, structural breaks
- **Causal Inference** -- Granger causality, IV with diagnostics, event studies, synthetic control, causal forests, mediation, RDD
- **Bayesian** -- Conjugate regression, stochastic vol MCMC, HMC, model comparison (WAIC/LOO), changepoint detection
- **Visualization** -- Interactive Plotly dashboards (portfolio, regime, risk, technical), 3D vol surfaces, correlation networks
- **And more** -- Forex, microstructure, execution algorithms, Levy processes, network analysis, parallel computing

## Quick Start

```bash
pip install wraquant
# Or with optional groups:
pip install wraquant[market-data,viz,risk,ml]
```

```python
import wraquant as wq

# Quick comprehensive analysis
report = wq.analyze(returns)

# Detect market regimes
regimes = wq.detect_regimes(returns, method="hmm", n_regimes=2)

# GARCH volatility forecasting
from wraquant.vol import garch_fit, garch_forecast
model = garch_fit(returns, p=1, q=1, dist="t")
forecast = garch_forecast(returns, horizon=10)

# Portfolio optimization with regime awareness
from wraquant.recipes import portfolio_construction_pipeline
portfolio = portfolio_construction_pipeline(returns_df, regime_aware=True)

# 265 technical indicators
from wraquant.ta import rsi, macd, bollinger_bands
signals = rsi(prices, period=14)
```

## Module Overview

| Module | Functions | Description |
|--------|-----------|-------------|
| `risk` | 95 | Risk management, VaR, beta, factor models, stress testing |
| `stats` | 79 | Statistical analysis, robust stats, distributions, correlation |
| `ta` | 265 | Technical analysis indicators (19 sub-modules) |
| `math` | 55 | Levy processes, networks, optimal stopping |
| `ts` | 51 | Time series forecasting, decomposition, anomaly detection |
| `price` | 50 | Derivatives pricing, FBSDEs, stochastic models |
| `viz` | 46 | Plotly dashboards and interactive charts |
| `ml` | 43 | Machine learning, deep learning, pipelines |
| `regimes` | 38 | Regime detection, scoring, Kalman filters |
| `backtest` | 37 | Backtesting engine, metrics, tearsheets |
| `vol` | 28 | GARCH family, Hawkes, stochastic volatility |
| `bayes` | 28 | Bayesian inference, MCMC, model comparison |

## Interactive Dashboard

wraquant includes an optional Streamlit dashboard for interactive analysis:

```bash
pip install wraquant[dashboard]
```

```python
from wraquant.dashboard import launch
launch()
# Or: python -m wraquant.dashboard
```

The dashboard provides six pages:

- **Experiment Browser** -- Browse and compare experiment results from the Lab API
- **Strategy Analysis** -- Upload returns CSV for comprehensive analysis (metrics, risk, regimes, distribution)
- **Risk Monitor** -- VaR/CVaR, rolling volatility, GARCH VaR, stress testing
- **Regime Viewer** -- Interactive regime detection (HMM/GMM/changepoint) with overlay plots
- **Portfolio Optimizer** -- Multi-asset optimization (MVO, risk parity) with risk decomposition
- **TA Screener** -- Apply 265 technical indicators to OHLCV data with interactive charts

## Documentation

Full API documentation: [wraquant.readthedocs.io](https://wraquant.readthedocs.io)

## Development

```bash
pdm install -G dev
pdm run test          # Run tests
pdm run test-cov      # Tests with coverage
pdm run lint          # Lint with trunk
pdm run fmt           # Format
pdm run changelog     # Generate changelog
pdm run docs          # Build docs
```

## License

MIT
