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 pricesKey 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.