Scorefio · methodology · model 0.1.12beta

How every number
on your report is made.

Published in full, including the parts that do not work. The interface is trivially cloneable and the measured data is not, so there is nothing to lose by explaining the method — and it is the only credible answer to "why should I believe your number rather than the 0.05% I was guessing?"

01

The confidence taxonomy

Every figure carries exactly one label, and the label appears on the report.

LabelMeaningTypical error
Measured From our own order-book samples covering that period. sampling error only
Published From a venue's own fee schedule or settlement history, versioned with effective dates. zero if the tier is known
Estimated Derived from OHLC by a calibrated estimator, bias-corrected. published per symbol
Modelled Beyond observed book depth; an impact model's output. wide, and shown wide
Unavailable No basis exists. We produce no number.
The rule this rests on

A headline result is a range, never a point. A single confident number is both less honest and less useful than a range, and defending a range costs nothing when someone challenges it.

02

Validating your upload

Containment

Every fill has a timestamp, a symbol and a price. We fetch the bar containing that timestamp and require low × (1 − ε) ≤ fill ≤ high × (1 + ε) with ε = 0.05%, which absorbs feed differences between your data provider and ours. A fill outside that range means the wrong symbol, the wrong venue, the wrong timezone, or fabricated data.

ContainmentWhat we do
≥ 99%Proceed normally.
95–99%Proceed; the failing rows are flagged and excluded from headline figures.
90–95%Proceed with a prominent warning; usually a timezone or venue mismatch.
< 90%Refuse. No report is produced.

Recovery before refusal

Before refusing we test the same file shifted by every whole-hour offset from −12 to +14. If containment jumps above 99% at some offset, the file is fine and the timezone is wrong, and we tell you which offset worked. We also run containment against each candidate venue's bars: the venue with the best match is probably the one you actually backtested on, whatever was selected.

Structural checks

  • Bar-close fingerprint. If nearly every fill sits exactly on a bar close, the backtest used bar-close execution and never modelled intrabar movement. That changes which costs apply, and we say so.
  • Sample size. Under 100 round trips the whole report is marked low confidence; under 30 the conclusions are weak enough that we say so twice.
  • Chronology and overlap. Exits after entries, no negative holding periods, and overlapping positions checked against the stated pyramiding behaviour.
  • P&L reconciliation. Where your platform reports per-trade P&L we recompute it. A systematic offset is diagnostic — it usually names the field we misread. A scattered one means we do not understand the file, and we stop rather than guess.
What a verification can and cannot claim

We can say: this trade list is internally consistent and every fill falls within the market's traded range for its timestamp on the stated venue. We cannot say the list was generated by any particular script — Pine cannot be executed outside TradingView, so that link is unprovable and we never assert it.

03

Fees

Fee schedules live in version-controlled files, one per venue, each line carrying its source URL and capture date. A change is a new version with an effective date, never an edit — so a report generated in June can still name the schedule it used. Your report shows which versions it referenced.

Tiers depend on 30-day volume and token holdings we cannot see, so we default to the worst tier: retail, taker, no discount. Being pessimistic by default is the right bias — nobody churns because their real result was better than we said. You can override it.

Lines that do not fit in a commission box

  • A limit order that crosses the book is a taker fill on every venue we cover. "Limit" in a backtest is not the same as a maker fee.
  • Native-token fee discounts lapse silently when the balance reaches zero.
  • Kraken spot margin charges an opening fee and a rollover every four hours.
  • Withdrawal and conversion costs, which matter to any strategy that moves between venues.

Where we have verified a figure against the venue's own API we label it verified. Where we hold the published figure but have not confirmed it this month, the report says Published · unverified everywhere that figure is used.

04

Funding

Exchanges publish historical funding rates, so this layer is exact rather than modelled: we count the settlement windows each position actually crossed and apply the rate that settled.

The eight-hour assumption is wrong on about half the market

Most backtesters that model funding at all charge it every eight hours. On Bybit, 410 of roughly 844 linear contracts settle every four hours; on Binance, 443 symbols are off the 8-hour default. We read each symbol's actual interval rather than assuming one.

We report funding as a distribution, not a mean. On multi-day holds the mean is close to zero while the fifth and ninety-fifth percentiles span several basis points either way, and a trade in twenty pays more in funding than in commission. A mean would tell you to ignore it.

05

Impact at your size

