Quant from Scratch by QuantWright

Testing Popular Ideas · Lesson 9

The higher-timeframe filter

Trade short bars only when a longer bar's trend agrees: which bar, which trend, and the leak in a bar that hasn't closed.

Know the basics? Read the lesson notes

Bars of different lengths

The Opening-range breakout lesson traded on five-minute bars: candles, each holding the open, high, low and close of five minutes. Each day here is one session, 09:30 to 16:00. A bar can cover any length of time. A longer bar is built from the shorter ones inside it: the open of the first, the highest high, the lowest low, the close of the last. Traders call the longer bars the higher timeframe.

The prices are simulated: made up by a computer, not a real market. Simulated markets can't show whether an idea works in a real market; here they show what a rule does when there is nothing to find (markets built so past prices say nothing about which way the next move goes). Look at the same market on all four bar lengths.

One simulated market, four bar lengths

Each bar: a thin line from its low to its high, a box from its open to its close (empty if it closed higher). Every view ends at 16:00 on 2 Jan 2017; the weekly one at the last full week.

Bars
Bars shown–
One bar holds–

A daily bar holds the day's 78 five-minute bars; a weekly bar, five days of them, 390. The longer the bar, the fewer bars and the slower they change.

What counts as a trend?

The higher-timeframe filter: take a trade on short bars only in the direction a longer bar's trend points. "Trend" needs an exact definition. Three common ones, each read from the last longer bar that has closed:

Three bar lengths times three readings: 3 × 3 = 9 ways to read "the trend". Each is a version: the same idea with different settings (the How we test an idea lesson). On the day shown, at 10:00, they split.

Nine readings of the trend at 10:00 on 2 Jan 2017 (simulated)

Each read from the last bar that had closed by 10:00: the 30-minute bar from 09:30, the daily bar of 30 Dec, the weekly bar of the week before.

From 2016 to 2024, on how many simulated days did the three readings of one bar length all agree?

Fewer. The colour flips from one bar to the next about as often as a coin, while the averages change slowly, so they often disagree.
Far fewer. The colour flips from one bar to the next about as often as a coin, while the averages change slowly.
Across 1,000 simulated markets, all three daily readings agreed on 43.1 days in 100 (30-minute 42.0, weekly 44.7).

So "the trend" is not one thing. Which bar and which reading are choices, and each choice is another version to count.

The filter on one day

The rule comes from the Opening-range breakout lesson, with a filter added. The opening range is the high and low of 09:30 to 10:00. At 10:00 the filter reads the trend once. Up: an order waits at the range's high and buys when a bar reaches that price (the Orders lesson). Down: an order waits at the low and sells short; selling short means selling first and buying back later, so the trade gains when the price falls. A stop (an order that closes the trade at a set price) at the other side of the range ends a losing trade; otherwise the trade ends at 16:00.

Unfiltered, both orders wait and whichever price is reached first trades. Try no filter, then filters until you have seen one read up and one read down.

The rule on 2 Jan 2017, five-minute bars (simulated)

Shaded: the opening range. Dashed: the price the waiting order needs. Dot: the entry, ring: the exit, when the rule traded.

Filter
Reading
Trend at 10:00–
Trade–

Unfiltered, the rule bought at 106.42 in the 10:15 bar. A filter that read down waited at the low, 105.99, which the price never reached: no trade. One waiting order is reached less often than two, so across 1,000 simulated markets the nine filters traded on 190 to 222 days a year, the unfiltered rule on 260.

At 10:00, today's bar isn't finished

Take the daily colour. A file of daily bars (the stored prices a test reads) has one finished row per date. A backtest (running a rule on past prices) that looks up "today's daily bar" at 10:00 gets the row with today's date, and that row holds today's 16:00 close: a price six hours in the future. A filter that reads today's unfinished bar partly reads how the day will end, and then trades in that direction. Move the clock and watch today's daily bar build.

Today's daily bar, so far and in the file, beside the finished bar of 30 Dec (simulated)

Left: five-minute bars up to the clock; grey: what hasn't happened yet. Right: 30 Dec's finished daily bar, what the honest reading uses; today's bar as it stands at the clock; and today's bar as the file holds it.

30 Dec, finished–
Today so far–
Today in the file–

At 10:00, 6 of the session's 6.5 hours were still to come. The file's bar already knew the close, 106.43, so it read up; the finished bar, 30 Dec's, read down.

