‹ Backtest Strategies Lesson 16 of 17
Contents Lesson 16 of 17

4 min read · professional

Publish the report, and what the exam checks

The artefact of this course is not the equity curve. It is a document that lets a sceptical reader decide how much to believe it.

What the export contains

One file, generated by the code rather than written by hand — a report you typed is a report that drifts from the run it describes:

  • The claim, in the one honest sentence from lesson 1, with the blanks filled.
  • Parameters, the whole struct, cost and slippage included.
  • Data: symbol, first and last bar, bar count, which close column, vendor and date pulled.
  • Assumptions: fill rule, cost in bps, slippage in bps, universe and what it excludes.
  • Results: gross and net return, cost as a fraction of gross, max drawdown, time under water, trades, time in market, and the buy-and-hold control on identical terms.
  • Robustness: in-sample against out-of-sample, the neighbour-parameter table, and the number of parameter sets tried.
  • Tests: which of the four honesty tests ran and that they passed.
  • Not tested: regimes outside the sample, and the delisted universe if you ran on survivors.

That last section is what separates a research note from a sales pitch. A report with no limitations section is telling you something about its author.

Say what it is

A historical simulation, not advice, and you are not a licensed adviser. Put it at the top rather than in small print at the bottom, because a chart with a rising line reads as a recommendation to almost everyone who sees it.

Publishing the code is fine and good — it is the portfolio piece. Publishing the data is a different question: EODHD's terms are personal use, so ship the notebook and the report, not a copy of the price history.

What you can now do that has nothing to do with backtests

You can test for correctness in a domain with no oracle. There is no right answer to compare against, so you built properties instead: change the future and the past must not move; add data and history must not change; every fill inside its bar. That technique — property-based testing — transfers to anything where you cannot enumerate the right answers.

You know that the flattering result is the suspicious one. A first attempt that looks brilliant is a bug prior. This is a general engineering instinct, and it is rarer than it should be.

You state assumptions as data. Parameters in a struct, printed in the output. A result you cannot reproduce is not a result.

What the exam asks

Ten questions, seventy percent to pass, twenty-four hour cooldown, drawn from a pool several times the size of one paper, so a retake is a different paper. Every fixture is fixed. Expect:

  • Find the leak. A signal function is shown; you name the index or the operation that reads the future.
  • Pick the column. Given the AAPL bars across 2020-08-31, say what the return is on each close and which is correct.
  • Count the cost. Given a turnover and a bps figure, say what the strategy pays per year.
  • Read the drawdown. Given a small equity series, compute max drawdown against the running peak.
  • Judge the universe. Given the live and delisted counts, say which strategies the bias most damages.
  • Judge the claim. Given a result and a report, say what is missing before anyone should believe it.

Try it now

Generate the report and hand it to your assistant with one instruction: "argue that this result is not trustworthy." Read the objections and answer each one either in the report or in the code. When you cannot answer an objection, that is the honest limitation — write it in the "not tested" section rather than deleting the question.