4 Σεπτέμβριος 2026 · backtesting

Το stop και ο στόχος σας ήταν μέσα στην ίδια μπάρα. Ποιο από τα δύο επέλεξε το backtest σας;

Το stop και ο στόχος σας ήταν μέσα στην ίδια μπάρα. Ποιο από τα δύο επέλεξε το backtest σας;

Long από 84,120. Stop στα 84,036, στόχος στα 84,271. Καταφθάνει η μπάρα του επόμενου λεπτού: άνοιγμα 84,118, υψηλό 84,290, χαμηλό 84,010, κλείσιμο 84,240.

Και τα δύο επίπεδα βρίσκονται μέσα σε αυτή την μπάρα. Το stop ενεργοποιήθηκε και ο στόχος ενεργοποιήθηκε, όμως οι τέσσερις αριθμοί OHLC δεν περιέχουν απολύτως καμία πληροφορία για το ποιο συνέβη πρώτο. Παρ' όλα αυτά, το backtest σου επέστρεψε έναν αριθμό. Κάπου μέσα στον βρόχο, μια γραμμή αποφάσισε — πιθανότατα μια γραμμή που δεν θεώρησες παραδοχή μοντελοποίησης όταν την έγραψες.

Αυτή είναι η μεγαλύτερη μεμονωμένη πηγή πλασματικής απόδοσης που βλέπω σε στρατηγικές μικρού ορίζοντα, πιο σημαντική από τις προμήθειες και το slippage, επειδή δεν μοιάζει με παραδοχή. Μοιάζει με τεχνική λεπτομέρεια υλοποίησης.

Λάθος τρόπος 1: αφήνεις την αλυσίδα if να αποφασίσει

Η συνηθισμένη μορφή:

if bar.high >= target:
    exit(target, "tp")
elif bar.low <= stop:
    exit(stop, "sl")

Κανείς δεν επέλεξε «οι στόχοι εκτελούνται πριν από τα stop». Ο έλεγχος του στόχου απλώς γράφτηκε πρώτος, επειδή αυτή είναι η θετική έκβαση και αυτή είχες στο μυαλό σου. Αντιστρέφεις τους δύο κλάδους και αλλάζει η καμπύλη κεφαλαίου· αυτό από μόνο του θα έπρεπε να σου δείξει ότι το P&L της στρατηγικής εξαρτάται εν μέρει από τον επεξεργαστή κειμένου σου.

Έτρεξα έναν σκόπιμα συνηθισμένο scalper επαναφοράς στον μέσο όρο στο BTCUSDT perp, με μπάρες 1 λεπτού για τρεις μήνες, 4,812 συναλλαγές, stop 0.10% και στόχο 0.18% από την είσοδο. Ίδια σήματα, ίδιες προμήθειες, άλλαξε μόνο η σύμβαση επίλυσης της ισοβαθμίας.

12.6%των συναλλαγών άγγιξαν και τα δύο επίπεδα μέσα σε μία μπάρα
2.31Sharpe, πρώτα εκτελείται ο στόχος
0.18Sharpe, πρώτα εκτελείται το stop
0.94Sharpe, επίλυση σε μπάρες 1 δευτερολέπτου

Το ένα όγδοο των συναλλαγών καθορίζει όλο το αποτέλεσμα. Αυτή είναι η αριθμητική ενός στενού ζεύγους stop και στόχου: οι αμφίσημες συναλλαγές είναι εκείνες όπου η τιμή κινήθηκε και προς τις δύο κατευθύνσεις — οι πιο ενδιαφέρουσες, δηλαδή — και καθεμία αξίζει ολόκληρη την απόσταση από το stop ως τον στόχο, ανάλογα με το αποτέλεσμα της «ρίψης νομίσματος». 12.6% των συναλλαγών × 0.28% απόστασης ισούται με 3.5% του ακαθάριστου ονομαστικού κύκλου εργασιών ανά μονάδα δείγματος, ποσό που ξεπερνά κατά πολύ το πραγματικό πλεονέκτημα της στρατηγικής.

Το ποσοστό εξαρτάται από το μέγεθος της μπάρας σε σχέση με την απόσταση των επιπέδων σου και επιδεινώνεται γρήγορα όσο μεγαλώνει το χρονικό διάστημα των μπαρών. Ίδιο stop και στόχος, ίδια σήματα, διαφορετική ανάλυση:

Χρονικό διάστημα μπάραςΣυναλλαγές με τα δύο επίπεδα μέσα σε μία μπάραSharpe (πρώτα ο στόχος)
1s0.3%0.91
1m12.6%2.31
5m34%3.60
15m49%4.42
1h71%5.88