Reading a longer bar before it has closed is a kind of look-ahead bias (the Look-ahead bias lesson): a backtest using information that wasn't available at the moment of the decision. Call it the unfinished bar; the honest reading uses the last finished bar.

The leak, counted

Run the daily colour filter both ways on 1,000 simulated markets, from 2016 to 2021 (the first year, 2015, only builds the averages). Finished: yesterday's bar. Unfinished: today's, from the file.

On the finished reading, 40.6 trades in 100 gained, before costs (as if trading were free). Guess the unfinished reading's figure.

Trades that gained before costs, daily colour filter, 2016–2021

Every trade on 1,000 simulated markets combined. Dashed: your guess.

Average trade, finished?
Average trade, unfinished?

Unfinished, 61.6 trades in 100 gained, and the average trade (its gain or loss in % of the price) was +0.23% before costs, against −0.02% for the finished reading. The difference comes from today's bar, six hours of which had not happened at 10:00. With the finished reading fewer than half gained, yet the average stayed near zero: a gaining trade averaged +0.60%, a losing one −0.44%.

Before costs it even beat just holding (buying on the first day and never selling) in all 1,000 markets.

Every version, finished and unfinished

Now all nine versions, 2016 to 2021. The years 2022 to 2024 stay held out: set aside before any version ran, to be used once at the end (the Held-out test lesson). Each bar is a version's average trade before costs, over every trade on the 1,000 simulated markets. Look at both readings.

Average trade before costs, nine versions, 2016–2021 (simulated)

One bar per version, grouped by bar length; in each group C: colour, A: above average, Av: averages. Filled: the reading picked with the buttons; outline: the other one. Every trade on 1,000 simulated markets combined. Orange: 0.05% or more.

Bar read
Largest–
Smallest–

Finished, every version averaged between −0.020% and −0.017% a trade before costs. Unfinished, some leaked far more than others.

The leak is largest where the unknown part of the bar is the trade itself: today's bar ends at 16:00, with the trade. A weekly bar also holds later days, a 30-minute bar only the trade's first half hour, and in an average today's close is one of 10, 20 or 30 closes.

The honest nine against just holding

Back to the finished readings. Each buy and each sale costs 0.1% of the price (the Costs lesson); holding pays that once. A version's lead is its growth in % a year minus holding's, in points (a point is 1% a year). After costs, in how many of the 1,000 simulated markets did at least one of the nine beat holding?

Average lead over holding after costs, 2016–2021, 1,000 simulated markets

Grey: the nine filters, grouped by bar length. Black: the unfiltered rule.

Your guess
Markets where one beat holding?

In none. The filters averaged −42.4 to −47.1 points a year, the unfiltered rule −52.0. Each trade pays 0.2%, so each trading day keeps 0.998 of the account: 0.998 multiplied 190 times is 0.68, so costs alone take about a third of it a year.

The filters lost less because they traded on fewer days, so paid less in costs. Their average trade before costs was the same as the unfiltered rule's, −0.02%.

These markets were built so that past prices say nothing about which way the next move goes; they only rise slowly on average. So these counts show what the rules do when there is nothing to find, not whether a higher-timeframe filter works in any real market.

Does the best stay best?

On each market, take the best of the nine finished-bar versions after costs on 2016 to 2021 and call it the pick; it then runs once on the held-out years. A blind draw, a version picked at random from the nine, would be best there in about 111 of 1,000 (1,000 ÷ 9 = 111.1). Guess how often the pick stayed best.

The pick's place on the held-out years, 1,000 simulated markets, after costs

One bar per place, 1st on the left. Dashed: a blind draw.

Stayed best?

The pick stayed best in 130 of 1,000 simulated markets, against a blind draw's 111, and beat holding there in none.

The two 30-minute versions trade most, so pay most in costs, and were rarely best, so the contest was mostly among seven: 130 is close to the 143 a seven-way draw gives (1,000 ÷ 7). That is not skill.

Theory

Read a longer bar only after it closes

A rule may use a higher-timeframe bar only once that bar has closed. Using it earlier is look-ahead bias; traders say such a reading repaints: a backtest shows it reading finished bars, while live it read the bar so far. In code, count the short bars from 0 where the long bars start.

j = ⌊(i + 1) ÷ m⌋ − 1
i
the short bar that has just closed, counted from 0 at the start of the first long bar
m
how many short bars make one long bar
j
the last finished long bar, counted from 0, when every long bar holds exactly m short bars
⌊ ⌋
round down to a whole number

