Education in research methods · Quantic Eagle operates only with its own capital. No client funds, investment advice or trading signals.

A backtest looks better. What actually changed?

You are developing a trading system and want to know whether its backtest follows the rules you intend to use. Two versions can assign identical scores to each stock and still make different purchases; a reported profit can hide losses on positions still open. If you use an AI assistant to examine research files, also check which files it analysed and which work it repeated. These internal cases and invented exercises help you check those steps. Start with the three-purchase case or choose a check below.

QE-RESEARCH-03 / 1.0

An improvement can still leave a loss

Your models use several variables as inputs, and you want to check whether they need all of them. In this internal research case, two variants, A and B, were trained with fewer variables than the reference configuration, called the “control”. A variant can lose less than the control: its profit improves but remains negative. A improves median profit in 15 of 22 comparisons and B in 16. Before choosing which to test further, also check how many results are positive and which groups are being compared.

Internal research, snapshot dated 22 September 2026. Results observed from 1 August to 14 September 2026 had already informed the research. They help examine past choices; they are not independent confirmation. Amounts are in USD; simulations start with USD 100,000. These are aggregates from internal simulations, calculated with the cost assumptions used at the time. They describe the recorded comparisons; they do not show net profitability or readiness for live trading.

To compare similar configurations, results are grouped by training conditions. Each file row contains medians for models sharing a group of training conditions. It does not represent a single model. Each variant has 22 comparisons: 21 groups are shared by both variants, while G07 appears only for A and G08 only for B, giving 23 distinct groups in total (44 rows in the CSV). Learned weights and other optimisation choices may differ, so the comparison does not fully isolate the effect of the number of inputs.

The median is the middle value after sorting results; with an even number of results, it is the average of the two middle values.

Variant A · 22 comparisons
Variant A · 22 comparisons
Variant B · 22 comparisons
Variant B · 22 comparisons

For each row, subtract control profit from variant profit. First count differences above zero, then count variant profits above zero. Zero is not a positive profit. The file retains the original precision; round only when displaying results.

Compare your reasoning

A improves 15 comparisons but has positive median profit in 9. B improves 16 comparisons but is positive in 7. In each set of 22 comparisons, the control has positive median profit in 6 groups. In group G01, A moves from −3,271.15 to −858.60 USD: an improvement of 2,412.55 USD that still leaves a loss. B reaches −441.84 USD; its improvement also leaves a loss.

Now compare A and B only across the 21 shared groups. A has higher recorded profit in 10 groups, B in 10, and one pair is tied; the median B-minus-A difference is zero. The counts 15 and 16 instead answer two separate comparisons against the control, each covering 22 groups. These results establish no winning variant. They compare aggregate medians with 1–2 models per group, not 21 independent trials or an estimate of attainable profit.

Full table

In the CSV, variant and group identify the variant and group. control_pnl and variant_pnl are median profits in USD; control_dd_pct and variant_dd_pct are median drawdowns expressed as percentages (5 means 5%). control_models and variant_models count the models summarised. Profit and drawdown are separate medians and do not necessarily describe the same model.

