Μου έστειλες το notebook την περασμένη εβδομάδα: ίδιο σήμα, ίδιο σύμπαν, τα ίδια δεδομένα perp BTCUSDT 14 μηνών. Η μόνη αλλαγή ήταν στην εκτέλεση. Σταμάτησες να περνάς το spread και άρχισες να αφήνεις εντολές αγοράς ένα tick μέσα από το spread, και το Sharpe ανέβηκε από 0.42 σε 2.14. Με ρώτησες αν αυτό είναι πραγματικό ή αν κάτι χάλασες.
Κάτι χάλασες. Θέλω να σου δείξω ακριβώς πού, γιατί το bug είναι μία γραμμή, ενώ το μάθημα από πίσω της είναι πολύ μεγαλύτερο.
Ορίστε ο κανόνας εκτέλεσής σου, όπως τον αντέγραψα από τη μηχανή σου:
if bar.low <= limit_price: fill(limit_price)
Αυτό λέει: αν η αγορά κατέγραψε συναλλαγή σε τιμή ίση ή χαμηλότερη από τη δική μου μέσα σε αυτό το λεπτό, η εντολή μου εκτελέστηκε στην τιμή μου. Αυτό που κωδικοποιεί στην πραγματικότητα είναι ότι η τιμή άγγιξε το επίπεδό σου. Το άγγιγμα δεν ισοδυναμεί με εκτέλεση. Ανάμεσα στα δύο υπάρχει μια ουρά, κι εσύ έχεις μοντελοποιήσει την ουρά σαν να είναι άδεια.
Τι βρίσκεται μπροστά σου
Όταν τοποθετείς εντολή αγοράς στα 84,120.0 στο perp BTCUSDT, μπαίνεις στο τέλος της ουράς όσων εντολών βρίσκονται ήδη εκεί. Στο καλύτερο επίπεδο τιμών αυτού του συμβολαίου, αυτό συνήθως είναι κάπου μεταξύ 4 και 30 BTC, ανάλογα με την ώρα της ημέρας· η διάμεσος στο δείγμα σου είναι περίπου 12 BTC. Η εντολή σου είναι 0.4 BTC. Για να γίνει συναλλαγή, οι πωλητές πρέπει να χτυπήσουν αυτό το επίπεδο με αρκετό συνολικό όγκο ώστε να εξαντλήσουν όλους όσοι μπήκαν πριν από εσένα, και πρέπει να το κάνουν προτού ακυρωθεί το επίπεδο κάτω από τα πόδια σου ή απομακρυνθεί ανοδικά η αγορά.
Άρα το ερώτημα που πρέπει να θέτει το backtest σου δεν είναι «έφτασε η τιμή στα 84,120.0;», αλλά «εκτελέστηκαν τουλάχιστον 12.4 BTC σε πωλήσεις αγοράς στα 84,120.0 όσο η εντολή μου παρέμενε εκεί;». Πρόκειται για εντελώς διαφορετικά γεγονότα. Στα δεδομένα σου διαφέρουν κατά περίπου τρεις φορές.
Τρεις κανόνες εκτέλεσης, τρεις διαφορετικές στρατηγικές
Έτρεξα ξανά το σήμα σου με τις ίδιες εισόδους και τρία μοντέλα εκτέλεσης. Ίδιο alpha, ίδιες προμήθειες, ίδια χρηματοδότηση. Άλλαξε μόνο η λογική εκτέλεσης.
| Κανόνας εκτέλεσης | Εκτελέσεις | Μέσο edge 60s μετά την εκτέλεση | Sharpe |
|---|---|---|---|
Άγγιγμα: low <= limit | 4,180 | +2.6 bp | 2.14 |
Αυστηρή διάσπαση: low < limit - 1 tick | 1,712 | +0.4 bp | 0.61 |
| Προσομοίωση ουράς με όγκο στο επίπεδο | 1,306 | +0.9 bp | 0.77 |
Η μεσαία γραμμή είναι η πρόχειρη διόρθωση που δοκιμάζουν πρώτα όλοι: μέτρα εκτέλεση μόνο αν η αγορά διαπραγματεύτηκε αυστηρά πέρα από την τιμή σου, με τη λογική ότι αν την προσπέρασε, πρέπει να εξάντλησε την εντολή σου. Είναι σωστό ως προς την κατεύθυνση και εξαλείφει το μεγαλύτερο μέρος της φαντασίωσης. Έχει όμως και μια σοβαρή μεροληψία, στην οποία θα επανέλθω.
Η κάτω γραμμή είναι αυτή που πρέπει να υλοποιήσεις. Δεν χρειάζεται ροή L3 ούτε ανακατασκευή ανά εντολή. Τα περισσότερα από όσα χρειάζεσαι τα έχεις ήδη.
Προσομοίωση ουράς με aggTrades
Τράβηξε τη ροή συγκεντρωτικών συναλλαγών αντί για klines. Κάθε καταγραφή περιέχει τιμή, ποσότητα, χρονική σήμανση και ένδειξη πλευράς maker, που σου λέει αν ο επιτιθέμενος αγόραζε ή πουλούσε. Αρκούν για μια αξιοπρεπή προσομοίωση της δικής σου παθητικής εντολής:
- Όταν τοποθετείται η εντολή σου, αποθήκευσε στιγμιότυπο του όγκου που βρίσκεται ήδη στο επίπεδο της τιμής σου. Αν έχεις μόνο βιβλίο εντολών με ενημερώσεις κάθε 100ms, χρησιμοποίησε το τελευταίο στιγμιότυπο· το σφάλμα είναι μικρό σε σύγκριση με αυτό που διορθώνεις.
- Όρισε το
queue_ahead = resting_size. Να είσαι απαισιόδοξος και να υποθέτεις ότι βρίσκεσαι τελευταίος. Έτσι είναι, εκτός αν εσύ δημιουργείς το επίπεδο. - Διάσχισε τη ροή συναλλαγών. Κάθε καταγραφή πώλησης από επιτιθέμενο σε τιμή ίση ή χαμηλότερη από τη δική σου μειώνει το
queue_aheadκατά την αντίστοιχη ποσότητα. Όταν γίνει αρνητικό, η εντολή σου εκτελείται στην τιμή σου, εκείνη τη χρονική στιγμή. - Αν η τιμή απομακρυνθεί κατά ένα tick, μην επαναφέρεις την ουρά στο μηδέν. Μείωσέ την σταδιακά. Κάποιες από τις εντολές που προηγούνται ακυρώνονται όταν το επίπεδο μένει ανενεργό, άλλες όχι. Μείωση 30-40% ανά ολόκληρο δευτερόλεπτο εκτός καλύτερης τιμής ταίριαξε στις ανακατασκευές μου καλύτερα από οποιοδήποτε από τα δύο άκρα.
- Αν η στρατηγική σου θα ακύρωνε και θα τοποθετούσε ξανά την εντολή, μοντελοποίησε την επανατοποθέτηση ως νέα εντολή στο τέλος της νέας ουράς. Αυτό είναι το βήμα που παραλείπουν πολλοί και εκεί κρύβεται η υπόλοιπη φαντασίωση.
Στο βήμα 2 θα θελήσεις να διαφωνήσεις μαζί μου. Ναι, μερικές φορές βρίσκεσαι κοντά στην αρχή της ουράς, επειδή τοποθέτησες την εντολή τη στιγμή που σχηματίστηκε το επίπεδο. Εντάξει — μέτρησέ το, μην το υποθέτεις. Κατέγραψε τον όγκο που υπάρχει όταν τοποθετείς την εντολή και άσε τα δεδομένα να σου δείξουν τι ποσοστό των εντολών σου μπαίνει όντως νωρίς. Στη στρατηγική σου ήταν 11%, επειδή το σήμα σου ενεργοποιείται μετά από μια κίνηση, άρα το επίπεδο στο οποίο μπαίνεις υπάρχει ήδη και έχει ήδη κόσμο.
Οι εκτελέσεις που παίρνεις είναι αυτές που θα προτιμούσες να μην είχες πάρει
Τώρα το σημείο που έχει πραγματικά σημασία και ο λόγος που ο κανόνας της αυστηρής διάσπασης είναι μεροληπτικός.
Σκέψου πότε εξαντλείται πλήρως η εντολή αγοράς σου. Συμβαίνει όταν η πίεση των πωλήσεων είναι αρκετά μεγάλη ώστε να φάει όλο το επίπεδο. Δηλαδή, εξ ορισμού, τη στιγμή που η αγορά κινείται καθοδικά μέσα από την τιμή σου. Οι εκτελέσεις για τις οποίες είσαι πιο βέβαιος είναι αυτές στις οποίες βρίσκεσαι αμέσως σε δυσμενή θέση.
Χώρισε τις εκτελέσεις σου ανάλογα με τον τρόπο που έγιναν και μέτρησε την απόκλιση τιμής στα 60 δευτερόλεπτα:
| Τύπος εκτέλεσης | Ποσοστό εκτελέσεων | Απόκλιση τιμής στα 60s |
|---|---|---|
| Έγινε συναλλαγή στο επίπεδο, η τιμή ανέκαμψε ανοδικά | 38% | +3.1 bp |
| Έγινε συναλλαγή στο επίπεδο, η τιμή παρέμεινε σταθερή | 21% | +0.2 bp |
| Η τιμή διαπραγματεύτηκε 2+ ticks χαμηλότερα | 41% | −2.4 bp |
Το αφελές backtest σου πήρε και τις τρεις κατηγορίες και τις τιμολόγησε όλες σαν να ήταν δωρεάν. Ο κανόνας της αυστηρής διάσπασης σού δίνει σχεδόν αποκλειστικά την τρίτη κατηγορία, γι’ αυτό και το edge της έπεσε περισσότερο από εκείνο της προσομοίωσης ουράς. Κανένα από τα δύο δεν είναι σωστό. Η προσομοίωση ουράς σού δίνει ένα ρεαλιστικό μείγμα, και όλο το παιχνίδι κρίνεται από αυτό το μείγμα: η παθητική εκτέλεση σου αποφέρει το spread και σε κάνει να πληρώνεις το τίμημα της δυσμενούς επιλογής· ο λόγος μεταξύ των δύο είναι η πραγματική στρατηγική σου.
Η οπτική της παλιάς ομάδας μετοχών εξακολουθεί να ισχύει: μια εντολή maker είναι ένα δωρεάν δικαίωμα προαίρεσης που έχεις πουλήσει στην αγορά. Κάποιος το ασκεί όταν τον συμφέρει. Το backtest σου εισέπραττε το ασφάλιστρο και αγνοούσε ότι το δικαίωμα είχε και σκέλος πληρωμής.
Οι συναλλαγές που δεν έκανες αλλάζουν τη στρατηγική, όχι μόνο το κόστος
Αυτό είναι το σημείο στο οποίο θέλω περισσότερο να σταθείς. Όταν μοντελοποιείς άσχημα την εκτέλεση taker, παίρνεις τις σωστές συναλλαγές σε λάθος τιμή και μια διόρθωση στις προμήθειες διορθώνει το μεγαλύτερο μέρος του προβλήματος. Όταν μοντελοποιείς άσχημα την εκτέλεση maker, παίρνεις εντελώς λάθος σύνολο συναλλαγών. Περίπου 2,900 από τις 4,180 εισόδους σου δεν έγιναν ποτέ. Μερικές από αυτές ήταν τα καλύτερά σου σήματα, σε κεριά που εκτινάχθηκαν και μετά γύρισαν, ακριβώς δηλαδή στις περιπτώσεις όπου η αγορά έφυγε χωρίς εσένα.
Άρα ο κλάδος της στρατηγικής σου για τις μη εκτελεσμένες εντολές χρειάζεται πραγματική λογική. Τι κάνει η στρατηγική όταν η είσοδος δεν εκτελεστεί μέχρι να παλιώσει το σήμα; Κυνηγά την τιμή με εντολή taker και πληρώνει το spread συν την επίπτωση στην τιμή; Τοποθετεί ξανά την εντολή χαμηλότερα και αποδέχεται διαφορετική βάση εισόδου; Παραλείπει τη συναλλαγή και μένει εκτός αγοράς; Κάθε επιλογή παράγει ουσιαστικά διαφορετική καμπύλη κεφαλαίου, και καμία δεν είναι «υπόθεσε ότι εκτελέστηκες». Στις δοκιμές μας, η προσθήκη ενός ρεαλιστικού κανόνα καταδίωξης της τιμής (περνάς το spread μετά από 20 δευτερόλεπτα χωρίς εκτέλεση, με ανώτατο όριο ολίσθησης 3 bp) ανέκτησε περίπου το ένα τρίτο των χαμένων συναλλαγών και σχεδόν το μισό της διαφοράς μεταξύ του αφελούς Sharpe και του Sharpe της προσομοίωσης ουράς. Πρόκειται για πραγματικά ενδιαφέρον αποτέλεσμα, που εμφανίζεται μόνο όταν το μοντέλο εκτέλεσης είναι αρκετά ρεαλιστικό ώστε να έχει νόημα το ερώτημα.
Ένας γρήγορος έλεγχος λογικής, δέκα λεπτά: πάρε το ημερολόγιο των paper trades σου και το backtest σου για το ίδιο χρονικό διάστημα. Σύγκρινε το ποσοστό εκτέλεσης, όχι το PnL. Αν το backtest εκτελεί το 100% των εντολών που περιμένουν στο βιβλίο, ενώ το paper trading το 34%, δεν συγκρίνεις στρατηγικές· έχεις bug στο μοντέλο εκτέλεσης. Διόρθωσέ το πριν κοιτάξεις έστω και έναν αριθμό απόδοσης.
Δύο μικρότερα θέματα, τώρα που σε έχω
Απορρίψεις post-only. Αν χρησιμοποιείς post-only για να εξασφαλίσεις την κλίμακα προμηθειών maker και το βιβλίο εντολών μετακινηθεί από τη στιγμή που παίρνεις την απόφαση μέχρι την επιβεβαίωση του ανταλλακτηρίου, η εντολή απορρίπτεται αντί να παραμείνει στο βιβλίο. Στα δικά μας paper logs αυτό συμβαίνει στο 3-6% των προσπαθειών στο BTCUSDT σε κανονικές ώρες και σε πάνω από 15% στο λεπτό μετά από ανακοίνωση του ΔΤΚ των ΗΠΑ. Μια απορριφθείσα εντολή δεν είναι εκτελεσμένη εντολή ούτε μη εκτελεσμένη εντολή που περιμένει στο βιβλίο· είναι συναλλαγή που δεν υπήρξε ποτέ. Αν το backtest σου δεν προβλέπει αυτή την κατάσταση, ο αριθμός συναλλαγών σου είναι διογκωμένος ακριβώς στις συνθήκες που σε ενδιαφέρουν περισσότερο.
Αποτροπή αυτοσυναλλαγών και το δικό σου αποτύπωμα στην αγορά. Με 0.4 BTC δεν μετακινείς το BTCUSDT, οπότε άφησέ το. Όμως ανέφερες ότι θέλεις να το τρέξεις σε perp altcoin μεσαίας κεφαλαιοποίησης, όπου η ονομαστική αξία στο καλύτερο επίπεδο τιμών συχνά είναι κάτω από $15k. Εκεί, η εντολή σου είναι σημαντικό μερίδιο της ουράς, και το μέγεθος της ουράς μπροστά σου που αποθηκεύεις ως στιγμιότυπο περιλαμβάνει την επίδραση της προηγούμενης εντολής σου. Μόλις το μέγεθός σου ξεπεράσει περίπου το 10% του όγκου που περιμένει στο επίπεδο, η προσομοίωση πρέπει να συνυπολογίζει ότι οι άλλοι συμμετέχοντες αντιδρούν στην παρουσία σου. Και, για να είμαι ειλικρινής, από εκείνο το σημείο θα εμπιστευόμουν περισσότερο το paper trading από οποιαδήποτε προσομοίωση μπορούμε να γράψουμε εσύ ή εγώ.
Τρέξ’ το ξανά με την προσομοίωση ουράς και στείλε μου τον πίνακα απόκλισης τιμής χωρισμένο ανά τύπο εκτέλεσης. Αν η κατηγορία της ανάκαμψης εξακολουθεί να έχει το μεγαλύτερο μέρος του edge και η κατηγορία της διάσπασης δεν το εξανεμίζει όλο, ίσως έχεις κάτι που αξίζει να δοκιμάσεις σε paper trading. Αν όλο το αποτέλεσμα προερχόταν από τις 2,900 εκτελέσεις που δεν θα είχες ποτέ, καλύτερα να το μάθεις τώρα παρά αφού περάσεις τέσσερις εβδομάδες βλέποντας έναν paper λογαριασμό να μη συμπεριφέρεται όπως υποσχόταν το notebook.
← Όλα τα άρθρα


