Atium
Quantitative portfolio construction and backtesting framework built on Polars and CVXPY.
Atium provides a modular pipeline for alpha-driven portfolio optimization: define data providers, build a risk model, optimize weights, apply trading constraints, and backtest with transaction costs.
Installation
pip install atium
Quick Start
Single-Date Portfolio Optimization
Construct an optimal portfolio for a single date using mean-variance optimization with trading constraints.
from atium.risk_model import FactorRiskModel
from atium.optimizer import MVO
from atium.objectives import MaxUtilityWithTargetActiveRisk
from atium.optimizer_constraints import LongOnly, FullyInvested
from atium.trade_generator import TradeGenerator
from atium.trading_constraints import MaxPositionCount, MinPositionSize
import datetime as dt
date_ = dt.date(2026, 2, 13)
# Build a factor risk model
risk_model = FactorRiskModel(
factor_loadings=factor_loadings_provider.get(date_),
factor_covariances=factor_covariances_provider.get(date_),
idio_vol=idio_vol_provider.get(date_)
)
# Optimize portfolio weights
optimizer = MVO(
objective=MaxUtilityWithTargetActiveRisk(target_active_risk=.05),
constraints=[LongOnly(), FullyInvested()]
)
weights = optimizer.optimize(
date_=date_,
alphas=alphas_provider.get(date_),
benchmark_weights=benchmark_provider.get(date_),
risk_model=risk_model,
)
# Apply trading constraints
trade_generator = TradeGenerator(
constraints=[MinPositionSize(dollars=1), MaxPositionCount(max_positions=10)]
)
constrained_weights = trade_generator.apply(weights=weights, capital=100_000)
Full Backtest
Run a backtest with weekly rebalancing, transaction costs, and trading constraints.
from atium.risk_model import FactorRiskModelConstructor
from atium.optimizer import MVO
from atium.objectives import MaxUtilityWithTargetActiveRisk
from atium.optimizer_constraints import LongOnly, FullyInvested
from atium.trade_generator import TradeGenerator
from atium.trading_constraints import MaxPositionCount, MinPositionSize
from atium.backtester import Backtester
from atium.strategy import OptimizationStrategy
from atium.costs import LinearCost
import datetime as dt
start = dt.date(2026, 1, 2)
end = dt.date(2026, 2, 13)
# Build risk model constructor (provides a risk model for each rebalance date)
risk_model_constructor = FactorRiskModelConstructor(
factor_loadings=factor_loadings_provider,
factor_covariances=factor_covariances_provider,
idio_vol=idio_vol_provider
)
# Define strategy
strategy = OptimizationStrategy(
alpha_provider=alphas_provider,
benchmark_weights_provider=benchmark_provider,
risk_model_constructor=risk_model_constructor,
optimizer=MVO(
objective=MaxUtilityWithTargetActiveRisk(target_active_risk=.05),
constraints=[LongOnly(), FullyInvested()]
),
)
# Run backtest
backtester = Backtester()
results = backtester.run(
start=start,
end=end,
rebalance_frequency='weekly',
initial_capital=100_000,
calendar=calendar_provider,
returns=returns_provider,
benchmark=benchmark_provider,
strategy=strategy,
cost_model=LinearCost(bps=5),
trade_generator=TradeGenerator(
constraints=[MinPositionSize(dollars=1), MaxPositionCount(max_positions=10)]
)
)
print(results.summary())
results.plot_equity_curve('equity_curve.png')
Modules
| Module | Description |
|---|---|
| Data Providers | Calendar, Returns, Alphas, Factor Loadings, Factor Covariances, Idio-Vol, Benchmark Weights |
| Risk Model | Factor risk model estimation and construction |
| Optimizer | Mean-variance optimization (MVO) with pluggable objectives |
| Objectives | MaxUtilityWithTargetActiveRisk and others |
| Optimizer Constraints | LongOnly, FullyInvested, etc. |
| Trade Generator | Post-optimization trading constraints (MaxPositionCount, MinPositionSize) |
| Strategy | OptimizationStrategy, QuantileStrategy |
| Cost Model | NoCost, LinearCost |
| Backtester | Time-series backtesting with configurable rebalance frequency |
To Do
- Signal Combinator
- Equal
- Inverse Volatility
- Fama-MacBeth
- Elastic Net
Metadata
Release files for atium 0.1.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| atium-0.1.9.tar.gz | 12.6 kB | Without provenance | Details for atium-0.1.9.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| atium-0.1.9-py3-none-any.whl | Python 3 | none | any | Details for atium-0.1.9-py3-none-any.whl |
Total release size: 28.2 kB
Release files / atium-0.1.9.tar.gz
| Download URL | atium-0.1.9.tar.gz |
|---|---|
| Size | 12.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2ed8b8b0c1d4330634fe28afb0ece66b3430dfc8f3d496a16692fc1fe298fabc
|
|
BLAKE2b-256 checksum How to use checksums |
da4e11e2b922686bee86daf9d0a447f702028c1269a812e35b55278d980d6f47
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / atium-0.1.9-py3-none-any.whl
| Download URL | atium-0.1.9-py3-none-any.whl |
|---|---|
| Size | 15.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b229f21991a152b26b53cc4cb03964c61f292590227ef9058f1e9a90c1e6bae0
|
|
BLAKE2b-256 checksum How to use checksums |
2109e14eb5e6fc908e0feb07b24d1d12968abad9fbab8676cef35ddda5950cb4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for atium 0.1.9
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.