Here is the uncomfortable thing about backtesting: it is extraordinarily easy to produce a beautiful equity curve, and extraordinarily hard to produce an honest one. The chart looks the same either way — a smooth line going up and to the right. The difference is invisible until real money is on the line.
Να το δυσάρεστο με το backtesting: είναι εξαιρετικά εύκολο να φτιάξεις μια όμορφη equity curve, και εξαιρετικά δύσκολο να φτιάξεις μια ειλικρινή. Το γράφημα μοιάζει ίδιο και στις δύο περιπτώσεις — μια ομαλή γραμμή που ανεβαίνει. Η διαφορά είναι αόρατη μέχρι να μπουν πραγματικά λεφτά στο τραπέζι.
Almost every failed retail system we've looked at made at least one of the same five mistakes. None of them are exotic. All of them are avoidable. Let's walk through them, then rebuild the discipline that closes the gap between paper and reality.
Σχεδόν κάθε αποτυχημένο retail σύστημα που έχουμε δει έκανε τουλάχιστον ένα από τα ίδια πέντε λάθη. Κανένα δεν είναι εξωτικό. Όλα αποφεύγονται. Ας τα δούμε ένα-ένα, και μετά ας ξαναχτίσουμε την πειθαρχία που κλείνει το χάσμα ανάμεσα στο χαρτί και την πραγματικότητα.
Mistake 1 — Look-ahead bias
Λάθος 1 — Look-ahead bias
Look-ahead bias is using information at decision time that you wouldn't actually have had yet. It is the single most common way a backtest lies to you, and it usually slips in through the back door.
Το look-ahead bias είναι το να χρησιμοποιείς, τη στιγμή της απόφασης, πληροφορία που στην πραγματικότητα δεν θα την είχες ακόμα. Είναι ο πιο συνηθισμένος τρόπος με τον οποίο ένα backtest σού λέει ψέματα, και συνήθως μπαίνει από την πίσω πόρτα.
The classic version: your strategy decides to buy "when the candle closes above the moving average" — but your code evaluates that on the closing price and then assumes it filled at that same close. In live trading you can't know the close until the bar is over, by which point the price has moved. A subtler version: you compute an indicator, a normalization, or a feature scaler over the entire dataset before splitting into train and test. Now every "past" bar secretly carries a whisper of the future, because the mean and variance you scaled with were computed using data that hadn't happened yet.
Η κλασική εκδοχή: η στρατηγική σου αποφασίζει να αγοράσει «όταν το κερί κλείσει πάνω από τον κινητό μέσο» — αλλά ο κώδικάς σου το ελέγχει στην τιμή κλεισίματος και μετά υποθέτει ότι γέμισε σε εκείνο ακριβώς το κλείσιμο. Στο live trading δεν ξέρεις το κλείσιμο μέχρι να τελειώσει το κερί, και ως τότε η τιμή έχει ήδη κινηθεί. Μια πιο ύπουλη εκδοχή: υπολογίζεις έναν δείκτη, μια κανονικοποίηση ή έναν scaler πάνω σε ολόκληρο το dataset πριν το χωρίσεις σε train και test. Τώρα κάθε «παρελθοντικό» κερί κουβαλάει κρυφά έναν ψίθυρο του μέλλοντος, επειδή ο μέσος και η διακύμανση που χρησιμοποίησες υπολογίστηκαν με δεδομένα που δεν είχαν συμβεί ακόμα.
Mistake 2 — Fitting on the test set
Λάθος 2 — Fitting στο test set
You hold out the last two years as a "test set." Good. Then you run a backtest, tweak a parameter, run it again, tweak again — two hundred times — always checking against that same test set. The test set is no longer a test. You have just fit your parameters to it by hand, one decision at a time.
Κρατάς τα δύο τελευταία χρόνια ως «test set». Ωραία. Μετά τρέχεις ένα backtest, αλλάζεις μια παράμετρο, ξανατρέχεις, ξανα-αλλάζεις — διακόσιες φορές — ελέγχοντας πάντα στο ίδιο test set. Το test set δεν είναι πια test. Μόλις προσάρμοσες τις παραμέτρους σου σε αυτό με το χέρι, μία απόφαση τη φορά.
This is the quiet killer, because it doesn't feel like cheating. It feels like iterating. But every look at the test set spends a little of its credibility, and after enough looks there is nothing left. The result is a strategy tuned to the precise shape of one specific slice of history that will never repeat.
Αυτός είναι ο σιωπηλός δολοφόνος, γιατί δεν μοιάζει με κλεψιά. Μοιάζει με βελτίωση. Αλλά κάθε ματιά στο test set ξοδεύει λίγη από την αξιοπιστία του, και μετά από αρκετές ματιές δεν μένει τίποτα. Το αποτέλεσμα είναι μια στρατηγική κουρδισμένη στο ακριβές σχήμα μιας συγκεκριμένης φέτας ιστορικού που δεν θα ξανασυμβεί ποτέ.
Mistake 3 — Survivorship bias
Λάθος 3 — Survivorship bias
Backtest a stock strategy on today's index members and you are only testing the companies that survived. The ones that went to zero are no longer in your dataset, so your strategy never has the chance to hold them on the way down. The same applies to crypto: backtesting on the coins that exist today silently deletes the hundreds that died.
Κάνε backtest μια μετοχική στρατηγική στα σημερινά μέλη ενός δείκτη και δοκιμάζεις μόνο τις εταιρείες που επέζησαν. Αυτές που πήγαν στο μηδέν δεν υπάρχουν πια στα δεδομένα σου, οπότε η στρατηγική σου δεν έχει ποτέ την ευκαιρία να τις κρατήσει στην κατρακύλα. Το ίδιο ισχύει και στο crypto: κάνοντας backtest στα νομίσματα που υπάρχουν σήμερα, σβήνεις σιωπηλά τα εκατοντάδες που πέθαναν.
The fix is to use point-in-time data — the universe as it actually was on each historical date, delistings and all — not the universe as it looks in hindsight.
Η λύση είναι να χρησιμοποιείς point-in-time δεδομένα — το σύμπαν όπως ήταν πραγματικά σε κάθε ιστορική ημερομηνία, με delistings και όλα — όχι όπως φαίνεται εκ των υστέρων.
Mistake 4 — Overlapping labels and fake statistical confidence
Λάθος 4 — Επικαλυπτόμενα labels και ψεύτικη στατιστική σιγουριά
This one is more technical, and it's where most retail backtests quietly fall apart. If you label each bar by "what happened over the next 24 hours," then consecutive labels overlap — they share most of the same future. Overlapping labels are highly autocorrelated, which means your thousands of "independent" samples are nothing of the sort. Your strategy looks statistically robust because it appears to have been validated across an enormous number of trades. In reality it was validated across a handful of genuinely independent events.
Αυτό είναι πιο τεχνικό, και εδώ διαλύονται σιωπηλά τα περισσότερα retail backtests. Αν δίνεις σε κάθε κερί label με βάση «τι έγινε τις επόμενες 24 ώρες», τότε διαδοχικά labels επικαλύπτονται — μοιράζονται σχεδόν το ίδιο μέλλον. Τα επικαλυπτόμενα labels είναι έντονα αυτοσυσχετισμένα, που σημαίνει ότι τα χιλιάδες «ανεξάρτητα» δείγματά σου δεν είναι καθόλου ανεξάρτητα. Η στρατηγική σου δείχνει στατιστικά ανθεκτική επειδή φαίνεται να επικυρώθηκε σε τεράστιο αριθμό trades. Στην πραγματικότητα επικυρώθηκε σε μια χούφτα γνήσια ανεξάρτητων γεγονότων.
The remedy comes from Marcos López de Prado's work: purging (drop training samples whose label window overlaps the validation set) and an embargo (skip a small buffer of bars immediately after each validation block, so leakage can't creep across the seam). Without these, cross-validation on financial time series systematically overstates how good a model is.
Η θεραπεία έρχεται από τη δουλειά του Marcos López de Prado: purging (πέτα τα δείγματα εκπαίδευσης των οποίων το παράθυρο label επικαλύπτεται με το validation set) και embargo (παράλειψε ένα μικρό buffer από κεριά αμέσως μετά από κάθε validation block, ώστε η διαρροή να μην τρυπώνει στη ραφή). Χωρίς αυτά, το cross-validation σε χρηματοοικονομικές χρονοσειρές υπερεκτιμά συστηματικά το πόσο καλό είναι ένα μοντέλο.
Mistake 5 — Pretending trading is free
Λάθος 5 — Να κάνεις πως το trading είναι δωρεάν
Spread, commission, slippage, and financing all quietly subtract from every trade. A high-frequency strategy that looks profitable at zero cost can be deeply negative once you subtract a realistic spread — especially on instruments like gold or crypto where the spread widens exactly when you most want to trade. If your backtest doesn't model execution costs, it isn't modeling trading. It's modeling a fantasy.
Spread, προμήθεια, slippage και κόστος χρηματοδότησης αφαιρούν σιωπηλά από κάθε trade. Μια high-frequency στρατηγική που φαίνεται κερδοφόρα με μηδενικό κόστος μπορεί να είναι βαθιά αρνητική μόλις αφαιρέσεις ένα ρεαλιστικό spread — ειδικά σε προϊόντα όπως ο χρυσός ή το crypto, όπου το spread ανοίγει ακριβώς όταν θες πιο πολύ να μπεις. Αν το backtest σου δεν μοντελοποιεί τα κόστη εκτέλεσης, δεν μοντελοποιεί trading. Μοντελοποιεί μια φαντασίωση.
Walk-forward and purged cross-validation
Walk-forward και purged cross-validation
The cure for almost all of the above is a single principle: never let the model see anything it couldn't have seen in real time. Two techniques enforce it.
Η θεραπεία για σχεδόν όλα τα παραπάνω είναι μία αρχή: μην αφήνεις ποτέ το μοντέλο να δει κάτι που δεν θα μπορούσε να δει σε πραγματικό χρόνο. Δύο τεχνικές το επιβάλλουν.
- Walk-forward analysis: train on a window, test on the next unseen window, then roll the whole window forward and repeat. The model is always evaluated on its genuine future, never on data it trained on.
- Walk-forward analysis: εκπαίδευσε σε ένα παράθυρο, δοκίμασε στο επόμενο άγνωστο παράθυρο, μετά κύλισε όλο το παράθυρο μπροστά και επανέλαβε. Το μοντέλο αξιολογείται πάντα στο γνήσιο μέλλον του, ποτέ σε δεδομένα που εκπαιδεύτηκε.
- Purged k-fold cross-validation with an embargo: when you do use cross-validation, remove the training samples whose outcome windows overlap the validation fold, and embargo a buffer around each fold. This kills the leakage that overlapping labels create.
- Purged k-fold cross-validation με embargo: όταν χρησιμοποιείς cross-validation, αφαίρεσε τα δείγματα εκπαίδευσης των οποίων τα παράθυρα αποτελέσματος επικαλύπτονται με το validation fold, και βάλε embargo ένα buffer γύρω από κάθε fold. Αυτό σκοτώνει τη διαρροή που δημιουργούν τα επικαλυπτόμενα labels.
Pair those with point-in-time data, a train/test split you only look at once, and a cost model that reflects your real broker, and the gap between your backtest and your live results shrinks from a chasm to a margin.
Συνδύασέ τα με point-in-time δεδομένα, ένα train/test split που το κοιτάς μόνο μία φορά, και ένα μοντέλο κόστους που αντικατοπτρίζει τον πραγματικό σου broker, και το χάσμα ανάμεσα στο backtest και τα live αποτελέσματα συρρικνώνεται από άβυσσος σε περιθώριο.
A backtest is not a promise. At best it is a carefully constructed argument that a strategy might have an edge — and the entire value of that argument depends on how ruthlessly you prevented it from cheating. When a result looks too good, the right instinct isn't excitement. It's suspicion. Go hunting for the leak. It's almost always there.
Ένα backtest δεν είναι υπόσχεση. Στην καλύτερη περίπτωση είναι ένα προσεκτικά δομημένο επιχείρημα ότι μια στρατηγική ίσως έχει edge — και όλη η αξία αυτού του επιχειρήματος εξαρτάται από το πόσο αδίστακτα την εμπόδισες να κλέψει. Όταν ένα αποτέλεσμα δείχνει υπερβολικά καλό, το σωστό ένστικτο δεν είναι ενθουσιασμός. Είναι καχυποψία. Πήγαινε να ψάξεις τη διαρροή. Σχεδόν πάντα είναι εκεί.
Treat the numbers as a hypothesis to be attacked, not a fortune to be counted, and you'll already be ahead of most of the people running systems with real money.
Αντιμετώπισε τα νούμερα ως υπόθεση προς επίθεση, όχι ως περιουσία προς μέτρημα, και θα είσαι ήδη μπροστά από τους περισσότερους που τρέχουν συστήματα με πραγματικά λεφτά.