Δες τι λέει πραγματικά αυτός ο πίνακας. Οι πιο αραιές μπάρες βελτίωσαν το backtest. Το ένστικτο κάθε ερευνητή λέει ότι οι ωριαίες μπάρες είναι η συντηρητική επιλογή: λιγότερος θόρυβος, λιγότερη υπερπροσαρμογή στη μικροδομή. Όμως, με μια σύμβαση εντός μπάρας που ευνοεί τη δική σου πλευρά, η αραιότερη μπάρα είναι απλώς ένα μεγαλύτερο κουτί, μέσα στο οποίο μπορείς να υποθέτεις ότι στάθηκες τυχερός. Στις μπάρες 1h, επτά στις δέκα συναλλαγές εξαρτώνται αποκλειστικά από τη σύμβαση. Αυτό το backtest δεν δοκιμάζει μια στρατηγική· δοκιμάζει τη σειρά δύο εντολών `if` 3,400 φορές.

Λάθος τρόπος 2: υποθέτεις ότι το stop εκτελέστηκε στην τιμή του stop

Ας πούμε ότι διορθώνεις τη σειρά. Πρώτα εκτελείται το stop, καταγράφεις ζημία ακριβώς 0.10% συν προμήθεια taker και νιώθεις ότι έκανες αυστηρή δουλειά. Εξακολουθούν να υπάρχουν δύο ξεχωριστά λάθη.

Το πρώτο είναι ότι το stop είναι εντολή ενεργοποίησης, όχι εκτέλεσης. Στο Binance USDⓈ-M μια εντολή STOP_MARKET γίνεται εντολή αγοράς μόλις εκπληρωθεί η συνθήκη ενεργοποίησης και κατόπιν καταναλώνει ό,τι υπάρχει στο βιβλίο εντολών. Σε ένα ήρεμο λεπτό, αυτό σημαίνει ένα ή δύο ticks slippage. Στο λεπτό που πράγματι ενεργοποίησε το stop σου — εκείνο με κερί 40 μονάδων και αλυσιδωτές ρευστοποιήσεις από κάτω — το βιβλίο εντολών έχει περιορισμένη ρευστότητα ακριβώς στην πλευρά που διασχίζεις. Στο δείγμα μου, αντιστοιχίζοντας τις ενεργοποιήσεις stop με τα δεδομένα συναλλαγών tick, η διάμεση τιμή εκτέλεσης ήταν 1.4 bps πέρα από την τιμή ενεργοποίησης και το 95ο εκατοστημόριο ήταν 11 bps. Με stop 10 bps, η ουρά της κατανομής σού κοστίζει επιπλέον ένα δέκατο του κινδύνου που νόμιζες ότι είχες ορίσει.

Το δεύτερο είναι πιο λεπτό και αφορά ειδικά τα perps: ποια τιμή το ενεργοποιεί. Το Binance ορίζει από προεπιλογή τις εντολές stop να ενεργοποιούνται στην τιμή mark, η οποία υπολογίζεται από τον δείκτη συν μια εξομαλυμένη βάση, όχι από την τελευταία συναλλαγή σε εκείνο το ανταλλακτήριο. Η σειρά OHLC σου βασίζεται στην τελευταία τιμή. Είναι διαφορετικές σειρές και αποκλίνουν περισσότερο ακριβώς κατά τα γεγονότα που ενεργοποιούν τα stop.

Τελευταία τιμή (τα klines σου)Τιμή mark (προεπιλεγμένη ενεργοποίηση)
Πηγήσυναλλαγές σε αυτό το ανταλλακτήριοδείκτης από διάφορα ανταλλακτήρια + βάση
Συμπεριφορά των σκιώνπλήρης διακύμανσηέντονα εξομαλυμένη
Τυπική απόκλιση1–3 bps σε ήρεμες συνθήκες, 20–35 bps σε λεπτό αλυσιδωτών ρευστοποιήσεων
Συνέπεια για το backteststop που ενεργοποιήθηκαν ενώ δεν θα έπρεπε, και το αντίστροφο