Why it works: i + 1 short bars have closed; ÷ m gives the whole long bars closed; − 1 turns that count into a number counted from 0. j = −1 means none has finished yet.

Worked example: the decision at 10:00

Five-minute bars into 30-minute bars from 09:30: m = 6. At 10:00 the bar just closed is the 09:55 one, i = 5. j = ⌊6 ÷ 6⌋ − 1 = 0: the 09:30 to 10:00 bar. The leak reads ⌊6 ÷ 6⌋ = 1, the 10:00 to 10:30 bar, which hasn't started.

Into daily bars, m = 78. At 10:00 on day d (counted from 0), i = 78d + 5, so j = ⌊(78d + 6) ÷ 78⌋ − 1 = d − 1: yesterday.

Holds when
  • every long bar holds exactly m short bars;
  • both counts start at the same moment;
  • the rule decides at the close of short bar i.
Breaks when

Bars are uneven: 60-minute bars from 09:30 leave a 30-minute bar at 15:30, and a week with a holiday has four days. Then use end times: the last finished bar is the latest one that ended at or before the decision.

Five-minute bars go into 15-minute bars from 09:30. A rule decides at the close of five-minute bar i = 10 (10:20 to 10:25). Which 15-minute bar is the last finished, counted from 0?

m = 3: ⌊11 ÷ 3⌋ − 1 = 3 − 1 = 2, the 10:00 to 10:15 bar. Bar 3 (10:15 to 10:30) is still open at 10:25.
15 minutes ÷ 5 = 3 short bars per long bar, so m = 3: ⌊(10 + 1) ÷ 3⌋ − 1 = 3 − 1 = 2, the 10:00 to 10:15 bar.

What this means for your test

  1. Write the exact rule before you run it.

    Which longer bar, which reading of trend, the moment the rule reads it, which bar counts as finished, and the costs.

Practice 1 of 3

A filter that wins

The situationA friend backtests a five-minute rule with a daily-trend filter: it won 70 trades in 100, against 41 without the filter. For each trade, the code looks up the daily bar with the same date.

What is the likeliest reason for the jump?

Maybe, but check the leak first. The bar with the same date closes at 16:00, after the trade's decision; in this lesson that alone lifted the gaining trades from 40.6 to 61.6 in 100.
The bar with the same date isn't finished when the trade starts, so the test knows how the day ends. Use the previous day's bar and run it again.
Fewer trades change the count of losers, not the share. In this lesson the finished filters gained on about 41 trades in 100, the same as no filter.
Practice 2 of 3

Which daily bar?

The situationYour code counts five-minute bars from 0 at the first bar of the data, 78 a day, and decides at the close of bar i = 395.

Which daily bar, counted from 0, is the last finished one?

Hint: m = 78. Work out ⌊(i + 1) ÷ m⌋, then take 1 away.

⌊396 ÷ 78⌋ − 1 = 5 − 1 = 4. Bar 395 is 5 × 78 + 5: 10:00 on day 5, so day 4 is yesterday.
⌊(395 + 1) ÷ 78⌋ = ⌊5.08⌋ = 5, and 5 − 1 = 4. Day 5 is the day in progress; day 4 is the last finished.
Practice 3 of 3

An honest reading

The situationA rule decides at 10:00 on a Wednesday, from a file of finished daily and weekly bars.

Which reading is honest at that moment?

This week's bar closes on Friday at 16:00, so on Wednesday morning the file's bar holds nearly three days still to come.
Today's close comes at 16:00, six hours after the decision. The average leaks less, but it still reads the future.
Tuesday's daily bar closed at 16:00 the day before, and its average uses only closes up to then.
✓

Lesson done

A higher-timeframe filter takes a trade on short bars only in the direction a longer bar's trend points. Which bar (30-minute, daily or weekly) and which reading of trend made 9 versions here, and the three readings of one bar length agreed on fewer than half the simulated days. A longer bar may be read only after it closes: on markets with nothing to find, reading today's unfinished daily bar at 10:00 lifted the average trade before costs from −0.02% to +0.23%. These markets were built so that past prices say nothing about which way the next move goes, so the counts show what these rules produce when there is nothing to find: with finished bars and after costs, no version beat just holding in any of 1,000 simulated markets, and the best of 9 stayed best on held-out years in 130 (a blind draw: about 111). The counts cannot show whether a higher-timeframe filter works in any real market.

Key ideas

