Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mathematicalcompany.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

The Quant Flow upgrades the autonomous decision loop from simple heuristics to an quantitative pipeline. Ten modules replace hardcoded edge estimation with factor-based alpha modeling, formal hypothesis lifecycle management, regime-aware strategy selection, and constraint-aware portfolio optimization.

Architecture

The quant flow wraps Rust primitives (MarkovRegimeModel, VpinDetector, prediction_greeks, cornish_fisher_var, etc.) into a cohesive pipeline that runs inside the oversight loop.
NAV Returns
    |
    v
RegimeDetector -----> ResearchIntelligence (triggers)
    |                         |
    v                         v
AlphaModel -----> SignalEnsemble -----> HypothesisManager
    |                                        |
    v                                        v
RiskAnalytics                          Autopilot (deploy)
    |                                        |
    v                                        v
PortfolioOptimizer              AlphaDecayTracker (retire)
    |
    v
PerformanceAttribution

Regime Detection

Classifies fund-level market regime using a 3-state Hidden Markov Model (calm/volatile/crisis) with trend and mean-reversion overlays.
from horizon.fund import RegimeDetector

detector = RegimeDetector()
snap = detector.update(nav_returns)
# snap.regime: "trending_up", "trending_down", "mean_reverting", "volatile", "quiet"
# snap.confidence: 0.0-1.0
# snap.volatility, snap.trend_strength, snap.mean_reversion_score
Regime transitions trigger research events. The research pipeline filters strategy types by regime: trending regimes favor directional strategies, quiet/mean-reverting regimes favor market-making.
RegimeStrategy PreferencePosition Scale
quietMarket-making1.0x
trending_up / trending_downDirectional1.0x
mean_revertingMarket-making1.0x
volatileReduced exposure0.7x
crisisMinimal exposure0.5x

Multi-Factor Alpha Model

Replaces the naive edge = 0.05 * fitness with a 7-factor model that self-calibrates using information coefficients (IC).
from horizon.fund import AlphaModel

model = AlphaModel()
estimate = model.estimate_alpha(
    market_id="will-x-win",
    price=0.55,
    volume_24h=50_000,
    median_volume=30_000,
    days_to_expiry=14,
    current_spread=0.03,
    avg_spread=0.05,
)
# estimate.composite_alpha: weighted factor combination
# estimate.confidence: based on IC significance
# estimate.factor_values: per-factor breakdown

Prediction Market Factors

FactorSignalComputation
LiquidityVolume ratiotanh(volume_24h / median_volume - 1)
MomentumPrice trendtanh(price_change * 10)
Mean-reversionDistance from 0.51 - abs(price - 0.5) * 2
Event proximityTime to expiry1 / (1 + days_to_expiry)
SpreadSpread vs. averagetanh((avg - current) / avg)
Cross-marketExchange divergencePrice difference, clamped
EntropyUncertaintyshannon_entropy(price), normalized
Factor weights are proportional to IC_IR (mean IC / std IC). Factors with negative IC get sign-flipped. The model reweights automatically as outcomes are recorded.
# Wire into research pipeline
research.set_edge_estimator(model.as_edge_estimator())

# Record outcomes for IC updating
model.record_outcome("will-x-win", 1.0)  # resolved YES
model.update_ics()  # recompute weights

# Inspect factor quality
for f in model.factor_report():
    print(f"  {f.name}: IC={f.ic:.3f} IR={f.ic_ir:.3f} sig={f.is_significant}")

Hypothesis Framework

Tracks trading ideas through a formal lifecycle with Bayesian updating and statistical validation.
from horizon.fund import HypothesisManager, HypothesisState

mgr = HypothesisManager()

# Form a hypothesis
hyp = mgr.form(
    market_id="will-x-win",
    statement="Market underprices YES due to recency bias",
    direction="yes",
    edge=0.08,
    confidence=0.6,
    source="alpha_model",
)

# Update with evidence (Bayesian posterior update)
hyp = mgr.update_evidence(hyp.hypothesis_id, observed_return=0.02)
# confidence moves toward 1.0 when evidence aligns with direction

# Validate with backtest results
hyp = mgr.validate(
    hyp.hypothesis_id,
    backtest_sharpe=1.5,
    p_value=0.02,
    walk_forward_pct=0.7,
)
# State: FORMED -> VALIDATED (if criteria met)
# Uses deflated Sharpe with multiple-testing correction

Hypothesis Lifecycle

FORMED -> BACKTESTING -> VALIDATED -> MONITORING -> DECAYING -> RETIRED
                 |                                       |
                 +-----> stays FORMED (retry)      INVALIDATED
Competing hypotheses for the same market are tracked. The best hypothesis (highest confidence * edge) wins deployment priority. SQLite persistence survives restarts.

Signal Ensemble

Combines multiple signal sources with IC-weighted blending and redundancy detection.
from horizon.fund import SignalEnsemble, Signal
import time