Variant / GroupControl · USDVariant · USDΔ USDMedian drawdown · % · C / VModels · C / V
A / G01-3,271.15-858.602,412.554.87 / 1.292 / 2
B / G01-3,271.15-441.842,829.314.87 / 0.822 / 2
A / G02-747.79-2,441.32-1,693.530.95 / 2.772 / 2
B / G02-747.790.00747.790.95 / 0.002 / 1
A / G031,733.65-192.08-1,925.734.80 / 1.192 / 1
B / G031,733.65316.08-1,417.574.80 / 1.922 / 2
A / G04-5,411.15-639.064,772.086.45 / 1.192 / 2
B / G04-5,411.15184.955,596.106.45 / 0.272 / 2
A / G05-5,720.53-561.375,159.167.93 / 0.872 / 2
B / G05-5,720.53-140.455,580.087.93 / 1.042 / 2
A / G06-998.06309.451,307.523.38 / 3.332 / 2
B / G06-998.061,204.122,202.193.38 / 1.022 / 1
A / G07-3,343.460.003,343.465.17 / 0.002 / 1
B / G08-3,232.70-166.503,066.205.84 / 0.432 / 1
A / G09-1,570.60-187.011,383.594.31 / 0.961 / 1
B / G09-1,570.60-1,380.28190.324.31 / 1.381 / 1
A / G10-4,155.302,448.716,604.006.90 / 4.312 / 1
B / G10-4,155.30-244.203,911.106.90 / 0.272 / 2
A / G11-1,879.9490.281,970.223.84 / 0.281 / 1
B / G11-1,879.94-471.971,407.983.84 / 3.991 / 2
A / G12-1,269.57-6,298.88-5,029.317.36 / 8.272 / 2
B / G12-1,269.57-207.141,062.437.36 / 0.982 / 1
A / G131,982.88-2,514.02-4,496.901.38 / 3.992 / 2
B / G131,982.88170.23-1,812.651.38 / 1.092 / 2
A / G14444.751,388.46943.702.79 / 3.312 / 2
B / G14444.751,388.46943.702.79 / 3.312 / 2
A / G15-4,711.13581.985,293.106.67 / 0.621 / 2
B / G15-4,711.13-869.613,841.526.67 / 0.951 / 2
A / G161,971.01-2,878.14-4,849.151.04 / 3.011 / 2
B / G161,971.01-1,494.31-3,465.331.04 / 2.111 / 2
A / G17430.201,721.461,291.260.69 / 0.991 / 2
B / G17430.20996.15565.960.69 / 3.271 / 1
A / G18-3,540.103,025.236,565.336.83 / 3.781 / 1
B / G18-3,540.10-189.553,350.556.83 / 0.661 / 2
A / G1919.61-491.79-511.410.28 / 0.492 / 1
B / G1919.61-771.72-791.340.28 / 0.972 / 2
A / G20-377.91-310.2267.692.14 / 1.292 / 2
B / G20-377.91-533.01-155.102.14 / 0.832 / 2
A / G21-483.67267.15750.821.69 / 0.452 / 2
B / G21-483.67-646.01-162.341.69 / 1.042 / 2
A / G22-635.74718.171,353.911.05 / 4.531 / 2
B / G22-635.74523.801,159.541.05 / 0.171 / 1
A / G23-142.35-644.23-501.890.20 / 0.752 / 2
B / G23-142.350.00142.350.20 / 0.002 / 1

Save the CSV and program in the same folder. The program link suggests QE-RESEARCH-03.py as the filename; rename it if your browser keeps .txt. Open a terminal in that folder and run the command. The program reads the CSV and prints the counts. It sends no data and places no trades.

python QE-RESEARCH-03.py QE-RESEARCH-03.csv

The download lets you recalculate these aggregates. It does not contain the prices, trades and models needed to repeat the original backtests. Source: QE-RESEARCH-03 / 1.0, an anonymous export from internal research.

Three problems that changed our research process

Reproducing predictions, assigning work and updating a report seemed straightforward. These internal cases show which checks were missing.

The predictions matched. The decision rules did not.

You already have a function deciding orders and are building another, perhaps to run simulations in a different environment. Before replacing it, you want to verify that the same data and rules produce the same orders. In the internal case, models, inputs and predictions matched. But when the rules allowed both a purchase and a sale, the two implementations resolved that conflict differently. They chose different directions despite matching predictions. The check found this divergence in the simulation; it did not recalculate economic results after correction.

Educational diagram · Not trading results

Where the paths diverge

Where the paths divergeIdentical scores. Different choices. Different portfolios. Check the path from prediction to order.
01Identical scores
02Different choices
03Different portfolios
Check the path from prediction to order.

To check a rewrite, start both versions from the same account rather than checking an isolated hour. Consider this invented example: the system may hold only one stock at a time. At 10, the existing version buys A and will hold it until 12; the rewrite does not buy it. At 11, a possible purchase of B appears. The existing version must exclude it because it still holds A; the rewrite can consider it because it has no open position. The difference at 10 changes what is possible at 11. Follow orders in sequence, comparing holdings and available money after each one.

