BUILD THE LEDGER BEFORE JUDGING THE STRATEGY
What is futures backtesting?
Futures backtesting applies trading rules to historical observations under a specified execution and accounting model. The output is a conditional simulation, not a record of orders that actually traded. A useful result lets you trace the final balance back to the contract, signal, entry, exit, quantity and costs of each trade.
A root symbol is not a contract
A root identifies a product family. An outright adds a contract month and year, with an expiry and settlement process. Different expiries can trade at different prices and liquidity. A continuous research symbol is a constructed series, not one instrument you could buy throughout its history.
Price movement is not account P/L
For a linear contract quoted in price points, gross P/L equals signed price change × point value × contracts. Tick value equals tick size × point value. Account margin is collateral, not a substitute for the contract multiplier or a cap on loss.
(exit − entry) × point value × quantitySHORT(entry − exit) × point value × quantityThese are pre-cost price P/L formulas in the contract’s quoted currency. Currency conversion, daily settlement cash flows and account margin rules require their own treatment. The worked example below uses one USD-denominated specification.
Check the exchange’s actual contract specification rather than inferring units from a ticker. CME Group’s contract P/L explanation shows why tick size, contract size and quantity must agree.
EdgeVeris today: the reference engine evaluates a single instrument using explicitly configured contract units and whole-contract long/short targets. Hosted data selection is bounded by the available catalogue. A symbol definition or chart menu is not a promise of available history or data rights.
AN AUDIT YOU CAN APPLY TO ANY ENGINE
What can break a futures backtest?
These checks separate an accounting or modeling error from a weak trading idea. Correct calculations can still rest on unrealistic assumptions.
On a narrow screen, focus this table and scroll horizontally. Each row connects a failure to a concrete check and the current product boundary.
| Issue | Why it matters | Example failure | How to test it | EdgeVeris handling / limit |
|---|---|---|---|---|
| Contract multiplier | A price point is not a dollar. | A 2-point move is treated as $2 instead of 2 × point value × quantity. | Recalculate one winning and one losing trade from prices. | The reference engine uses configured point value. A wrong specification still produces wrong economics. |
| Tick value | Ticks and points are different units. | Multiplying tick count by point value overstates P/L. | Check tick value = tick size × point value. | The cost model converts ticks using contract units. T18 checks a declared tick value against the entered tick size × point value, not an exchange-specification database. |
| Double-counted costs | Fill prices may already include slippage. | Subtracting slippage again from already-net results. | Reconcile raw prices, recorded costs and final net P/L. | Reports distinguish recorded costs and modeled scenarios. In T18, unknown included costs prevent alternative-cost reconstruction. |
| Quantity mismatch | Costs scale with contracts, not row count. | Charging one contract on every trade in a variable-size ledger. | Sum matched entry/exit contract quantities, not just trades. | Whole-contract targets and quantity-aware costs are supported. T18 handles fully closed matched quantities, not a partial-fill ledger. |
| Session boundaries | An overnight session spans civil dates. | Resetting a daily loss limit at UTC midnight rather than the intended trading-day boundary. | Inspect trades either side of the session rollover and a weekend. | The current data layer assigns trading days using a Chicago-time rollover. It is not a complete exchange-calendar service. |
| Lookahead | The signal must exist before the modeled fill. | Using the completed bar high to buy at that same bar’s open. | Compare information timestamps, signal time and earliest executable price. | Reference-engine targets execute at the next bar open. This does not prove user Python is free from future-data leakage. |
| Continuous-series artifacts | Adjusted research prices are not executable contract prices. | Applying absolute stops to a back-adjusted history as if it were an outright. | Record adjustment method and map every fill to an actual contract. | No built-in continuous-contract construction or continuous execution is claimed. Use the explicitly bound outright dataset. |
| Roll gaps | A contract switch can change quoted price without a tradeable gain. | Booking the old-to-new contract price difference as strategy profit. | Reconcile closing the old and opening the new contract, including costs. | The supported single-outright workflow does not simulate a roll schedule. Joining files is not a roll model. |
| Contract selection | Liquidity and contract choice change through history. | Choosing whichever expiry later produced the best backtest. | Predeclare a selection rule and use only information then available. | Exact dataset/symbol binding prevents silent substitution. It does not establish historical liquidity or remove selection bias. |
| Coarse-bar ambiguity | OHLC does not reveal the order of extremes. | Both stop and target are touched and the target is assumed first. | Count ambiguous bars and compare finer data or adverse-order scenarios. | Reference-engine same-bar conflicts use stop-first precedence. That is a policy, not observed tick order. |
| Optimistic same-bar fills | Signal time and order eligibility constrain fills. | A close-generated signal is filled earlier inside that bar. | Audit signal-to-entry timestamps and first-bar exit behavior. | Next-open entries are explicit. Protective exits remain bar based, with disclosed gap and touch rules. |
| Missing slippage | A zero-friction edge may not survive execution. | Treating every market order as a guaranteed open-price fill. | Stress entry and exit assumptions separately, then inspect net outcomes. | Configured legacy tick-based or modern entry-only cash/percentage scenarios are available. They do not forecast liquidity, queue priority or market impact. |
| Current fees applied historically | Fee schedules and account arrangements vary. | Calling today’s rate the exact cost of a past trade. | Label the schedule, effective dates and any constant-rate approximation. | Rates are configured assumptions, not an automatically verified archive of historical broker and exchange fees. |
| Timezone and DST | A local session can shift relative to UTC. | Using one fixed UTC opening time all year. | Test named-zone conversion around DST and early-close dates. | UTC timestamps and named-zone trading-day assignment are used. Holiday and early-close coverage needs separate inspection. |
| Mixed resolutions | Resampling can change signals, bar boundaries and exits. | Researching on one interval but silently evaluating on another. | Keep source interval, aggregation and evaluation interval with the result. | Data and execution context are retained with inputs. A chart display interval is not proof of a supported calculation interval. |
FIRST-PARTY UTILITY · T18
Six trades. Ten contracts. Every dollar accounted for.
This is the public cost tool’s synthetic, fully closed six-trade ledger, not market performance or a broker quote. Quantities vary. Each row’s gross P/L is already the total for that trade, so it must not be multiplied by quantity again.
- Point value
- $20 / point / contract
- Tick size
- 0.25 points
- Tick value
- 0.25 × $20 = $5
- Combined fees
- $2.50 / contract / side
- Slippage assumption
- 1 tick / contract / side
- Entry + exit
- 2 sides per round turn
| Trade | Contracts | Gross P/L | Fees | Slippage | Net P/L |
|---|---|---|---|---|---|
| 1 | 1 | $250.00 | $5.00 | $10.00 | $235.00 |
| 2 | 2 | $-120.00 | $10.00 | $20.00 | $-150.00 |
| 3 | 3 | $480.00 | $15.00 | $30.00 | $435.00 |
| 4 | 1 | $-85.00 | $5.00 | $10.00 | $-100.00 |
| 5 | 2 | $310.00 | $10.00 | $20.00 | $280.00 |
| 6 | 1 | $65.00 | $5.00 | $10.00 | $50.00 |
| Total | 10 | $900.00 | $50.00 | $100.00 | $750.00 |
One additional tick on each side costs another $100. The unchanged ledger then nets $650. A $5 round-turn fee is equivalent to $2.50 on entry plus $2.50 on exit. It is not $5 on each side.
If the input is already net
Start with $750 net and known included costs of $150. Reconstruct $900 gross once, then apply the new total cost of $250 to obtain $650. Deducting that entire $250 directly from $750 would double-count the original $150.
If included costs are unknown
Do not guess the gross result. T18 can summarize the original net ledger, but alternative-cost reconstruction stays unavailable. Likewise, if slippage is embedded in execution prices, first establish which P/L and cost fields include it.
Open the free futures backtest cost audit → Change units, quantity, fee convention and slippage scenarios locally. No signup is required. The tool reconciles a fixed ledger. It does not generate fills, predict market impact, or re-run a strategy whose entries and exits would change under different execution.
Do not confuse the two cost models. T18 above applies its declared entry and exit slippage. The current EdgeVeris report scenario instead applies entry-only slippage, in currency per contract or a percentage of entry notional, and commission per side, in currency per contract or a percentage of traded notional. A saved modern scenario replaces the corresponding legacy cost fields rather than stacking them. Inspect the actual recorded model before comparing its results with a T18 scenario.
MORE DETAIL IS NOT PERFECT EXECUTION
One bar can hide two very different trades.
Suppose a long position is already open at 100, with a stop at 99 and a target at 102. A later bar has open 100, high 103, low 98 and close 101. Both of these illustrative paths fit those same four prices:
High first
- 100 open
- 103 high · target touched
- 98 low
- 101 close
Low first
- 100 open
- 98 low · stop touched
- 103 high
- 101 close
OHLC alone cannot identify which path occurred. Assuming the favorable sequence changes the trade outcome without adding evidence. Even knowing a level was touched does not establish that a real order filled there.
1-minute bars
Compact and useful for bar-based signals, but aggregate many possible price sequences. Stops and targets can both fall inside one bar.
1-second bars
Narrow the unknown sequence to smaller intervals, at greater data and computation cost. They are still OHLC aggregates, not the complete trade tape.
Tick / event data
Can reveal recorded event order, depending on the schema. Trades alone still do not reconstruct queue priority, available depth or your order’s impact.
EdgeVeris reference model: close-generated targets are applied at the next bar open. If stop and target are both reached in the same bar, the stop takes precedence. A stop gapped through is evaluated from the adverse open rather than its untouched level. These are explicit simulation rules, not a claim of tick-perfect fills. Finer source bars do not add an order-book simulator.
Keep the signal interval, execution interval and chart display interval distinct. Compare a sample of ambiguous trades before paying the computational cost of finer data. No empirical claim about how much a finer interval improves results is made here. See data feeds and execution models for the broader model-selection problem.
A LONG HISTORY NEEDS A CONTRACT POLICY
Continuous futures, rolls and trading sessions
A research series is not a fill contract
A continuous series joins successive expiries so an indicator can use a longer history. Unadjusted concatenation retains inter-contract gaps. Back-adjustment modifies earlier prices to reduce those discontinuities, changing the meaning of historical absolute price levels. The adjustment and roll rule must be recorded, not inferred from a chart’s smoothness.
A roll policy also needs a decision time. A volume-based switch must use information available when the choice was made, not the completed day’s volume before that day ended. Separate the series generating the signal from the actual contracts used for execution and P/L. A position roll means closing one contract and opening another, with the relevant prices and costs. See CME’s expiry and roll explanation and QuantConnect’s explicit distinction between a continuous symbol and its mapped contract.
Current EdgeVeris boundary: the supported hosted execution workflow binds an outright-contract dataset. It does not build continuous futures, choose a historical roll schedule or execute automatic rollover trades. Loading or charting a continuous series is not evidence of continuous-contract execution support. Do not treat concatenated files as an implemented roll model.
A trading day is not necessarily a calendar day
An evening session can belong to the following trading day. Session selection affects indicator resets, daily limits, overnight exposure and period comparisons. Record the named timezone, allowed trading hours and date assignment. A fixed UTC offset is not a year-round substitute for a timezone with daylight-saving rules. Holiday and early-close schedules can require exceptions.
Current EdgeVeris boundary: timestamps are normalized to UTC and the current futures data preparation assigns trading days using a 17:00 America/Chicago rollover with weekend handling. That is a trading-date convention, not a complete exchange holiday/early-close calendar or universal session filter. The reference engine uses supplied bars and signals. Session restrictions must be reflected in the prepared data or strategy logic and checked explicitly.
KEEP WITH YOUR RESEARCH RECORD
A practical futures backtest checklist
Use these checks before interpreting performance. The checklist remains readable without JavaScript and is formatted for printing with your browser’s Print command.
Data
- Record the source, exact interval, schema and bar timestamp convention.
- Check missing, duplicate and out-of-order observations.
- Keep a reproducible data version. Verify permitted use separately.
Contract
- Record the outright symbol, expiry and currency.
- Verify tick size × point value = tick value.
- Document selection, roll and adjustment rules, or explicitly state no roll.
Session
- Specify the named timezone and trading-day rollover.
- Check overnight trades, weekends, DST and early closes.
- Align indicator resets, daily limits and evaluation boundaries.
Execution
- State signal time and earliest possible entry.
- State gap, touch and same-bar stop/target rules.
- Inspect ambiguous trades rather than hiding them in aggregate P/L.
Costs
- Reconcile a long and a short trade with their quantities.
- Record per-side or round-turn fees and included cost components.
- Stress slippage without deducting already-included costs twice.
Validation
- Preserve code, input set, data and cost context together.
- Record the search and fix rules before OOS evaluation.
- Keep a genuinely untouched holdout and document remaining limitations.
ACTUAL EDGEVERIS IMPLEMENTATION
From Python inputs to an inspectable report.
Python supplies strategy logic. The backtest engine supplies the execution and accounting model. The analysis workflow then organizes the evidence. These are distinct responsibilities. EdgeVeris is a research application, not presented here as an open-source Python backtesting library.
- Bind the experiment. Select the available dataset and interval, code version, inputs and execution costs. Confirm the outright contract and period instead of assuming a root symbol implies continuous history.
- Prepare the strategy. The supported Python interface produces target positions from bars and inputs. Preserve the code and parameter values. See the reproducible Python backtest workflow. Code validation is not proof that arbitrary logic contains no lookahead.
- Inspect the Initial Backtest. Compare trades, quantities, exit reasons, gross/net results and cost assumptions. Reconcile at least one long and one short trade before searching parameters.
- Evaluate fixed choices. Optimization, Development/Validation, robustness, Monte Carlo and Final Holdout reports retain the selected context. Available portfolio diagnostics add synchronized strategy context. Downloadable reports collect supported stored evidence, not a guarantee of future returns.