ensemble = SignalEnsemble(min_signals=2)

# Submit signals from different sources
ensemble.submit(Signal(
    name="alpha_model", value=0.3, confidence=0.7,
    timestamp=time.time(), source="factors", market_id="will-x-win",
))
ensemble.submit(Signal(
    name="regime", value=0.5, confidence=0.8,
    timestamp=time.time(), source="hmm", market_id="will-x-win",
))

# Combine with redundancy penalty
output = ensemble.combine("will-x-win")
# output.combined_signal: IC-weighted average
# output.combined_confidence: adjusted for redundancy
# output.weights_used: {"alpha_model": 0.55, "regime": 0.45}
# output.redundancy_penalty: max pairwise correlation
Signals with correlation > 0.7 are penalized to avoid double-counting. IC and hit rate are tracked per signal for dynamic reweighting.

Research Intelligence

Event-driven research triggers replace purely timer-based scanning.
from horizon.fund import ResearchIntelligence

intel = ResearchIntelligence()

# Events fire triggers with priorities
intel.on_regime_change("quiet", "volatile")     # priority 1
intel.on_volume_spike("market-a", 100_000, 30_000)  # priority 2
intel.on_new_market("new-market-slug")           # priority 3

# Cross-market divergence detection
intel.register_pair("poly-btc-100k", "kalshi-btc-100k")
intel.update_prices({"poly-btc-100k": 0.45, "kalshi-btc-100k": 0.52})
# Emits cross_market_divergence trigger if divergence > threshold

# Consume highest-priority triggers
triggers = intel.consume_triggers(max_count=5)
for t in triggers:
    print(f"  [{t.priority}] {t.trigger_type}: {t.market_id}")
Attribution chains track which triggers led to profitable deployments, allowing the system to prioritize trigger types that generate alpha.

Portfolio Optimization

Constraint-aware optimizer that replaces simple equal-weight allocation.
from horizon.fund import PortfolioOptimizer, OptimizationConstraints

optimizer = PortfolioOptimizer(
    constraints=OptimizationConstraints(
        max_per_market=0.10,    # 10% max per market
        max_per_exchange=0.40,  # 40% max per exchange
        max_turnover=0.20,      # 20% max turnover per rebalance
        max_positions=50,
    ),
    total_capital=100_000,
)

result = optimizer.optimize(
    strategy_names=["mm_btc", "dir_eth", "mm_politics"],
    probs=[0.6, 0.7, 0.55],   # estimated probabilities
    prices=[0.5, 0.5, 0.5],   # current market prices
)
# result.target_weights: {"mm_btc": 35000, "dir_eth": 40000, "mm_politics": 25000}
# result.expected_return, result.expected_risk
# result.turnover, result.violations
Uses Kelly-based expected returns + Ledoit-Wolf shrinkage covariance + projected gradient descent with constraint projection. Drift-based rebalancing replaces time-only rebalancing. Enable in FundConfig:
config = FundConfig(
    total_capital=100_000,
    optimization_enabled=True,  # Use PortfolioOptimizer instead of CapitalAllocator
)

Risk Analytics

Regime-conditional risk limits, Cornish-Fisher tail risk, and portfolio Greeks.
from horizon.fund import RiskAnalytics

risk = RiskAnalytics()

# Regime-conditional limits
limits = risk.dynamic_limits("volatile")
# limits.position_scale: 0.7 (reduce exposure)
# limits.var_limit: tighter
# limits.spread_multiplier: 1.3 (widen spreads)

# Tail risk with Cornish-Fisher adjustment
report = risk.tail_risk(returns)
# report.cf_var, report.cf_cvar: adjusts for skewness and kurtosis
# report.historical_var, report.historical_cvar: empirical percentile
# report.skewness, report.kurtosis, report.tail_ratio

# Portfolio Greeks (prediction market positions)
greeks = risk.portfolio_greeks([
    {"strategy_name": "mm_btc", "price": 0.55, "size": 100, "is_yes": True},
    {"strategy_name": "dir_eth", "price": 0.70, "size": 50, "is_yes": True},
])
# greeks.total_delta, greeks.total_gamma, greeks.total_theta, greeks.total_vega
# greeks.per_strategy: breakdown by strategy
Enable regime-conditional risk in FundConfig:
config = FundConfig(
    regime_risk_enabled=True,   # Dynamic position limits based on HMM regime
)

Alpha Decay Tracking

Monitors edge erosion and predicts when strategies should be retired.
from horizon.fund import AlphaDecayTracker

tracker = AlphaDecayTracker()

# Record edge observations over time
tracker.record_edge("mm_btc", 0.08, timestamp=t0)
tracker.record_edge("mm_btc", 0.06, timestamp=t1)
tracker.record_edge("mm_btc", 0.04, timestamp=t2)