The fieldbook shows how to find the first point where two versions produce different outputs and decide which calculations need repeating. Rerunning everything may be unnecessary; reusing results without checking which inputs they depend on can be just as mistaken.

The agent repeated analyses assigned to other requests

This is a different task: asking an AI assistant to examine research materials. It is not the model predicting markets and does not execute orders; it uses a language model to carry out assigned analyses. An AI component was supposed to review the day’s work in smaller groups, called batches. Yet each request received the full list. The program collecting responses did not fully check which items belonged to each assignment or had already appeared. Work assigned elsewhere could therefore be repeated.

Before another backtest, you need to decide which exports to repair: you are looking for inconsistent dates and missing values in twelve CSVs. Divide the work among four agents: A–C for the first, D–F for the second, G–I for the third and J–L for the fourth. They can write their own checking programs. In this invented case, however, you start each agent in the full folder and each checks all twelve files, ignoring its assignment. You receive 48 review cards for the same twelve CSVs: you have repeated each check four times and must read and reconcile extra reports before repairing the sources. The 48 cards are not 48 different files and do not establish four independent reviews. Limit accessible files to each assignment, record which files were actually read and compare deliveries with assigned files. In the free dossier, QE-BATCH-01 checks declared assignment and response identifiers, not the quality of the analyses. The Museum addresses a different goal: a second opinion on the same originals without showing the earlier verdict.

The economic question follows: did we retain enough information to establish whether the component helped? In the internal case, we had not. Spending was real and benefit could not be established from the retained evidence, so the component was suspended.

To estimate whether an AI agent saves work, design two trials on the same tasks with the same acceptance criteria: one using your usual process and one using the agent. This is a proposed comparison, not a result already obtained by Quantic Eagle. In both trials record human time, call costs, retries and file analyses accepted after checking their accuracy. Checking and repair time count towards cost. If you perform both trials yourself, record their order too: learning during the first may make the second faster.

When writing the report holds up calculations

We had calculations waiting to run and a program assigning them to available worker processes. The same program also prepared the report. While it wrote that report, it did not assign the next calculation: some workers waited even though work was ready. Saving previous results or starting more processes did not remove that wait. The problem was that report preparation blocked job assignment.

To keep calculations running, the program assigning jobs must be able to start the next one while another prepares the report. Save each completed result with its job identity and the data and program versions used. After an interruption, these records distinguish work to resume from work already finished. The free case below compares the minutes required by two ways of organising the work.

Six questions to use in your own project

  1. What information was available when the decision was made?
  2. Which outcomes had already been inspected when the model was selected?
  3. Does the curve include the value of open positions and deduct costs? Are deposits and withdrawals distinguished from gains and losses?
  4. Does the comparison change one thing or several conditions at once?
  5. Can someone else reproduce the result from the retained material?
  6. What outcome would make you abandon the hypothesis?

For each missing answer, specify which data to collect or which comparison to run before proceeding.

Research edition · Updated 14 October 2026

Profit improves. Does risk improve too?

We compare two implementations of the same risk rule in simulations of 672 model combinations. Members and periods are identical within each comparison. Profit improves in 439 comparisons and drawdown falls in 239, but both improve together in only 145. This shows why “more profit” and “less risk” are different conclusions.

Here OOS identifies a period not used to fit these models. It had already been consulted to select candidates, so it was not an independent final test. Drawdown measures the decline from an earlier peak in the simulated account-value curve.

Higher OOS profit: 439 / 672; Lower OOS drawdown: 239 / 672; Both improve: 145 / 672
Higher OOS profit439 / 672 · 65.3%439 / 672
Lower OOS drawdown239 / 672 · 35.6%239 / 672
Both improve145 / 672 · 21.6%145 / 672
The same 672 comparisons, three different criteria.
The same 672 comparisons, divided into four non-overlapping groups
Relative to the previous simulationLower drawdownDrawdown not lowerTotal
Higher profit145294439
Profit not higher94139233
Total239433672