Higher timeframe
longer bars built from the shorter bars inside them: the open of the first, the highest high, the lowest low, the close of the last
Higher-timeframe filter
a rule on short bars that trades only in the direction a longer bar's trend points
Trend reading
an exact definition of "trend", such as a bar's colour, its close against an average, or a short average against a long one; each is a separate version
Finished bar
a bar that has closed; the only kind of longer bar a rule may read
Unfinished bar
a longer bar read before it closes; a backtest sees its final close, a kind of look-ahead bias (traders say the reading repaints)
Version
the same idea with different settings; count every one

Formulas

j = ⌊(i + 1) ÷ m⌋ − 1: the last finished long bar at the close of short bar i, when every long bar holds exactly m short bars and both counts start at the same moment

Lesson notes

A higher-timeframe filter takes a trade on short bars only in the direction a longer bar's trend points. Here 3 bar lengths and 3 readings of trend made 9 versions (the same idea with different settings) of a filtered opening-range rule, and a longer bar may be read only after it has closed. The simulated markets were built so that past prices say nothing about which way the next move goes, so the counts show what these rules produce when there is nothing to find: reading today's unfinished daily bar lifted the average trade before costs (as if trading were free) from −0.02% to +0.23%, and with finished bars no version beat just holding (buying on the first day and never selling) after costs in any of 1,000 simulated markets. The counts cannot show whether a higher-timeframe filter works in any real market; that needs its own test.

Bars of different lengths

The simulated market (prices made up by a computer) has one session a day, 09:30 to 16:00, of 78 five-minute bars. A longer bar, the higher timeframe, is built from the shorter bars inside it: the open of the first, the highest high, the lowest low, the close of the last. A 30-minute bar holds 6 five-minute bars, a daily bar 78, a weekly bar 390.

Three readings of trend

Three common definitions of "trend", each read from the last longer bar that has closed: colour (up if the bar closed above its own open, down if below); above average (up if its close is above the simple moving average of the last 20 closes); averages (up if the 10-bar average is above the 30-bar average). 3 bar lengths × 3 readings = 9 versions. On the example day, 2 Jan 2017, at 10:00, 5 of the nine read up and 4 read down. Across 1,000 simulated markets, the three readings of one bar length all agreed on 43.1 days in 100 for daily bars (42.0 for 30-minute bars, 44.7 for weekly). The colour flips from one bar to the next about as often as a coin, while the averages change slowly.

The filtered rule

The opening range is the high and low of 09:30 to 10:00. At 10:00 the filter reads the trend once. Up: an order waits at the range's high and buys when a bar reaches that price. Down: an order waits at the low and sells short (selling first and buying back later, which gains when the price falls). A stop at the other side of the range ends a losing trade; otherwise the trade ends at 16:00. Unfiltered (the rule of the opening-range breakout lesson), both orders wait and whichever price is reached first trades. On the example day the unfiltered rule bought at 106.42 in the 10:15 bar; a filter that read down waited at the low, 105.99, which the price never reached. Across the 1,000 simulated markets the filters traded on 190 to 222 days a year, the unfiltered rule on 260.

The unfinished bar

A file of daily bars holds one finished row per date, so a backtest that reads "today's daily bar" at 10:00 gets today's 16:00 close, with 6 of the session's 6.5 hours still to come. On the example day today's bar closed at 106.43, above its open, so the file's bar read up; the finished bar, 30 Dec's, read down. A filter that reads today's unfinished bar partly reads how the day will end, and then trades in that direction. Reading a longer bar before it has closed is a kind of look-ahead bias: a backtest using information that wasn't available at the moment of the decision.

On 1,000 simulated markets, 2016 to 2021 (2015 only builds the averages), the daily colour filter read from today's unfinished bar had 61.6 trades in 100 gain before costs, with an average trade of +0.23%; read from yesterday's finished bar, 40.6 in 100 and −0.02% (fewer than half gained, but a gaining trade averaged +0.60% and a losing one −0.44%). Before costs the unfinished reading beat just holding in all 1,000 markets, the finished one in 88, mostly markets in which holding itself lost money (75 of the 88). Over all nine, the finished readings averaged between −0.020% and −0.017% a trade before costs; the unfinished leaked most for the daily colour, then the weekly colour (+0.11%) and the daily above-average (+0.09%). The leak is largest where the unknown part of the bar is the trade itself, as today's bar ends at 16:00 with the trade; a weekly bar also holds later days, a 30-minute bar only the trade's first half hour, and in an average today's close is one of 10, 20 or 30.