# Fit exponential decay
profile = tracker.fit_decay("mm_btc")
# profile.half_life_days: estimated time to lose half the edge
# profile.predicted_zero_crossing: when edge drops below 0.005
# profile.edge_type: "structural", "temporary", or "unknown"
# profile.r_squared: fit quality

# Check if strategy should be retired
if tracker.should_retire("mm_btc", min_edge=0.01):
    fund.remove_strategy("mm_btc")

# Automated alerts
for alert in tracker.check_alerts():
    print(f"  {alert.alert_type}: {alert.strategy_name} - {alert.message}")
The autopilot uses decay tracking to auto-retire strategies whose edge has decayed below threshold.

Execution Intelligence

VPIN toxicity detection, inventory risk management, and execution scheduling.
from horizon.fund import ExecutionIntelligence

exec_intel = ExecutionIntelligence(vpin_threshold=0.7)

# Per-market toxicity monitoring
alert = exec_intel.update_toxicity("btc-100k", price=0.55, volume=500, is_buy=True)
if alert:
    # alert.recommended_action: "widen_spread", "reduce_size", or "halt_trading"
    print(f"VPIN={alert.vpin:.2f} -> {alert.recommended_action}")

# Inventory risk for market-making
report = exec_intel.inventory_risk(
    market_id="btc-100k",
    mid_price=0.55,
    net_inventory=200,
    volatility=0.15,
)
# report.reservation_price: inventory-adjusted fair value
# report.optimal_spread: Avellaneda-Stoikov optimal spread
# report.recommended_bid, report.recommended_ask

# Execution scheduling
schedule = exec_intel.schedule_execution(
    market_id="btc-100k",
    total_size=1000,
    urgency=0.3,     # patient
    depth=5000,
)
# schedule.method: "twap"
# schedule.slice_sizes, schedule.interval_secs
VPIN alerts feed into the adaptive execution tuner as Rule 5 (toxicity-driven spread widening).

Performance Attribution

Fund-level alpha/beta decomposition, strategy contribution, and cost analysis.
from horizon.fund import PerformanceAttribution

attr = PerformanceAttribution()

# Feed returns each cycle
attr.update(portfolio_return=0.002, benchmark_return=0.001)

# Compute decomposition
snap = attr.compute()
# snap.alpha_beta.alpha: excess return above benchmark
# snap.alpha_beta.beta: market sensitivity
# snap.alpha_beta.information_ratio: alpha / tracking error

# Per-strategy contribution
for s in snap.strategy_attributions:
    print(f"  {s.strategy_name}: contribution={s.contribution:.1%} sharpe={s.sharpe:.2f}")

# Cost breakdown
cost = snap.cost
# cost.spread_cost, cost.slippage_cost, cost.fee_cost, cost.cost_pct

Oversight Loop Integration

All 10 modules are wired into the FundManager oversight loop automatically:
TickStepModule
Every7bRegimeDetector.update() — regime transitions fire research triggers
Every8cRiskAnalytics.dynamic_limits() — regime-conditional position limits
58dRiskAnalytics.portfolio_greeks() — fund-level Greeks snapshot
Every9bExecutionIntelligence.update_toxicity() — per-market VPIN
N10PortfolioOptimizer.optimize() — replaces allocator when enabled
N13AlphaModel + HypothesisManager + AlphaDecayTracker — enhanced research-to-deploy
6014bAlphaDecayTracker.check_alerts() + HypothesisManager.check_decay()
Every18ResearchIntelligence.consume_triggers() — event-driven research
6019PerformanceAttribution.compute() — attribution snapshot

Configuration

Three new fields on FundConfig control the quant flow:
from horizon.fund import FundConfig

config = FundConfig(
    total_capital=500_000,
    optimization_enabled=True,         # Use PortfolioOptimizer (default: False)
    regime_risk_enabled=True,          # Regime-conditional risk limits (default: False)
    attribution_interval_ticks=60,     # Attribution snapshot frequency (default: 60)
)
The quant modules are always instantiated and available via properties (fund.regime_detector, fund.alpha_model, etc.) even when optimization_enabled and regime_risk_enabled are False. The flags only control whether they replace the defaults in the oversight loop.

Rust Primitives Used

Python ModuleRust Functions
RegimeDetectorMarkovRegimeModel (3-state HMM)
AlphaModelinformation_coefficient, edge, shannon_entropy
AlphaDecayTrackersignal_half_life
HypothesisManagerdeflated_sharpe, benjamini_hochberg
SignalEnsemblecombine_signals, information_coefficient, signal_half_life
PortfolioOptimizermulti_kelly, ledoit_wolf_shrinkage
RiskAnalyticscornish_fisher_var, cornish_fisher_cvar, prediction_greeks
ExecutionIntelligenceVpinDetector, OfiTracker, reservation_price, optimal_spread, mm_size