The four inner cells sum to 672: 145 + 294 + 94 + 139. The 439 cases with higher profit include the 145 that also reduce drawdown; the 239 with lower drawdown include those same 145. “Not higher” and “not lower” include unchanged results, so they do not necessarily mean deterioration. Improvement over a previous version does not establish profitability, robustness or readiness to trade. These are aggregates from an internal comparison already used to select candidates.

Internal research, snapshot dated 19 September 2026. OOS period: 1 August 2025–31 July 2026. Paired comparisons across all 672 ensembles; the three chart counts overlap and must not be added together. The aggregates cannot reproduce the proprietary replay. These are aggregates from internal simulations, calculated with the cost assumptions used at the time. They describe the recorded comparisons; they do not show net profitability or readiness for live trading.

Aggregate data and scope · JSON

FREE EXERCISES · INVENTED DATA

Three decisions to try in your own lab

You change the minimum score required to buy: which calculations need repeating? Preparing each report holds up the next calculation: how much waiting time can you remove by preparing reports in a separate process? You apply a new rule to past data: what can you write in the record of original decisions? Three invented exercises let you try these choices.

You changed a rule. Which results can you reuse?

You are testing a rule for selecting stocks to buy. For each stock and day, the program supplies past prices to the model. The model returns a score: a number used to rank stocks and compare them with a threshold. After the first run, you instruct the program to save a CSV with one row per date and stock, such as “5 January, A, 0.65”. Keep scores for stocks that were not bought too. Here 0.65 is not a probability of profit. A is excluded by “score at least 0.70” but becomes eligible under “at least 0.60”. With the same model and prices, must you produce the score CSV again?

  1. Data and model Prices read by the model
  2. Scores One score per stock and date
  3. Choices and amounts Which stocks to buy and how many
  4. Trades and reports Costs and account value

If the table is wider than your screen, scroll horizontally. With a keyboard, focus the table and use the arrow keys.

ChangeKeepRepeat
Signal thresholddata, model, scoresselected stocks, share quantities, order and cost record, profit and account declines, report
Rule for conflicting signalsdata, model, scoresselected stocks, share quantities, order and cost record, profit and account declines, report
Amount per tradedata, model, scores, selected stocksshare quantities, order and cost record, profit and account declines, report
Cost chargeddata, model, scores, selected stocks, share quantitiesorder and cost record, profit and account declines, report
Members of the combined modeldatamodel, scores, selected stocks, share quantities, order and cost record, profit and account declines, report

No. This example calculates scores solely from prices, which you have not changed. A still receives 0.65, so you can read that value from the first run’s CSV. Selection does change: A now meets the minimum score. Start from the same initial account and simulate the decisions again in date order. Apply the stated rules for purchase amount, entry price and sale timing, then record quantities, proceeds and fees. These steps reconstruct holdings and cash in the second run; changing a threshold in the final report is not enough.

The table describes a simplified program: the model receives only prices, purchase amounts do not depend on remaining cash, and fees are subtracted after the orders have been selected. That is why changing fees alone leaves the order list unchanged in the table. A program that rejects unaffordable positions needs another check: a €200 order with a €1 fee cannot be funded with only €200. If you change the fee from zero to €1, you must repeat the decision about executing that order as well.

You lower the minimum score required to buy and the new simulation buys €800 of shares, leaving €200 before costs. Can you reuse the saved score for the next decision? Compare the inputs that produced it with those supplied by the new simulation. If the model reads only unchanged prices, the new purchase does not alter those inputs. If it also reads available cash, it now receives 200 where it previously received 1,000: the old score has not been checked for this situation. Run the same model with the new inputs; its result may stay the same or change. This does not automatically require retraining. Then check whether cash covers the order, including costs. The table’s final row assumes that replacing a model requires retraining the program combining the models: verify that dependency in your own system.

Ten minutes to calculate. Why fourteen between results?

