Atium Research quant research tools.
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file atium-0.1.7.tar.gz.
File metadata
- Download URL: atium-0.1.7.tar.gz
- Upload date:
- Size: 11.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.5 {"installer":{"name":"uv","version":"0.10.5","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
971513efc1b0e6164a11b6335f5e5911c6dae146ce411b1357d2114d33b2ae3b
|
|
| MD5 |
d829f35497f7e5177152c6730a7e0e8f
|
|
| BLAKE2b-256 |
8cc70336323781821cbef55f3360091a36537c70444715928b702ce527d72008
|
File details
Details for the file atium-0.1.7-py3-none-any.whl.
File metadata
- Download URL: atium-0.1.7-py3-none-any.whl
- Upload date:
- Size: 14.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.5 {"installer":{"name":"uv","version":"0.10.5","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4bcb7c77acd561c0acd7c8260472334c3453befd6b6a0e5e347f1906450fe796
|
|
| MD5 |
14286c708c56c5b9e90f55d1d7a4460d
|
|
| BLAKE2b-256 |
aa530452ee371802bbfd6b0972a4114b21f3ec3f2f8d8ace165757801909e7ab
|