Skip to main content
Yanked

This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 0.1.3 instead.
Reason given by maintainers: Python 3.15 installs fail due to incompatible dependencies. Use 0.1.1 with Python 3.12-3.14.

ml4t-engineer

Python 3.12+ PyPI License: MIT

Feature engineering for financial machine learning: validated features, labeling methods, alternative bars, and leakage-safe dataset preparation.

Part of the ML4T Library Ecosystem

This library is one of six interconnected libraries supporting the machine learning for trading workflow described in Machine Learning for Trading:

ML4T Library Ecosystem

Together they cover data infrastructure, feature engineering, modeling, signal evaluation, strategy backtesting, and live deployment.

What This Library Does

Transforming raw price data into predictive features is a core task in quantitative research. ml4t-engineer provides:

  • 120 registry features across 11 categories (momentum, volatility, trend, microstructure, and more)
  • Triple-barrier, ATR-based, percentile, trend-scanning, and meta-labeling methods from Advances in Financial Machine Learning
  • Alternative bar sampling (volume bars, dollar bars, tick imbalance bars)
  • Dataset building, preprocessing, and feature discovery for leakage-safe ML workflows

The library is built on Polars with Numba JIT compilation for numerical operations. 60 features are validated against TA-Lib at 1e-6 tolerance.

ml4t-engineer Architecture

Installation

pip install ml4t-engineer

Optional dependencies:

pip install ml4t-engineer[ta]        # TA-Lib backend
pip install ml4t-engineer[viz]       # Visualization
pip install ml4t-engineer[calendars] # Trading calendars

Quick Start

import polars as pl
from ml4t.engineer import compute_features

df = pl.read_parquet("ohlcv.parquet")

# Compute features with default parameters
result = compute_features(df, ["rsi", "macd", "atr", "obv"])

# Or with custom parameters
result = compute_features(df, [
    {"name": "rsi", "params": {"period": 20}},
    {
        "name": "bollinger_bands",
        "params": {"period": 20, "nbdevup": 2.0, "nbdevdn": 2.0},
    },
])

Feature Registry

from ml4t.engineer.core.registry import get_registry

registry = get_registry()
print(registry.list_all())                    # All 120 features
print(registry.list_by_category("momentum"))  # 31 momentum indicators
print(registry.list_ta_lib_compatible())      # 60 TA-Lib validated features
print(registry.list_normalized())             # 37 bounded (0-100, -1 to 1)

Feature Categories

Category Count Examples
Momentum 31 RSI, MACD, Stochastic, CCI, ADX, MFI
Microstructure 15 Kyle Lambda, VPIN, Amihud, Roll spread
Volatility 15 ATR, Bollinger, Yang-Zhang, Parkinson
Statistics 14 Variance, Linear Regression, Correlation
ML 14 Fractional Diff, Entropy, Lag features
Trend 10 SMA, EMA, WMA, DEMA, TEMA, KAMA
Risk 6 Max Drawdown, Sortino, CVaR
Price Transform 5 Typical Price, Weighted Close
Regime 4 Hurst Exponent, Choppiness Index
Volume 3 OBV, AD, ADOSC
Math 3 MAX, MIN, SUM

Triple-Barrier Labeling

from ml4t.engineer.config import LabelingConfig
from ml4t.engineer.labeling import triple_barrier_labels, atr_triple_barrier_labels

# Fixed barriers
tb_config = LabelingConfig.triple_barrier(
    upper_barrier=0.02,    # 2% profit target
    lower_barrier=0.01,    # 1% stop loss
    max_holding_period=20, # 20 bars
)
labels = triple_barrier_labels(
    df,
    config=tb_config,
)

# ATR-based dynamic barriers
atr_config = LabelingConfig.atr_barrier(
    atr_tp_multiple=2.0,
    atr_sl_multiple=1.0,
    atr_period=14,
    max_holding_period=20,
)
labels = atr_triple_barrier_labels(
    df,
    config=atr_config,
)