You have three tests ready and one compute process. Each test takes 10 minutes, but results arrive at minutes 10, 24 and 38. Before starting more processes, you want to locate the eight minutes of waiting accumulated before the third result. Which start and finish times would distinguish slow computation, no ready work and waiting for a report?

Open the case and explanation

If the table is wider than your screen, scroll horizontally. With a keyboard, focus the table and use the arrow keys.

DesignFirst resultSecond resultThird resultLast report
Computation waits for reporting10 min24 min38 min42 min
Reporting runs separately10 min20 min30 min34 min

The case log shows that the process waits four minutes to prepare each report before starting the next test. With a separate reporting process, the next calculation can start immediately. The third result is ready at minute 38 in the first design and minute 30 in the second. Computation still takes 30 minutes in total: you have removed 8 minutes of waiting before the third result. The last report is ready at minute 42 or 34. A finished result and a finished report are different events.

The example assumes that writing reports does not slow the three calculations and that each result is saved before its report is prepared. On a real computer, the processes can compete for processor time, memory or disk access and run more slowly. Measure timings with and without reporting. If writing takes longer than calculation, also check how many reports remain queued.

The decision then and the simulation now

In this invented example, at 10:00 UTC on 5 January the model gives stock A a score of 0.62. The program compares that number with its minimum score required to buy. Rule v1 requires at least 0.65, so A is not bought. The next day, you lower the threshold to 0.60 and simulate 5 January again. The model reads the same prices and still gives A 0.62. What can you write in the decision record?

If the table is wider than your screen, scroll horizontally. With a keyboard, focus the table and use the arrow keys.

RecordRuleOutcome
5 January decision logv1 · ≥ 0.65No purchase
New simulation on 6 Januaryv2 · ≥ 0.60Simulated purchase

Keep both: “v1 did not buy” and “v2, applied to those data today, would have bought”. Do not replace the original log. If you chose 0.60 after seeing the 5 January outcome, that day has already influenced selection; it is no longer a fresh test.

The log documents what you retained. It does not by itself prove that the data were available then, that an order would have filled or that the new threshold will work in future.

To reproduce the calculations, save the program and run it with Node.js. The JSON file lists the assumptions and expected results.

node QE-WORK-01.js

QE-WORK-01 / 1.0. These examples check only the system described. They do not reconstruct your architecture or assess whether a trading strategy is profitable.

From data to decisions: what you need to be able to reconstruct

A model is one part of the system. This teaching map connects each stage to a possible failure, a check and a record to retain. It does not describe Quantic Eagle’s proprietary architecture.

  1. 1 When the information became available

    Risk
    The test buys at 10 am using news released at noon.
    Check
    Compare the purchase time with the earliest time you could receive the news.
    Keep
    The news source, file version and timestamps.
  2. 2 What the model reads and learns

    Risk
    A price average includes tomorrow, or the model learns from a sale that has not happened yet.
    Check
    List the prices used for each input. For each outcome used in training, record when the sale makes it known.
    Keep
    The formula, input rows and time the outcome becomes known.
  3. 3 Which data train the model and which evaluate it

    Risk
    You simulate a Monday purchase using a model that has already learned from the following Friday’s outcome.
    Check
    Before training, separate the rows and check when each outcome becomes known.
    Keep
    The rows assigned to each period and reasons for exclusions.
  4. 4 How you choose a version to test

    Risk
    You look at the final test result and change the minimum score required to buy to improve it.
    Check
    Use one period to choose between versions. Reserve another for subsequent evaluation and do not consult it to adjust the choice.
    Keep
    Every version tried, its settings and the results already consulted.
  5. 5 From scores to orders

    Risk
    Two programs give A and B identical scores, but one buys A and the other buys B.
    Check
    Compare which stocks may be bought, their priority order, the final choice and quantities. Then check simulated prices and costs.
    Keep
    Decision records, orders and assumptions about execution prices.
  6. 6 What the account is worth throughout the test

    Risk
    The balance hides a loss on shares still held, or a deposit looks like a gain.
    Check
    Add cash and the value of open positions. Record deposits and withdrawals separately, along with how often you observe the account.
    Keep
    Account values, external cash movements, costs and the method used to calculate returns.
  7. 7 What happens on data not used to choose

    Risk
    You present the period that helped you pick the winner as fresh confirmation.
    Check
    Save the chosen version before the next evaluation. Also examine stated adverse scenarios, distinguishing them from actual observations.
    Keep
    New evaluation results, scenario assumptions and a record of past choices.
  8. 8 How you preserve decisions and continue

    Risk
    You rerun the past with a new rule and lose the record of what the program decided at the time.
    Check
    Keep both versions and link each decision to the rule that produced it. Define the next evaluation before seeing its results.
    Keep
    Dated versions, original decisions, new simulations and checks still needed.