The honest nine against just holding

Each buy and each sale costs 0.1% of the price; holding pays that once. A version's lead is its growth in % a year minus holding's, in points (a point is 1% a year). From 2016 to 2021, after costs, none of the nine finished versions beat holding in any of the 1,000 simulated markets. They averaged −42.4 to −47.1 points a year, the unfiltered rule −52.0. Each trading day keeps 0.998 of the account, and 0.998 multiplied 190 times is 0.68: costs alone take about a third a year. The filters lost less only because they traded on fewer days; their average trade before costs was the unfiltered rule's, −0.02%.

The best of nine on held-out years

2022 to 2024 were held out: set aside before any version ran, to be used once. On each market the pick, the best of the nine after costs on 2016 to 2021, ran once on them. It stayed best in 130 of the 1,000 simulated markets, against about 111 for a blind draw (a version picked at random: 1,000 ÷ 9), and beat holding there in 0. The two 30-minute versions trade most (222 and 205 days a year), so pay most in costs, and were rarely best, so the contest was mostly among seven: 130 is close to the 143 a seven-way draw gives (1,000 ÷ 7). That is not skill.

Formula: read a longer bar only after it closes

A rule may use a higher-timeframe bar only once that bar has closed. Using it earlier is look-ahead bias; traders say such a reading repaints: a backtest shows it reading finished bars, while live it read the bar so far. In code, count the short bars from 0 where the long bars start.

j = ⌊(i + 1) ÷ m⌋ − 1
i
the short bar that has just closed, counted from 0 at the start of the first long bar
m
how many short bars make one long bar
j
the last finished long bar, counted from 0, when every long bar holds exactly m short bars
⌊ ⌋
round down to a whole number

Why it works: i + 1 short bars have closed; ÷ m gives the whole long bars closed; − 1 turns that count into a number counted from 0. j = −1 means none has finished yet.

Worked example: the decision at 10:00

Five-minute bars into 30-minute bars from 09:30: m = 6. At 10:00 the bar just closed is the 09:55 one, i = 5. j = ⌊6 ÷ 6⌋ − 1 = 0: the 09:30 to 10:00 bar. The leak reads ⌊6 ÷ 6⌋ = 1, the 10:00 to 10:30 bar, which hasn't started. Into daily bars, m = 78: at 10:00 on day d (counted from 0), i = 78d + 5, so j = ⌊(78d + 6) ÷ 78⌋ − 1 = d − 1: yesterday.

Holds whenBreaks when

Bars are uneven: 60-minute bars from 09:30 leave a 30-minute bar at 15:30, and a week with a holiday has four days. Then use end times: the last finished bar is the latest one that ended at or before the decision.

One more worked example

Weekly bars

Five-minute bars go into weekly bars of five sessions: m = 5 × 78 = 390, counted from 0 at 09:30 on the first Monday. A rule decides at the close of short bar i = 1,000. j = ⌊1,001 ÷ 390⌋ − 1 = 2 − 1 = 1: week 1 is the last finished. Bar 1,000 lies in week 2, which runs from bar 780 to bar 1,169: 1,000 − 780 = 220 = 2 × 78 + 64, so it is bar 64 of that week's third session, Wednesday 14:50 to 14:55. Reading week 2's bar from the file would read Friday's 16:00 close, with more than two sessions still to come.

Common mistakes

Check yourself

  1. Five-minute bars go into 30-minute bars from 09:30. A rule decides at the close of five-minute bar i = 17 (10:55 to 11:00). Which 30-minute bar, counted from 0, is the last finished?
    Answer

    m = 6: ⌊18 ÷ 6⌋ − 1 = 2, the 10:30 to 11:00 bar, which closed at the same moment.

  2. A rule decides at 10:00 on a Thursday from this week's weekly bar in a file of finished bars. How many hours of trading does that bar still hold, and what is the honest bar to read?
    Answer

    The rest of Thursday (6 hours) and Friday (6.5 hours): 12.5 hours. The honest bar is last week's, the latest one that has closed.

  3. In the lesson's simulation, why did the finished filters lose less than the unfiltered rule after costs?
    Answer

    They traded on 190 to 222 days a year instead of 260, so paid less in costs. Their average trade before costs was the same, −0.02%: the filters did not tell which way prices would go, as nothing in these markets could.

  4. On markets built with nothing to find, a filter's trades average +0.2% before costs and win 60 in 100. What do you check first?
    Answer

    Whether it reads a longer bar before that bar has closed. In the lesson, today's unfinished daily bar gave +0.23% and 61.6 in 100; the finished bar gave −0.02% and 40.6.

  5. In the lesson's simulation, the best of nine finished versions stayed best on held-out years in 130 of 1,000 simulated markets, against about 111 for a blind draw. Does that show the filter works?
    Answer

    No. The pick beat holding on the held-out years in none of the 1,000. The two 30-minute versions trade most and were rarely best, so the contest was mostly among seven, where a draw is best in about 143. These markets were built with nothing to find, and a real market needs its own test.

