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.9.tar.gz (12.6 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.9-py3-none-any.whl (15.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: atium-0.1.9.tar.gz
  • Upload date:
  • Size: 12.6 kB
  • Tags: Source
  • Uploaded using 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}

File hashes

Hashes for atium-0.1.9.tar.gz
Algorithm Hash digest
SHA256 2ed8b8b0c1d4330634fe28afb0ece66b3430dfc8f3d496a16692fc1fe298fabc
MD5 25ce3280fa113639528d17a7bcff2175
BLAKE2b-256 da4e11e2b922686bee86daf9d0a447f702028c1269a812e35b55278d980d6f47

See more details on using hashes here.

File details

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

File metadata

  • Download URL: atium-0.1.9-py3-none-any.whl
  • Upload date:
  • Size: 15.6 kB
  • Tags: Python 3
  • Uploaded using 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}

File hashes

Hashes for atium-0.1.9-py3-none-any.whl
Algorithm Hash digest
SHA256 b229f21991a152b26b53cc4cb03964c61f292590227ef9058f1e9a90c1e6bae0
MD5 228227b216082c32e37b2aa3b4f9ac2a
BLAKE2b-256 2109e14eb5e6fc908e0feb07b24d1d12968abad9fbab8676cef35ddda5950cb4

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