The map uses invented cases. When standardising prices for training, estimate the mean and standard deviation from permitted training data only. A prediction for a row excluded from that particular training split is called out-of-fold (OOF). Also check preprocessing and choices that used its outcome; training on other rows does not remove future information when those rows come from later dates. A period excluded from weight fitting, called out-of-sample (OOS), may still have been consulted to select the system.

The curve that left something out

Equity is the total value of the account at a given time, including unrealised profits and losses on open positions. Balance excludes those unrealised results. Treatment of credit, fees and other components depends on the source. In the comparison below, equity and balance are observed at the same times. The calculation uses only those values: it does not reconstruct what happened between observations or verify how the source calculated them.

To compare curves for an invented account, we set their starting value to 100. The chart numbers are an index, not euro amounts. Looking only at the balance after closed trades, the index never falls and ends at 104. The report therefore calculates zero balance drawdown.

Now include open positions in the same observations. Equity reaches 101, falls to 87 and finishes at 104. Observed drawdown is 13.86%. The endpoint is unchanged; the path reveals something else.

Synthetic example · Not Quantic Eagle performance

Two curves. The same endpoint.

Closed tradesEquity including open positions
Index, starting at 100
901001051612
Observation
Both finish at 104. Closed-trade DD: 0%. Observed equity DD: 13.86%.

This is a synthetic example, not Quantic Eagle performance. It shows why a metric's definition matters as much as its value. In practice, you need to establish observation frequency, costs, cash flows and coverage of open positions. Daily observations can miss an intraday low.

Start by asking whether your report measures the risk you want to understand or only the risk its available data can describe.

The preliminary ranking differed from the backtest ranking

When you have many models to test, a quick preliminary calculation can help choose which receive a complete simulation. This preliminary measure is a proxy for the result you ultimately care about. In an internal campaign, the preliminary ranking and the backtest ranking ordered the same 192 candidates differently. This records disagreement between rankings; it does not establish that either selection method is superior.

The historical comparison of 192 candidates does not provide the preliminary ranking formulas, the backtest metric, period and cost conventions, the full population before selection or candidate-level results. Without these elements you cannot reconstruct that comparison. The candidates were also chosen during research that adapted to results already consulted, so that period is not an independent final test.

Internal observation: the preliminary ranking and the backtest ranking disagreed. The public material does not provide the definitions and candidate-level records needed to quantify that disagreement independently.

In your own comparison, record the same candidate IDs in both rankings, define each sorting measure and its period, and retain costs and selection rules. Test some candidates outside the preliminary shortlist too. Otherwise you cannot observe the results of the candidates that your filter excludes.

A proxy can measure one part of the problem. A portfolio also involves costs, concurrent positions, risk and concentration. Comparing both rankings under consistent conditions makes the difference visible.

Synthetic experiment · Entirely invented data

The top-ranked model loses on the period used for selection

You have two backtests covering periods of equal length, with the same capital and cost conventions. A earns 3,000 invented currency units on the training period and loses 20 on the selection period. B earns 200 and 100. Add 10% of the first result to 90% of the second: who ranks first?

A: 300 − 18 = 282. B: 20 + 90 = 110. A ranks first because the formula includes 300 units of profit made on the same data used to train the model; the second period contributes −18. On the second period alone, B comes first with 100 versus −20. That does not make it ready to trade: risk, activity and other periods still need evaluation. And once a period guides your choice, it is selection data, not an untouched final test.