Top-of-book spread is close to meaningless for anyone trading size. We sample order books across venues and store the half-spread for an order of $1k, $5k, $25k and $100k — the cost of actually filling that size, walked through the book — plus the depth within 1% of mid. We have been sampling continuously since 05 Sep 2026.

Your report uses the nearest sampled size at or above your order, on the venues we cover, for the days your trades span. Where the book could not absorb the size within the depth the venue publishes, we report that rather than extrapolating.

Where this data comes from, and where else you could get it

We collect these samples ourselves from public exchange endpoints, which costs us nothing and means the figures in your report are ours to check. It is not privileged data: historical order-book depth for these venues is sold commercially by Tardis.dev, Kaiko and Amberdata, among others, going back years. Anyone willing to pay can obtain it. What we claim is that we measure it and label it, not that nobody else can.

Which situation you are in

On BTC and ETH at ordinary size this line is under one basis point and fees dominate. On mid-caps it is 10 to 60 basis points a side, several times the fee line, and it differs by 2 to 6× between venues in the same minute. The report tells you which of those you are in, because the fix is completely different.

06

Signal-to-fill drift

A bar-close backtest assumes the fill happens at the closing price. In reality the order leaves after the bar closes and fills some minutes later, and for a momentum signal the price tends to keep moving. We measure that drift on 1-minute data across hundreds of signal bars and fit it as a function of how large the signal bar was.

We got this wrong once, and it is worth saying so

An early version of this model charged 25% of the signal bar's body, which produced 14 to 18 basis points a round trip and made several strategies look dead. Measured properly on 1-minute data, the mean drift is approximately zero with a band of roughly ±15 basis points. The placeholder overstated the cost by 6 to 8 basis points per side, and every conclusion that rested on it was withdrawn before launch. The band is the honest output; the mean alone would be a different kind of wrong.

07

Historical spread, and where estimators fail

Live order books give current spread; a backtest covers the past. For historical periods there are published estimators that recover spread from high-low-close bars — Corwin–Schultz and Abdi–Ranaldo among them. We implement them, calibrate them against our own measurements on overlapping days, and then use them only where that calibration says they work.

On liquid majors they do not work. Daily volatility runs 200 to 400 basis points while the actual spread is under half a basis point, so the estimators are measuring volatility, not spread, and are wrong by one to three orders of magnitude. We do not use them there: for those symbols the historical cost is published fees, exact funding, and measured impact.

On wide-spread instruments, where the spread is a visible fraction of the bar range, they recover it well on 1-minute bars. Where a symbol's calibrated median error exceeds 25% of the measured half-spread, we downgrade it from Estimated to Modelled with visibly wider bands, or exclude it.

08

When we cannot produce a number

We refuse. A cost line with no basis appears on your report labelled Unavailable with the reason, and it is excluded from the total rather than filled with a default or a nearby symbol's spread. The total is then marked incomplete, so you know the true cost is higher by an unknown amount instead of believing a tidy figure.

The same applies to whole reports: below 90% containment we produce nothing, because a precise-looking number computed from fills we cannot place in the market is worse than no number at all.

09

What we can read, and how well

An input format we have never run a real file through is a promise, not a capability. This is the whole list, with the difference stated.

InputStatusWhat that means
Pasted table Verified Copy the List of Trades out of the browser and paste it. Tab-separated, sniffed automatically. Tested on real copied tables.
Generic CSV Verified Any file with symbol, direction, entry and exit times and prices, and quantity. Column names are mapped; delimiter is detected.
Binance USDT-M trade history Built, unverified Your real fills, exported free from any Binance account. Written against the documented layout; not yet run against a real export. This one is also how we check ourselves — see accuracy.
TradingView Strategy Tester export Built, unverified Written against the documented format and a real screenshot, but it has not yet been verified against a real export file, because the export needs a paid TradingView plan. If yours fails we ask for the file rather than guessing.

Bybit and OKX exports, and the Python backtesting frameworks, are not supported yet. Nor is anything outside crypto: costing forex or index futures needs fee and spread data we have not bought. Saying so is cheaper than an upload that fails without explaining itself.

10

Corrections

Every report records the model version, the fee schedule versions and the calibration records it used. If we find a data error we can identify exactly which reports it touched, regenerate them, and mark the originals superseded. Material corrections and every model change appear in the changelog, and the accuracy figures on the accuracy page are updated whether they improve or worsen.

A correction process that exists before the first error is the difference between an embarrassing week and a dead product.