# Time-based horizons
tb_time_config = LabelingConfig.triple_barrier(
    upper_barrier=0.02,
    lower_barrier=0.01,
    max_holding_period="4h",  # 4 hours
)
labels = triple_barrier_labels(
    df,
    config=tb_time_config,
)

Alternative Bars

from ml4t.engineer.bars import VolumeBarSampler, DollarBarSampler, TickImbalanceBarSampler

# Volume bars (equal volume per bar)
vbars = VolumeBarSampler(volume_per_bar=1000).sample(tick_data)

# Dollar bars (equal dollar volume per bar)
dbars = DollarBarSampler(dollars_per_bar=1_000_000).sample(tick_data)

# Tick imbalance bars (information-driven)
ibars = TickImbalanceBarSampler(expected_ticks_per_bar=100).sample(tick_data)

Documentation

  • Docs Home - library overview and workflow map
  • Quickstart - first working feature and labeling workflow
  • Features - 120 features across 11 registry categories
  • Labeling - 7 labeling methods for supervised learning
  • Dataset Builder - leakage-safe train/test preparation
  • Examples - runnable scripts for complete workflows and focused features

Technical Characteristics

  • Polars-native: All computations use Polars expressions
  • Numba-accelerated: JIT compilation for numerical kernels
  • TA-Lib validated: 60 features validated at 1e-6 tolerance
  • AFML-compliant: Labeling methods verified against Advances in Financial Machine Learning
  • ML-ready outputs: 37 features produce bounded outputs (0-100, -1 to 1) for direct model input; remaining features work with standard preprocessing (returns, z-scores, robust scaling)

Related Libraries

  • ml4t-specs: Shared feed and artifact schema definitions across the ML4T stack
  • ml4t-data: Market data acquisition and storage
  • ml4t-diagnostic: Signal evaluation and statistical validation
  • ml4t-backtest: Event-driven backtesting
  • ml4t-live: Live trading with broker integration

Development

git clone https://github.com/ml4t/engineer.git
cd ml4t-engineer
uv sync
uv run pytest tests/ -q
uv run ty check

References

  • Lopez de Prado, M. (2018). Advances in Financial Machine Learning. Wiley.
  • Lopez de Prado, M. (2020). Machine Learning for Asset Managers. Cambridge.

License

MIT License - see LICENSE for details.

Download files

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

Source Distribution

ml4t_engineer-0.1.0.tar.gz (602.7 kB view details)

Uploaded Source

Built Distribution

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

ml4t_engineer-0.1.0-py3-none-any.whl (386.4 kB view details)

Uploaded Python 3

File details

Details for the file ml4t_engineer-0.1.0.tar.gz.

File metadata

  • Download URL: ml4t_engineer-0.1.0.tar.gz
  • Upload date:
  • Size: 602.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ml4t_engineer-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d7e31bf1d348755ff4b0f12a00dc501fc62092c4dae1467efbea038db3e55b30
MD5 da53a64ae09bd296df89c78337b0b983
BLAKE2b-256 c5f2fb8fc782b4f2c022364a064b03a3cbb64a4d9aed969ec1e6ea39676bcca8

See more details on using hashes here.

Provenance

The following attestation bundles were made for ml4t_engineer-0.1.0.tar.gz:

Publisher: release.yml on ml4t/engineer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ml4t_engineer-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: ml4t_engineer-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 386.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ml4t_engineer-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b7688464dd1b20796d040d66b98068d0ef68f692a3d2dcaea1a2aa11ae7607f2
MD5 aefc075739d11044b0566599055a65f4
BLAKE2b-256 f961df0f89a026de70d558a85ed4a63dc924eed22b63ba5096c0b7f6879505f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for ml4t_engineer-0.1.0-py3-none-any.whl:

Publisher: release.yml on ml4t/engineer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page