Έτσι, μια σκιά 25 bps στη σειρά τελευταίας τιμής σε βγάζει από τη θέση στο backtest, ενώ η ζωντανή τιμή mark δεν πλησίασε ποτέ την τιμή ενεργοποίησης σε απόσταση μικρότερη από 10 bps. Ή συμβαίνει το αντίστροφο, τη μέρα που κινείται ο δείκτης και το ανταλλακτήριό σου μένει πίσω. Αν ορίσεις workingType σε CONTRACT_PRICE, ευθυγραμμίζεις τουλάχιστον τη ζωντανή συμπεριφορά με τα δεδομένα σου. Συνήθως αυτή είναι η σωστή επιλογή για έναν ερευνητή, καθώς η πιστή προσομοίωση ενεργοποίησης με τιμή mark σημαίνει ότι πρέπει να περάσεις και δεύτερη σειρά σε ολόκληρη τη μηχανή εκτέλεσής σου.

Η περίπτωση που θυμάμαι καλύτερα: κάποιος από την ομάδα μας «βελτίωσε» μια στρατηγική μετακινώντας το take-profit από 0.18% σε 0.21%. Το Sharpe ανέβηκε από 2.3 σε 3.1. Δεν υπήρχε νέο πλεονέκτημα. Ο στόχος απλώς είχε μετακινηθεί έξω από το πυκνό τμήμα της κατανομής των σκιών 1 λεπτού, οπότε λιγότερες συναλλαγές κατέληγαν στον αμφίσημο κάδο όπου ο κώδικας τους χάριζε σιωπηλά τη νίκη. Είχαν βελτιστοποιήσει τον κανόνα επίλυσης της ισοβαθμίας.

Λάθος τρόπος 3: υποθέτεις πάντα το χειρότερο και το λες συντηρητικό

Η αυθόρμητη διόρθωση είναι η απαισιοδοξία. Αν αγγιχτούν και τα δύο επίπεδα, καταγράφεις το stop. Έτοιμο, τέλος η αισιοδοξία, προχωράμε.

Κάποτε το έκανα κι εγώ. Είναι καλύτερο από την εναλλακτική, αλλά και πάλι λάθος, για δύο λόγους.

Απορρίπτει στρατηγικές που είναι μια χαρά. Η απαισιόδοξη επίλυση στο 12.6% των συναλλαγών κόστισε σε αυτή τη στρατηγική 2.1 μονάδες Sharpe σε σύγκριση με το 0.94 που προέκυψε από επίλυση σε δεδομένα tick. Αν ο πραγματικός αριθμός είναι 0.94 και η σύμβασή σου αναφέρει 0.18, πετάς την ιδέα και καταπιάνεσαι με κάτι χειρότερο. Συντηρητισμός που αποκλίνει κατά δύο μονάδες Sharpe δεν είναι συντηρητισμός· είναι θόρυβος με ηθικολογικό προσωπείο.

Ακόμη χειρότερα, αλλοιώνει τη βελτιστοποίηση. Δώσε σε μια σάρωση παραμέτρων έναν απαισιόδοξο κανόνα επίλυσης ισοβαθμίας και ο optimizer μαθαίνει να αποφεύγει την ασάφεια, γιατί πλέον η ασάφεια επιφέρει καθαρή ποινή. Θα κινηθεί προς φαρδιά stop και κοντινούς στόχους ή προς αργές μπάρες, όπου σπάνια συνυπάρχουν τα δύο επίπεδα, και θα σου παρουσιάσει παραμέτρους που επιλέχθηκαν με βάση τη σύμβαση εκτέλεσής σου αντί για την αγορά. Ίδια αστοχία με την επιεική εκδοχή, αντίθετο πρόσημο, εξίσου αόρατη στην αναφορά απόδοσης.

Εμπειρικός κανόνας που εφαρμόζουμε πριν από οτιδήποτε άλλο: αν το stop_distance + target_distance είναι μικρότερο από το εύρος του 75ου εκατοστημορίου για το χρονικό διάστημα της μπάρας σου, η παραδοχή σου για τις κινήσεις εντός μπάρας επηρεάζει το P&L περισσότερο από το σήμα σου. Υπολόγισε και τα δύο μεγέθη. Χρειάζονται τέσσερις γραμμές και έχουν τερματίσει περισσότερες αξιολογήσεις στρατηγικών από οποιονδήποτε άλλο μεμονωμένο έλεγχο.

Τι λειτουργεί στην πράξη

