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.3.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.3-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: atium-0.1.3.tar.gz
  • Upload date:
  • Size: 12.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","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.3.tar.gz
Algorithm Hash digest
SHA256 9f186bdbc540cfbd2923a13e6236b9883e6ef64eb9410692f45b80cb0be5b9f3
MD5 264b9455c42c3442267b808296e9d185
BLAKE2b-256 936ef8e27cf63a30ad707aa05e3aac439bca79750e1218ecadf38887e73d3621

See more details on using hashes here.

File details

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

File metadata

  • Download URL: atium-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 15.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 08770322c5707054d953bb6728e1d49063e54325e781b7fe0cf9c8710f1a394b
MD5 dd3eed3ca6a020453f3d3d5f4c3bef09
BLAKE2b-256 b9c0ea7f117637e57973a5db0a2e4986572126894b5300cb5c3620689f253f2b

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