Skip to main content

High-performance factor expression and backtesting library (Rust + PyO3)

Project description

alfars: From epsilon to alpha.

alfars

Informed by data;
Enlightened by research;
Engineered with AI;
Executed with algorithms.

High-performance quant workflow with Rust core and Python bindings.

Rust Python License: MIT

Features

Core Backtesting

  • High Performance: Rust core with parallel computation (8-10x speedup)
  • Flexible API: NumPy arrays and Pandas Series support
  • Complete Features: qcut(N) grouping, long-short portfolios, IC calculation, factor analysis
  • Alphalens Compatibility: Similar API design for easy migration
  • Extensible: Modular design with custom weights, grouping, and commission models

Intelligent Factor Mining (v0.4.0)

  • Expression System: AST-based expression builder for custom factor computation
  • Lazy Evaluation: Polars-style delayed computation with query optimization
  • Genetic Programming: Auto-discover high-performance factor expressions
  • Dimension System: Type-safe factor expressions to prevent invalid calculations
  • Persistence: Factor library management with search, caching, and versioning
  • Meta-Learning: Intelligent GP parameter recommendations based on historical data

Interactive Lab (v0.4.0)

  • One-Command Launch: alfars lab starts all services automatically
  • Visual Backtest: Interactive charts for NAV, IC, and quantile returns
  • Browser-based: Access via http://localhost:5173
  • ClickHouse Support: Connect to ClickHouse for historical market data

Installation

Requirements

  • Rust: 1.70+ (curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh)
  • Python: 3.8+
  • uv (recommended): pip install uv

Install from Source

# Clone repository
git clone https://github.com/EthanNOV56/alfa.rs.git
cd alfa.rs

# Option 1: Full installation with Python bindings
uv pip install -e .
maturin develop --release

# Option 2: Rust-only server (no Python extension needed)
cargo build --release --bin alfars-server

Using pip (future releases)

pip install alfars

Quick Start

Basic Usage

import numpy as np
import alfars as al

# Generate sample data
n_days, n_assets = 100, 200
factor = np.random.randn(n_days, n_assets)
returns = np.random.randn(n_days, n_assets) * 0.01 + factor * 0.005

# Run quantile backtest
result = al.quantile_backtest(
    factor=factor,
    returns=returns,
    quantiles=10,
    weight_method="equal",
    long_top_n=1,
    short_top_n=1,
    commission_rate=0.0003,
)

print(f"Long-Short Return: {result.long_short_cum_return:.4%}")
print(f"IC Mean: {result.ic_mean:.4f}")
print(f"IC IR: {result.ic_ir:.4f}")

Start Interactive Lab

# Option 1: Python FastAPI server (requires maturin develop first)
uv run python -m alfars.lab

# Option 2: Rust HTTP server (recommended - no Python dependency)
cargo run --release --bin alfars-server   # Start Rust backend (port 8000)
cd frontend && npm run dev                 # Start frontend (port 5173)

Then open http://localhost:5173 in your browser.

Genetic Programming Factor Mining

from alfars import GpEngine

# Create GP engine
gp = GpEngine(
    population_size=100,
    max_generations=50,
    max_depth=6,
)

# Set available columns
gp.set_columns(['open', 'high', 'low', 'close', 'volume'])

# Prepare data
data = {
    'close': close_prices,    # shape: (n_days, n_assets)
    'volume': volumes,
}
returns = next_day_returns

# Mine factors
factors = gp.mine_factors(data, returns, num_factors=10)

for expr_str, fitness in factors[:3]:
    print(f"Factor: {expr_str[:60]}... (fitness: {fitness:.4f})")

Expression System

from alfars import Expr, LazyFrame

# Build factor expressions
expr = (Expr.col("close") - Expr.col("open")) / Expr.col("open")
sqrt_expr = expr.abs().sqrt()

# Lazy evaluation
lf = LazyFrame.scan(data)
lf_with_factor = lf.with_columns([("my_factor", expr)])
result = lf_with_factor.collect()