Try it yourself

The rules, written before the code. Five-minute bars, one session a day, 09:30 to 16:00. Longer bars: 30-minute (six five-minute bars from 09:30), daily, weekly (Monday to Friday); open of the first, highest high, lowest low, close of the last. Readings, from the last longer bar that closed by 10:00: colour (close against open), above average (close against the average of the last 20 closes), averages (10-bar average against 30-bar). The opening range: the highest high and lowest low of 09:30 to 10:00. Up: a buy order waiting at the range's high; down: a sell-short order waiting at the range's low; a tie: no trade. Stop at the other side of the range, watched from the bar after the entry bar; out at 16:00. 0.1% of the price per buy and per sell, or no costs. Compared with buying at the last close of 2015 and holding, which pays 0.1% once.

Run the script. Every number in this lesson comes from one Python script (below). It imports simmarket.py, the course's simulated market, which must sit in the same folder. Change the decision time or add a 60-minute bar, and see what the bar-close rule needs.

By hand. In a spreadsheet of daily bars, one row per date (date in A, open in B, close in C), the honest daily colour for the trades of the date in row 22 is yesterday's, row 21: =SIGN(C21-B21). Its 20-day average is =AVERAGE(C2:C21), ending at row 21, never row 22.

Written by QuantWright from the plain idea of a higher-timeframe filter and the rules above. No code from any indicator script or charting platform.

The code behind every number (Python, imports SimMarket, seed 20261109)
Loading…
For the preciseThe lesson's market: SimMarket Market 1, seed 20261109, effect=False (no planted pattern), five-minute bars built with bridge="normal" (no pull-back within the day), the same bars as the Previous day high and low and the opening-range breakout lessons. The 1,000 simulated markets: the same generator and setting with seeds 2026190901 to 2026191900. Rules trade from 1 Jan 2016 (the simulated calendar has no holidays). Choosing years: from the close of 31 Dec 2015 to 31 Dec 2021 (6.00 calendar years); held-out: to 31 Dec 2024 (3.00 years). % a year = (the account's growth factor)1 ÷ years − 1. A long trade's return is exit ÷ entry − 1; a short trade's 1 − exit ÷ entry; after costs each traded day is multiplied by 0.999². The lesson's market: holding 6.23% a year before its cost, 6.21% after (choosing), 10.00% (held-out). Daily colour, finished: −9.62% a year before costs, −38.73% after (1,166 trading days, 194.3 a year), lead −44.95, 8th of 9; held-out lead −46.85, 6th. Daily colour, unfinished: +71.72% a year before costs, +3.45% after (253.3 trading days a year), lead −2.77. Unfiltered: −10.64% before costs, −46.88% after, lead −53.09. The best finished version on this market after costs, weekly above average: lead −41.81; held-out lead −44.39, 2nd. The 1,000 simulated markets: the daily colour read from the unfinished bar beat holding after costs in 414 (choosing years) and 463 (held-out), with an average lead of −1.77 points after costs and +67.79 before, on 251.6 trading days a year. The readings said up on 51.1 days in 100 (daily colour), 54.9 (daily above average) and 61.9 (weekly averages; from 32.7 to 85.4 in single markets). The finished and unfinished readings differed on 50.4 days in 100 for the daily colour, 11.9 for the daily above average and 3.8 for the daily averages. Ties, so no trade: 1.07 days in 100 for the 30-minute colour, 0.44 for the daily colour. Share of trades that were buys: from 50.8 in 100 (30-minute colour) to 62.7 (weekly averages); the pick's 57.2, all nine's 55.0. The pick's average held-out place: 4.3. No market had a tie for first place on the held-out years. Of all 9,000 held-out results of the finished versions after costs, none beat holding.

Honest notes

Where this comes from