No rights-cleared empirical futures demonstration is presented on this page. The public numerical example is synthetic and reproducible in T18. Available instruments, periods and permitted data use must be confirmed separately, not inferred from illustrative symbols or screenshots.
CHOOSE A MODEL THAT FITS YOUR QUESTION
What EdgeVeris does not model
- Queue position, full depth and venue microstructure. A bar touching a price does not prove your limit order would execute. The current reference engine is not an order-book simulator.
- Latency, market impact or capacity. Fixed slippage assumptions are stress scenarios, not a forecast of execution at a particular size or connection speed.
- Tick-perfect event sequencing. Same-bar stop/target precedence is a declared policy. OHLC cannot supply an unobserved path.
- Automatic continuous-contract construction and rollover execution. The current supported workflow uses an explicitly bound outright. It is not a multi-expiry roll engine.
- Guaranteed historical fee and session accuracy. Configured rates and the current trading-date convention do not certify every historical broker schedule, holiday or early close.
- Exchange margin, daily settlement and liquidation mechanics as a complete clearing model. Research P/L and report margin assumptions are not a complete broker or clearing-house model.
- Future profitability. Clean accounting and a disclosed execution model are necessary checks, not proof of an enduring edge.
A useful fit
Systematic futures researchers and Python strategy developers who want to inspect bar-based assumptions, compare fixed inputs and carry results into validation. This can include algorithmic prop-trading research, without implying a simulated challenge pass will become a live pass.
A different tool may be needed
Discretionary chart replay as the primary workflow, high-frequency research requiring queue-position simulation, or strategies dependent on detailed multi-contract roll execution. No backtesting product can supply guaranteed profitable strategies.
CORRECT CONSTRUCTION IS ONLY THE BEGINNING
Now ask how much evidence supports the strategy.
This page asks whether the futures backtest was constructed correctly. The strategy validation framework asks how much confidence the evidence warrants, through search discipline, parameter stability, OOS, robustness and holdout protection. For practical next steps, read optimization for stability and walk-forward testing and reused holdouts.
Monte Carlo comes downstream. Resampling a flawed trade ledger cannot repair wrong costs, contract selection, fills or sessions. Once the ledger is credible, compare sampling assumptions with the free drawdown tool. The R03 synthetic study shows that dependence assumptions can change risk estimates even when the underlying trade outcomes are unchanged. It is methodological evidence, not a futures-market return claim.
Build a backtest you can inspect.
Keep code, inputs, assumptions and evaluation reports connected.
Implementation and synthetic product evidence reviewed October 8, 2026. This is research methodology, not investment advice.