Execution Model

Strategies never place orders directly. They return target weights, and the engine derives orders, simulates fills with a one-day delay, and marks the book to market.

Delay-1 Flow

text
# Weight-based, delay-1 execution

Day T (close):
  weights = strategy.signal(ctx)        # target weights
  weights = guardrails.apply(weights)   # 8 checks, may scale/reject
  orders  = derive_orders(weights, portfolio)  # from weight deltas

Day T+1 (open):
  fills   = fill_at_open(orders)        # estimated open price
  portfolio.update(fills)

Day T+1 (close):
  portfolio.mark_to_market(close)       # PnL, drawdown, exposures

Reconciliation (T+1, 9:30 AM ET):
  adjust estimated fills -> actual open prices

Key Rules

  • Signal at T close, fill at T+1 open. This avoids look-ahead bias — today's signal cannot be filled at today's close.
  • Orders are derived from weight deltas. The engine compares target weights to current positions and trades the difference.
  • Mark at close, not at fill. Fills happen at the open; the portfolio is marked to the close price for PnL and drawdown.
  • Reconciliation replaces estimated fill prices with actual T+1 open prices the next morning. See Deployment.

For the full backtest configuration, metrics, and scoring, see the Backtesting Guide.