Alpha Factory is a two-layer combinator. Layer 1 produces individual alpha signals from any recipe. Layer 2 fuses them, ranks them, and emits one actionable decision per symbol per tick. Same architecture in Python (backtest) and C++23 (live).
Why split? Because the recipe layer and the scheduling layer change at different rates. Signals get added monthly. The combinator gets touched once a quarter. The boundary makes both safer.
Produces individual alpha signals. One class per recipe: indicator, HMM, ML, factor. Each takes a window of data (L1 / L2 / L3) and emits a typed direction + confidence. No fusion happens here. No portfolio decisions. Just the read.
# Layer 1 — every signal implements this contract. class AlphaSignal(Protocol): def name(self) -> str: ... def required_data(self) -> DataSpec: ... def emit(self, w: Window) -> SignalOut: # direction ∈ {-1, 0, +1} # confidence ∈ [0.0, 1.0] ...
Fuses the per-tick output of N signals into one bet per symbol. Five built-in methods. Confidence is a first-class output, not a derived quantity. The downstream Scoreboard sorts across symbols, surfacing the top conviction reads for portfolio construction.
// Layer 2 — combinator contract (Python & C++23 share the shape). class Combinator(Protocol): method: FusionMethod # equal/conf/vote/max/min def fuse(self, ss: list[SignalOut]) -> FusedOut: ... def rank(self, all: dict[Symbol, FusedOut]) -> Scoreboard: ...
All five take the same input, a list of SignalOut structs, and emit the same shape. Method is a runtime parameter, not a code path. Hot-swap per asset class or per environment.
Every signal gets one vote. Baseline that survives any regime by refusing to over-trust any single read.
Each signal's contribution scales with its own confidence. The default, and the closest analog to Medallion-style ensembles.
Count directional votes; ignore magnitude. Robust to a single outlier signal blowing up the average.
Defer to whichever signal is most confident at this tick. Aggressive, and only safe when at least one signal's confidence is genuinely well calibrated.
Conservative: act only when the least-sure signal still agrees with the direction. Lots of NEUT output; small but high-quality positions.
All five are pure functions. Switching method at runtime is a one-line config change, with no recompile, no recalibration, no signal redeployment.
Same combinator. Two runtimes. Backtest in Python for fast iteration and a full ecosystem of factor / data libraries. Live in C++23 for sub-millisecond fusion, lockless ring buffers, deterministic latency.
Recipe iteration, data exploration, parameter sweeps, walk-forward validation. Loads any HDF5 / Parquet / pandas frame, supports arbitrary lookback windows, full vectorization where signals permit.
fuse() contract as live Python and C++23 share types (SignalOut, FusedOut, Scoreboard) through a small IDL. A signal validated in the lab ships to live without a port. The combinator method is a string at runtime.
equal, conf, vote, max, min}Lockless ring buffers, NUMA-pinned threads, monotonic timestamps. Tick-to-decision latency under 1 ms on commodity hardware. Designed to plug into existing OEMS stacks via the StratCraft execution adapters.
std::expected · concepts · mdspanFrom market data to portfolio order, in under a millisecond. The combinator is the third step.
| Key | Value |
|---|---|
| protocol | alpha-factory · v1 · internal codename Sigma |
| layers | 2: Signal Factory (recipes) + Combinator (fusion) |
| signal_pack | 4 categories: indicator · hmm · ml · factor |
| data_layers | 3 tiers: L1 OHLCV · L2 318-factor · L3 alt-data |
| fusion_methods | equal · conf · vote · max · min · runtime parameter |
| output_shape | FusedOut { dir ∈ [-1,0,+1], conf ∈ [0,1] } · per symbol · per tick |
| runtimes | Python (backtest · lab) · C++23 (live · production) |
| latency_live | < 1 ms tick-to-decision · commodity hardware · NUMA-pinned |
| distribution | StratCraft Marketplace plugin · Pro tier |
| execution | OEMS adapter · IBKR · Alpaca · Tradier · OANDA · per-broker risk overlay |
| backtest_engine | StratCraft LEAN-compatible runner · walk-forward built in |
| licensing | commercial · plugin license · source-available to Enterprise |
Two layers.
Five methods. One decision per tick.