Invented example. Neither the weights nor the results come from Quantic Eagle’s operational research. The formula illustrates a problem; it is not a recommended selection rule.

Explore the programme and exercises →

Before choosing a model, decide what it should learn

You need to choose a model and the report favours the one that separates winning purchases from losing ones more accurately. Your system can buy only one stock: check which it chooses and how much that purchase gains or loses after costs. Imagine four purchases available at the same time. You may make only one, always for the same amount. Two invented models assign scores to set priorities; each chooses its highest score. The gains and losses in the table become known afterwards; they are not model inputs. Amounts and costs use the same invented currency unit.

On a small screen, scroll the table horizontally.

PurchaseGross outcome, known laterA scoreB score
1+10.90.6
2+80.70.9
3−10.80.7
4−80.60.8

A chooses purchase 1: a gain of 1 minus a cost of 0.10 leaves +0.90. B chooses purchase 2: a gain of 8 minus the same cost leaves +7.90. The scores are not probabilities, and no model was trained for this example.

Now compare each winning purchase against each of the two losing purchases: four pairs. A gives the winner a higher score in three pairs out of four; B does so in two. This fraction is the example’s AUC: 0.75 for A and 0.50 for B. A ranks winners and losers better, but B selects the purchase that earns more here. Ranking quality and purchase outcome answer different questions. The case does not show which model will work better in future. The pairs are 1–3, 1–4, 2–3, and 2–4. For A, 0.90 exceeds 0.80 and 0.60; 0.70 exceeds 0.60 but not 0.80. For B, 0.60 exceeds neither 0.70 nor 0.80; 0.90 exceeds both.

AUCNet outcomeAB0.750.50+0.90+7.900 → 10 → 8
Synthetic example: four opportunities, one selection per model, equal size and a cost of 0.10 units. AUC: A 0.75, B 0.50. Net outcome: A +0.90, B +7.90. The columns use different scales. No model was trained for this example.

Are you teaching a system to recognise direction, or to make an economically useful decision? The answer changes how you should read its metrics.

The loss function guides training. AUC (area under the ROC curve) measures how well a score ranks positive examples above negative ones; it does not directly measure the value of a decision, its costs or its capital requirements. A loss designed to approximate an economic objective can give different weight to mistakes that a directional metric treats alike.

A good AUC is insufficient to select a trading system; a low AUC does not establish its economic merit either. If AUC is very high on training data, check whether examples really are easy to distinguish, whether the model memorised features of that sample, or whether it received information unavailable at decision time. Changing the loss function does not turn a training result into evidence on unseen data.

In our research, we distinguish the training objective, the score used to screen candidates and the portfolio backtest result. Even an economic proxy can rank candidates poorly once the complete system applies costs, constraints and execution rules. The 192-candidate comparison described here concerns a proxy and a backtest ranking. It is not an AUC study and does not establish that the loss caused the disagreement.

Training against economic objectives is also established in academic research. Lim, Zohren and Roberts describe networks trained to optimise the Sharpe ratio, with a turnover penalty to account for transaction costs. Our educational contribution is the process of designing and testing a system, not a claim to have invented this category. Original paper: Enhancing Time Series Momentum Strategies Using Deep Neural Networks.

The useful question is: what behaviour am I rewarding, and how closely does it match what the system must execute?

Separate the dates, then check when the outcomes become known

Invented example: you want to train a model before period 5 and use it to make decisions in periods 5 and 6. One training example buys in period 4 and sells only in period 6. Its gain or loss is the answer you want the model to learn to predict, called the label. Before period 5 you cannot know that answer: the sale has not happened. Sorting rows by purchase date is not enough; check when each outcome becomes known too.

T = training · V = evaluation · × = excluded row · — = unused. Numbers identify hypothetical periods, not real dates or returns.

Naïve random split

  1. 1T
  2. 2V
  3. 3T
  4. 4T
  5. 5V
  6. 6T
  7. 7—
  8. 8—