Persistence & Meta-Learning

from alfars import PersistenceManager, MetaLearningAnalyzer

# Factor library
db = PersistenceManager("./factor_library")
db.save_factor(factor_metadata)
factors = db.search_factors(min_ic=0.1)

# Meta-learning recommendations
analyzer = MetaLearningAnalyzer()
analyzer.train(factors, history)
recommendations = analyzer.get_recommendations(target_complexity=4.5)
print(f"Recommended: {recommendations.recommended_functions}")

Performance Benchmarks

Data Size Rust Python Speedup
100×200 5.2ms 42.1ms 8.1×
500×500 68.3ms 1.2s 17.6×
1000×1000 312ms 8.7s 27.9×

Test environment: AMD Ryzen 7 5800X, 32GB RAM

Project Structure

alfars/
├── Cargo.toml              # Rust project config
├── pyproject.toml          # Python project config
├── src/
│   ├── lib.rs             # Core + Python bindings
│   ├── al/                # Alpha file parser + factor store
│   ├── backtest/          # Backtest engine
│   ├── data/              # Data source abstraction
│   ├── expr/              # Expression system (AST, optimizer, registry)
│   ├── gp/                # Genetic programming + history + metalearning
│   ├── lazy/              # Lazy evaluation engine
│   ├── types/             # Series and DataFrame types
│   ├── persistence.rs     # Persistence manager
│   └── bin/server.rs      # Rust HTTP server
├── alfars/                # Python package
│   ├── __init__.py
│   ├── lab.py             # Interactive lab launcher
│   └── server.py          # FastAPI server
├── frontend/              # Interactive UI (Vite + TypeScript)
├── assets/                # Static assets (logo, etc.)
└── tests/                 # Test suite

Development

# Format code before committing
cargo fmt
ruff format

# Run tests
pytest tests/

# Build release
maturin build --release

Version History

v0.4.0 (Current)

  • Interactive Lab: One-command alfars lab for visual factor research
  • GP Parallelization: Rayon-based parallel fitness evaluation
  • Improved GP Engine: Bug fixes for IC calculation, cumulative returns
  • Dimension System: Type-safe factor expressions
  • ClickHouse Integration: Direct database connectivity for historical data
  • Rust HTTP Server: Standalone server without Python dependency

v0.2.0

  • Expression system with AST-based builder
  • Lazy evaluation engine (Polars-style)
  • Genetic programming factor mining
  • Persistence and factor library management
  • Meta-learning recommendations

v0.1.0

  • High-performance quantile backtesting
  • Alphalens-compatible API
  • NumPy/Pandas dual interface

License

MIT License

Acknowledgments

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

alfars-0.4.1.tar.gz (1.0 MB view details)

Uploaded Source

Built Distribution

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

alfars-0.4.1-cp314-cp314-manylinux_2_34_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

File details

Details for the file alfars-0.4.1.tar.gz.

File metadata

  • Download URL: alfars-0.4.1.tar.gz
  • Upload date:
  • Size: 1.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.10.2

File hashes

Hashes for alfars-0.4.1.tar.gz
Algorithm Hash digest
SHA256 e474a453908e8de7a9a4d57529f73f59f8d17c124ba6f4b9c50aab229691d38a
MD5 930e48c949aad4376d8df24e4bd7cf77
BLAKE2b-256 a622744adf70178275e2f960123263c934b2ac3eb28ad5b873178a38eef1730a

See more details on using hashes here.

File details

Details for the file alfars-0.4.1-cp314-cp314-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for alfars-0.4.1-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 3311f6ea3daf90cdcde05f60fe983ec473a8de49c6a1a762c4a0d90912e11e87
MD5 a878dca1a6b160694733739618c5ae20
BLAKE2b-256 4a029f79c04046e82db1bb0cd261ab5ec2df2add050a06ea93c5ef47b5831282

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