Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

atium-0.1.6.tar.gz (11.3 kB view details)

Uploaded Source

Built Distribution

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

atium-0.1.6-py3-none-any.whl (14.0 kB view details)

Uploaded Python 3

File details

Details for the file atium-0.1.6.tar.gz.

File metadata

  • Download URL: atium-0.1.6.tar.gz
  • Upload date:
  • Size: 11.3 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

Hashes for atium-0.1.6.tar.gz
Algorithm Hash digest
SHA256 461379057a8985d21469e2f2e8137f1c58a75760ddf81eb0de59b18a931f504d
MD5 72c5aa9f1d5cba3c2ea7f562943d19d6
BLAKE2b-256 a3c4fc37b55ad4773df46f06ef3abb12d92d89625cf1bde33d2d8e2b574cf909

See more details on using hashes here.

File details

Details for the file atium-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: atium-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 14.0 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

Hashes for atium-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 74676c9cbdd9b2592d80714c9472126670222e014697d1d64ca4f429dcd21801
MD5 48611a6df666b27dc41ffaa96ad63bc9
BLAKE2b-256 313be7ee52dce799a8becea74c2cf57d98d4e9b8ff191d7abaabff34cd21caf2

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