Η διαδρομή μέσα στην μπάρα είναι δεδομένο. Ανάκτησέ το ή οριοθέτησε ό,τι δεν μπορείς να ανακτήσεις.

  1. Κάνε την επίλυση στην πιο λεπτομερή σειρά που διαθέτεις. Τα aggTrades του Binance για τα σχετικά λεπτά είναι μερικές εκατοντάδες εγγραφές και δίνουν οριστική απάντηση: ποιο επίπεδο αγγίχτηκε πρώτο και σε ποια τιμή εκτελέστηκε η διάσπαση. Δεν χρειάζεσαι δεδομένα tick για ολόκληρο το backtest, μόνο για τις αμφίσημες μπάρες. Στο δείγμα μου ήταν 606 λεπτά από τα 129,600. Πρόκειται για μικρή λήψη δεδομένων, όχι για έργο υποδομής.
  2. Αν δεν υπάρχουν δεδομένα tick, κατέβα ένα ή δύο επίπεδα χρονικού πλαισίου μόνο για την επίλυση. Σήματα στα 15m, έξοδοι που επιλύονται σε μπάρες 1s ή 1m. Η ασάφεια πέφτει από 49% σε κλάσμα τοις εκατό, και ό,τι απομένει είναι αρκετά μικρό ώστε να μπορείς να το αγνοήσεις με ειλικρίνεια.
  3. Να αναφέρεις πάντα το εύρος. Τρέξε κάθε backtest δύο φορές, με αισιόδοξη και απαισιόδοξη επίλυση, και εμφάνισε και τα δύο Sharpe δίπλα σε εκείνο που προκύπτει από τα διαθέσιμα δεδομένα. Αυτή η απόκλιση είναι η αβεβαιότητά σου για τις κινήσεις εντός μπάρας και πρέπει να εμφανίζεται στην αναφορά απόδοσης δίπλα στο διάστημα εμπιστοσύνης που θα έβαζες για το ίδιο το Sharpe. Όταν το εύρος είναι 0.2–2.3, κανένα συμπέρασμα μέσα σε αυτό δεν είναι πραγματικό.
  4. Παρακολούθησε το ποσοστό ασάφειας ως βασικό δείκτη. Εμφανίζεται στην κορυφή κάθε κάρτας στρατηγικής μας, δίπλα στον αριθμό συναλλαγών και τον κύκλο εργασιών. Ποσοστό πάνω από περίπου 5% σημαίνει ότι δοκιμάζεται η λογική εξόδου, όχι η λογική εισόδου.
  5. Μοντελοποίησε ξεχωριστά την ενεργοποίηση και την εκτέλεση. Ενεργοποίησε την εντολή βάσει της σειράς τιμών που χρησιμοποιεί πράγματι το ανταλλακτήριο· εκτέλεσε στην τιμή ενεργοποίησης συν ένα slippage που προκύπτει από κατανομή βαθμονομημένη με βάση τα δεδομένα, όχι στην ίδια την τιμή ενεργοποίησης.

Στις μετοχές υπάρχει το ίδιο πρόβλημα με διαφορετική μορφή. Ένα stop στα 62.00 σε μετοχή που ανοίγει με χάσμα στα 58.40 μέσα στη νύχτα δεν εκτελείται στα 62.00· εκτελείται κάπου κάτω από την τιμή ανοίγματος. Κι ένα backtest με ημερήσιες μπάρες που καταγράφει slippage −$0.00 σε περιπτώσεις που η τιμή ανοίγει κάτω από το stop θα σου πει ευχαρίστως ότι ένα επίπεδο προστασίας με stop-loss βελτίωσε τη μέγιστη πτώση του κεφαλαίου. Δεν τη βελτίωσε. Απλώς δεν δοκιμάστηκε στις μέρες που έχουν σημασία. Το ίδιο συμβαίνει και στις αναστολές διαπραγμάτευσης: το stop σου εκτελείται στην επαναληπτική δημοπρασία, σε τιμή που δεν δείχνει ποτέ το χαμηλό της μπάρας.

Τίποτα από αυτά δεν είναι εξεζητημένο. Αρκεί να αναγνωρίσουμε ότι μια μπάρα είναι σύνοψη και ότι μια στρατηγική stop και στόχου βασίζεται στη σειρά γεγονότων που η σύνοψη άφησε έξω. Όταν η μηχανή paper trading εκτελέσει επιτέλους τη στρατηγική σε ζωντανά δεδομένα, αυτά θα επιβάλουν τη δική τους σειρά γεγονότων — και ποτέ δεν τους ένοιαξε ποιον κλάδο της εντολής if πληκτρολόγησες πρώτο.

εκτελέσεις εντός μπάραςεντολές stopbacktestingσυμβόλαια μελλοντικής εκπλήρωσης κρυπτονομισμάτωνμικροδομή αγοράς
ΚοινοποίησηXLinkedInFacebookRedditHacker NewsWhatsAppTelegramEmail
← Όλα τα άρθρα