Detect BS — Don't Delude Yourself

A tool for testing your own prediction models. It doesn't give you advice and it doesn't sell you signals. It tells you whether what you built is real — including when the answer is no.

Buy — $19

One-time purchase · 30-day refund, no questions · macOS

The complete mathematics is published — every formula, and a section on what each check cannot prove: read it or take the PDF.

Most tools show you a prediction. This one shows you when it's worthless.

Every run prints a model card — a plain-language account of how much to trust the result, built from four checks.

Walk-forward splits

Trains on the early data, tests on the later data, the way you'd actually have to use it. It never learns from anything that would still be in the future.

A negative control

Retrains the same engine on deliberately shuffled targets. If your real data can't beat scrambled data, there's nothing there.

Permutation importance

Which inputs actually carry the result, measured by breaking one at a time.

Agreement between engines

Five engines from different random starts. Where the data determines the answer they converge; where it doesn't, they scatter — and each one sounds just as confident.

What you actually see

This is the engine itself, not a picture of one — rendered by the same drawing code the application runs. A six-input network with five hidden nodes, trained on a file that ships with the software.

The Detect BS network view: six input nodes, five hidden nodes, one output, with weights and activations labelled, showing a predicted value of 38.16 against an actual 39.00.
Every number is live. The top row shows each input as it appears in your file and again after scaling. Inside each circle is that node's activation for the case being shown; above each node are the weights arriving at it. At the bottom, this case: the engine predicted 38.16, the answer was 39.00. You can step through one pass at a time and watch the weights move.

The tests that show why this matters

Diagram comparing an interleaved split, where held-out rows are scattered every fifth row through the series, against a walk-forward split, where the held-out rows are the contiguous tail after all training rows.
The difference that produces every number below. An interleaved split scatters the held-out rows through the series, so each one sits between two rows the engine trained on — it only has to interpolate. Walk-forward puts every test row after every training row, which is the only arrangement you could actually use.

I ran lottery draws through it, because I already knew there was nothing to find. The negative control settles it: the engine scores the same on real draws as on draws with the answers shuffled, and the model card says so in plain words — nothing was learned here.

Then a series with lag features, scored two ways. This is the actual output, from a file that ships with the software:

$ DetectBS --auto --leak-check --in data/leak_demo.csv

LEAK CHECK
  Same data, same shape, scored two ways.

  interleaved split (every 5th row)            1.3518
  walk-forward (train past, test future)       1.5872
  guessing the mean                            8.0085
  (mean absolute error, averaged over the outputs -- lower is better)

  the interleaved split looked 17.4% better than the honest one

  That gap is the leak. An interleaved split trains on rows either side
  of the ones it is tested on, and with lag features those carry nearly
  the same numbers. Any result you have scored that way is inflated by
  roughly this much.
Bar chart: interleaved split 1.3518, walk-forward 1.5872, guessing the mean 8.0085.
Both scores beat guessing the mean, so either would look like success on its own. Side by side, the interleaved figure is 17.4% lower — and that gap is the split, not the engine.

Same engine. Same file. The only thing that changed was scoring it honestly.

Both files ship with the software, so you can reproduce either one in a single command. That's the point: if the checks can't catch a case where the answer is certain, they can't be trusted on a case where it isn't.

Bar chart: real data MSE 0.1767 against shuffled targets MSE 0.1731 — essentially identical.
The negative control on lottery draws. The engine scores the same on real draws as on draws with the answers shuffled, so whatever the shape search reported, nothing was learned. Failing this is conclusive; passing it is not.
Two panels of five prediction curves each: on the left they lie almost on top of each other, on the right they diverge widely.
Five engines trained from different random starting weights. Where the data pins the answer down they converge; where it does not, each settles somewhere else while sounding exactly as confident. Note the limit: agreement means the runs agree, not that they are right — engines fed pure noise agree too.

The mathematics, in full

Every calculation the software performs is published. Here are three of them, because they are the whole argument.

Walk-forward means one thing. Whatever the fold arithmetic, every split has to satisfy a single condition:

$$\max(\text{training time}) \;<\; \min(\text{test time})$$

That is the formal statement of no future data in the training set. A split that violates it is not a stricter test with a worse score — it is measuring a different quantity.

The leak indicator scores the same file both ways and reports the difference between the honest error and the flattering one:

$$G = 100\,\frac{e_{\mathrm{wf}} - e_{\mathrm{int}}}{\max(\varepsilon,\ |e_{\mathrm{int}}|)}$$

For the run above, \(e_{\mathrm{int}} = 1.3518\) and \(e_{\mathrm{wf}} = 1.5872\), so \(G \approx 17.4\%\). None of that 17.4% is skill.

The negative control retrains the identical network on the same rows with the targets permuted, so every real relationship is destroyed and every structural property survives:

$$\mathcal{D}_{\mathrm{shuffled}} = \left\{\left(\mathbf{x}_i,\ \mathbf{y}_{\pi(i)}\right)\right\}_{i=1}^{N}$$

A necessary — but not sufficient — condition for having learned anything is \(E_{\mathrm{real}} < E_{\mathrm{shuffle}}\). On lottery draws, the engine scores \(1.767\times10^{-1}\) on real data and \(1.731\times10^{-1}\) on shuffled. It failed, and it says so.

The full document derives the network, the training rule, the capacity budget and every check. Section 9 states what none of this can establish — that the leak indicator and the negative control are both one-sided, that ensemble agreement measures determinacy rather than accuracy, and that

$$\text{Passing all checks} \;\not\Rightarrow\; \text{future correctness.}$$

Read The Mathematics · download the typeset PDF

The same ideas, without the equations

The Illustrated Guide is a free companion edition. It covers every idea above — leakage, negative controls, capacity limits, ensemble agreement, and what none of them can prove — in plain language, with a picture drawn for each one and a foldout flowchart of every question the software asks about a dataset. No mathematics, no purchase, nothing to install. If you need to explain to somebody else why a model that scores well might still be worthless, start here.

Read The Illustrated Guide · download it as a PDF

What you get

What it will not do

It will not tell you what to buy, sell or do. There are no analyst ratings, no consensus targets, no signals folded into the output. Beating a baseline is not the same as making money — costs, spreads, slippage and timing are not in that number.

Prediction is a tool with limited conclusive results. The judgement is yours.

Privacy, in one line

It collects nothing. No analytics, no telemetry, no account, no licence phone-home. Your data never leaves your computer. The only network requests are to Yahoo Finance or FRED, and only when you ask for a feed.

Buy

Buy — $19

One-time purchase · 30-day refund, no questions · macOS 11 or later, Apple silicon or Intel