Naar de inhoud

Drie fouten, drie geslaagde tests, geen enkele gevonden

Grafiek van vier uur van de ETHUSDT-perpetual met twee terugkijkvensters naast elkaar getekend, een van 23 bars en een van 22, oftewel de lengte die de Pine-broncode berekent en de lengte die de Python-nabouw uit dezelfde formule berekende.
Dezelfde terugkijkperiode, twee keer berekend. Pine rondt 22,5 van nul af en komt op 23. Python 3 rondt af naar het even getal en komt op 22. In geen van beide talen waarschuwt iets u dat de conventie is veranderd.

Als u ooit een indicator naar Python hebt overgezet om er een backtest op te draaien, of een script hebt vertrouwd omdat er een verificatie bij zat, dan gaat dit over het gat dat die twee dingen openlaten.

We hebben drie van onze eigen indicatoren nagebouwd zodat er een backtest overheen kon lopen. Alle drie de nabouwen bevatten een verkeerde constante. Alle drie kwamen door hun validatie. Geen enkele werd door een test opgemerkt.

Waarom een indicator überhaupt nabouwen

Een Pine-script draait op uw grafiek. Het loopt niet in een lus over zes jaar historie, en het beantwoordt niet of een signaal werkelijk iets oplevert. Om dat te vragen bouwt u het na in iets dat u duizenden keren kunt draaien.

Precies bij die nabouw houdt een indicator geruisloos op dezelfde indicator te zijn.

De fout die het meest kostte, en het is één bar

Een van de lengtes binnen Volume Oracle wordt afgeleid uit de tijdsperiode:

target bars   = 36 hours × 60 / 240 minutes = 9
regime length = round(9 × 2.5) = round(22.5)

De math.round van Pine breekt gelijke gevallen van nul af. Dat geeft 23. De round() van Python 3 gebruikt bankiersafronding, die gelijke gevallen naar het even getal breekt. Dat geeft 22.

Beide zijn correcte implementaties van afronden. Het zijn simpelweg verschillende conventies, en niets waarschuwt u dat u van de ene naar de andere bent overgestapt.

Elke terugkijkperiode die uit dat getal werd afgeleid, schoof mee. Het resultaat op de best onderbouwde rij van een doorloop over 36 signalen:

versievoordeel op 48 uurtrefkansn
nagebouwd, lengte 22+0,423%511216
correct, lengte 23+0,260%501223

Een korting van 38% door een afrondingsconventie.

Vervolgens legden we de les verkeerd vast

In onze notitie stond dat het alleen op 4H gebeurde. Ze was geschreven vanuit de ene tijdsperiode die toevallig onder test stond, en zo bleef ze twee maanden staan.

Dezelfde rekensom over elke tijdsperiode gedraaid:

tijdsperioderegimelengtestroomlengteresultaat
5m45 tegen 4523 tegen 22wijkt af
2H45 tegen 4523 tegen 22wijkt af
4H23 tegen 2212 tegen 11wijkt af
8H53 tegen 5227 tegen 26wijkt af
1D18 tegen 189 tegen 9gelijkspel, komt overeen
3D, 1W15 tegen 158 tegen 8gelijkspel, komt overeen

Vier van de zestien, niet één.

Uit die tabel vallen twee dingen die geen enkele redenering had opgeleverd.

Een gelijkspel is niet genoeg. 1D, 3D en 1W landen allemaal precies op ,5 en komen overeen. Bankiersafronding verschuift alleen een gelijk geval waarvan het naar boven afgeronde antwoord oneven is, dus round(17.5) is hoe dan ook 18. Ruwweg de helft van alle gelijke gevallen is onschadelijk, en juist daarom bewijst het steekproefsgewijs controleren van er één helemaal niets.

De afwijking kan één stap later aankomen. Op 5m en 2H komt de eerste lengte overeen op 45. De volgende regel, round(45 × 0.5), is opnieuw 22,5, en die splitst wel. Als u de eerste constante controleert en doorloopt, keurt u beide tijdsperioden ten onrechte goed.

De andere twee, kort

Harmonic normaliseert een oscillator door hem af te kappen op een rollende band. In de broncode wordt elke bar door zijn eigen band afgekapt. De nabouw kapte een heel venster van 200 bars af met de band van de huidige bar, wat een andere functie is. Gemeten verschil over 11.497 bars: gemiddeld 0,47 punt. Een echte overschrijffout zonder wezenlijk effect.

Die hebben we bovendien opgeblazen voordat we hem maten. Hij werd, puur op het lezen van de code, aangekondigd als vrijwel zeker de afwijking van 9%. Het getal was 0,47. Een echte fout en een wezenlijke fout zijn verschillende beweringen, en de orde van grootte wordt gemeten voordat het effect een naam krijgt.

Plutus Flow middelt volume over 50 bars om uitschieters te vinden. De nabouw gebruikte er 20, omdat dat het getal was dat we dachten te kennen. Effect: minder dan een tiende procentpunt, geen tekenwisselingen. Het oordeel bewoog niet, maar het getal was fout en is nu goed, en dat is de enige maatstaf die telt.

Het deel dat werkelijk de les is

Dit is wat de validatie van elke nabouw destijds meldde.

nabouwzijn eigen controlewat dat betekende
Volume Oracle3 van 3 ervoor, 3 van 3 ernakon ze niet uit elkaar houden
Harmonic6 van 8 ervoor, 5 van 8 ernagaf de foutieve versie een hogere score
Plutus Flownooit gedraaid

Bij de middelste rij is het de moeite waard stil te staan. De validatie gaf de voorkeur aan de verkeerde code. Hadden we de controle laten beslissen, dan had ze ons de fout weer in geredeneerd.

Een validatie die één uitvoerwaarde vergelijkt, kan een verkeerde invoerconstante niet opsporen. De uitvoer is een veel te grove zeef. Veel verschillende verkeerde parametersets leveren vandaag hetzelfde regimelabel op, dezelfde kruisingstoestand, dezelfde kleur op de grafiek. Ze verschillen op bars waar u nu niet naar kijkt, en precies daar leeft een backtest.

Wat u in plaats daarvan moet doen

Druk elke afgeleide parameter af. Elke lengte, elke drempel, elke vermenigvuldiger. Vergelijk ze regel voor regel met de broncode, voordat u iets beoordeelt.

Houd de uitvoercontrole. Ze vangt een andere klasse fouten en ze is noodzakelijk. Ze is alleen bij lange na niet voldoende, en alle drie deze fouten liepen er ongehinderd langs.

De eerlijke reikwijdte

De Pine-code klopte in alle drie de gevallen. Wat niet klopte, was het apparaat dat gebouwd was om hem te testen, en dat is de ongemakkelijker versie van het probleem: het meetinstrument liep uit de pas, en de zelfcontrole van datzelfde instrument zei van niet.

Het getal van 38% is één rij, één doorloop, één tijdsperiode, binnen de steekproef, en is geciteerd uit onze eigen vastlegging in plaats van opnieuw berekend. Het afrondingsresultaat is met één commando reproduceerbaar, en bij het corrigeren ervan kwam aan het licht dat onze eigen notitie erover twee maanden lang fout was geweest.


Meting uit het verleden van ons eigen gereedschap, achteraf beschreven. Niets hiervan is een aanbeveling of een indicatie van toekomstige resultaten.