Trains the model on observations that come after some of the decisions being evaluated. It does not reproduce the task of predicting the future from the past.

Walk-forward without checking labels

  1. 1T
  2. 2T
  3. 3T
  4. 4T
  5. 5V
  6. 6V
  7. 7—
  8. 8—

Training starts before evaluation, but the outcome for row 4 arrives in period 6. Sorting rows by their start time does not resolve this.

Walk-forward with the overlap removed

  1. 1T
  2. 2T
  3. 3T
  4. 4×
  5. 5V
  6. 6V
  7. 7—
  8. 8—

Row 4 is excluded. In this example, outcomes for rows 1–3 are known before period 5; a real dataset requires checking every interval.

Purging, embargo and a gap before evaluation

Purging removes training observations whose label intervals overlap evaluation. An embargo can exclude a period after the test when the cross-validation design allows later training data. It aims to limit residual dependencies, such as overlapping information windows. Strictly causal walk-forward does not fit on those future observations; an exclusion interval before the test is a gap. Its length and boundaries depend on labels, data availability and feature windows. There is no universal number of days.

These exclusions do not fix late-published data, normalisation fitted on the entire dataset or repeated selection against the test. Keep excluded rows and reasons, include a broken example the check must detect, and record which results you had seen before deciding.

Try it on paper: a row starts in period 4 and its outcome ends in period 6. Can it train a model making a decision at the start of period 5? No. Now move the outcome end to period 4. That particular overlap disappears; feature availability and selection history still need checking.

In TimeSeriesSplit, gap is a number of samples, not automatically a number of days.

For chronological splitting and the gap parameter, see the official TimeSeriesSplit documentation. For selection risk across many backtests, see Bailey and co-authors. Neither reference certifies this project or guarantees future performance.

scikit-learn: TimeSeriesSplit · Bailey et al.: The Probability of Backtest Overfitting

Two identical files. Both lack the price for 3 March

Invented example: two copies of prices.csv match byte for byte, but both lack the 3 March close required by a moving average. Taking the last three rows present can replace that close with an older price, giving the model or rule a different average from the one required. In the Museum case, the current price of 10 exceeds the incorrect mean of 9 but not the correct mean of 11: a purchase is permitted that the rule would exclude. Comparing file fingerprints, called hashes, does not expose the gap; compare the sessions present with those required. Follow the missing input through to the purchase decision.

To calculate an indicator, check both the dates it requires and how many preceding observations it needs. A file may contain every date in the test period but too little history before that period begins.

Synthetic example · Not Quantic Eagle performance

Three conditions to keep separate

— Expected initial missing observations · ✓ Available · ! Unexpected gap

Synthetic data: two expected gaps, three present values and one gap to investigate.

A three-session average cannot exist during the first two sessions because three prices are not yet available. That absence is expected. A missing price months later, when all three sessions should be present, needs investigation. Dropping every incomplete row indiscriminately hides the difference and changes which cases you evaluate.

From a worked case to your own project

The exercises showed how a rule change affects orders, why a report can delay the next job and why original decisions must be preserved. The fieldbook in preparation takes you through these checks on your own program, with instructions, worked examples and worksheets.

Explore the fieldbook programme →

Sources and scope

The 192-backtest case comes from internal Quantic Eagle research dated 16 September 2026 and has not been independently audited. The teaching figures are diagrams or synthetic examples; QE-RESEARCH-02 instead presents aggregates from the internal comparison recorded on 19 September 2026, with its source and limitations beside the chart. The fieldbook draws on around ten years of accumulated research experience, with contributions from the founder and external collaborators, including work before the company was formed. This does not represent ten years of live trading results.

For selection across multiple backtests, see Bailey et al., The Probability of Backtest Overfitting. Quantic Eagle operates with its own capital and does not accept money to invest on behalf of others or manage their investments. This is general methodological education, not an investment recommendation.

Compare more faulty and corrected examples in the False Green Museum.

Written by Quantic Eagle LTD · General education in research methods. About.

Back to top