Μια χρήσιμη δοκιμή backtest δεν έχει να κάνει με την εύρεση καλύτερης παραμέτρου: σταματήστε τη διεργασία στη μέση, επαναφέρετέ την και ολοκληρώστε την ίδια αναπαραγωγή. Με πανομοιότυπες εισόδους και ελεγχόμενο προσομοιωτή εκτέλεσης, οι αποφάσεις, οι εντολές και τα ίδια κεφάλαια θα πρέπει να συμφωνούν με μια εκτέλεση χωρίς διακοπή.
Αν δεν συμφωνούν, εντοπίσατε πρόβλημα διαχείρισης κατάστασης. Η στρατηγική εξαρτάται από κάτι που δεν αποθηκεύσατε ή δεν μπορέσατε να ανακατασκευάσετε. Αυτή η εξάρτηση έχει σημασία κάθε φορά που συνεχίζονται ερευνητικές εκτελέσεις, αντικαθίστανται workers ή αναπτύσσεται νέος κώδικας σε υπηρεσία paper trading.
Μου αρέσει αυτή η δοκιμή επειδή η αναμενόμενη απάντηση είναι ασυνήθιστα ξεκάθαρη. Δεν υπάρχει συζήτηση για το αν άλλαξε η αγορά. Και οι δύο εκτελέσεις λαμβάνουν την ίδια αγορά.
Ακολουθούν 3 λανθασμένοι τρόποι επανεκκίνησης. Οι αριθμοί είναι ενδεικτικοί· κάθε αστοχία μπορεί να συμβεί σε ένα κατά τα άλλα ντετερμινιστικό σύστημα.
1. Φορτώνετε λίγες μπάρες και θεωρείτε ότι οι δείκτες έχουν προθερμανθεί
Ας υποθέσουμε ότι μια στρατηγική χρησιμοποιεί εκθετικό κινητό μέσο 100 περιόδων. Η ενημέρωσή του είναι:
alpha = 2 / 101
ema_next = alpha * close + (1 - alpha) * ema_previous
Η διεργασία που εκτελείται αδιάλειπτα μεταφέρει την υπολογισμένη EMA. Η διεργασία μετά την επανεκκίνηση ανακτά 100 μπάρες, αρχικοποιεί την EMA με την τιμή κλεισίματος της πρώτης και υποθέτει ότι ένας δείκτης 100 περιόδων χρειάζεται 100 παρατηρήσεις.
Αυτή η υπόθεση συγχέει την παράμετρο εξομάλυνσης του δείκτη με ένα παράθυρο πεπερασμένης μνήμης. Η EMA διατηρεί μια φθίνουσα συνεισφορά από την αρχική της κατάσταση. Αν δύο εκδοχές ξεκινούν με διαφορά EMA 10 μονάδων τιμής, οι ίδιες επόμενες τιμές τη μειώνουν ως εξής:
| Ενημερώσεις από την αρχικοποίηση | Υπόλοιπη διαφορά | Κλάσμα αρχικού σφάλματος |
|---|---|---|
| 100 | 1.353 | 13.53% |
| 250 | 0.0674 | 0.674% |
| 500 | 0.000454 | 0.00454% |
Ο υπολογισμός είναι 10 * (99 / 101)^k. Αν ανακτήσετε 100 μπάρες, έχετε μόνο 99 ενημερώσεις, αν η πρώτη παρατήρηση χρησιμοποιηθεί ως αρχική τιμή.
Η ζημιά συνήθως εμφανίζεται κοντά σε ένα όριο απόφασης. Στη μία εκτέλεση η τιμή είναι πάνω από την EMA· στην άλλη, κάτω. Μια μικρή αριθμητική διαφορά δημιουργεί μια επιπλέον συναλλαγή. Μετά από αυτό, μπορεί να αποκλίνουν και οι περίοδοι αναμονής, τα διαθέσιμα μετρητά και οι επόμενες αποφάσεις.
Αποθηκεύστε την αναδρομική κατάσταση του δείκτη, την κατάσταση αρχικοποίησής του και το τελευταίο συμβάν που επεξεργάστηκε. Εναλλακτικά, ξεκινήστε ξανά την αναπαραγωγή από μια γνωστή αρχική κατάσταση. Ένα μεγαλύτερο warm-up μπορεί να δώσει αποδεκτή προσέγγιση, αλλά επιλέξτε τη διάρκειά του βάσει ρητού ορίου σφάλματος και ελέγξτε αν αυτό το όριο μπορεί να αλλάξει αποφάσεις. Το «5 φορές η περίοδος» είναι σύμβαση, όχι απόδειξη.
Και οι δείκτες δεν είναι όλο το ιστορικό. Ένα κυλιόμενο εκατοστημόριο χρειάζεται το παράθυρό του. Ένα online μοντέλο μπορεί να χρειάζεται την κατάσταση του optimizer. Ένας κανόνας που περιμένει 3 μπάρες μετά από ζημία πρέπει να θυμάται τη ζημία και τον μετρητή.
2. Αποθηκεύετε τις θέσεις και ξεχνάτε τις εντολές που εκκρεμούν
Η θέση-στόχος σας είναι 10 μονάδες. Μια εντολή αγοράς για 10 έχει εκτελεστεί κατά 4, αφήνοντας 6 σε εκκρεμότητα. Αποθηκεύετε σε checkpoint τη θέση ως 4, κάνετε επανεκκίνηση και υποβάλλετε νέα εντολή αγοράς για τις 6 που λείπουν.
Αν εκτελεστούν τόσο το αρχικό υπόλοιπο όσο και η νέα εντολή, θα έχετε 16 μονάδες.
Στο backtest, αυτό το σφάλμα συχνά μένει κρυφό, επειδή η επανεκκίνηση της μηχανής εκτέλεσης διαγράφει σιωπηρά τις ενεργές εντολές. Στο paper trading, ο προσομοιωτής ή η εξωτερική υπηρεσία μπορεί να τις διατηρήσει. Τότε, ο ίδιος κώδικας ανάκτησης δημιουργεί διαφορετική έκθεση, ανάλογα με το ποιο στοιχείο επέζησε.
| Κατά την επανεκκίνηση | Πραγματική κατάσταση | Τι βλέπει η ανάκτηση μόνο βάσει θέσης |
|---|---|---|
| Θέση-στόχος | 10 | 10 |
| Εκτελεσμένη θέση | 4 | 4 |
| Ποσότητα αγοράς σε εκκρεμότητα | 6 | 0 |
| Πρόσθετη απαιτούμενη ποσότητα | 0 | 6 |
Η ζημιά εκδηλώνεται ως ανεξήγητη έξαρση εντολών αμέσως μετά την ανάκτηση. Μερικές φορές διπλασιάζεται η έκθεση. Άλλες φορές κλείνει μια θέση ενώ η προστατευτική εντολή παραμένει ενεργή, με αποτέλεσμα να μπορεί αργότερα να ανοίξει νέα θέση.
Ένα checkpoint χρειάζεται ταυτότητα εντολής και κατάσταση κύκλου ζωής, μαζί με τις θέσεις. Πριν δημιουργήσει νέες ενέργειες, η ανάκτηση πρέπει να αντιπαραβάλει αυτά τα αρχεία με το σύστημα εκτέλεσης. Μια εντολή με άγνωστη έκβαση χρειάζεται διερεύνηση· αν θεωρήσετε ότι «δεν αποθηκεύτηκε επιβεβαίωση» σημαίνει «δεν υποβλήθηκε ποτέ», έτσι δημιουργούνται διπλές εντολές.
Τα σταθερά αναγνωριστικά εντολών πελάτη σάς βοηθούν να εντοπίσετε τι συνέβη. Αποτρέπουν τα διπλότυπα μόνο όταν το σύστημα που τις λαμβάνει επιβάλλει πράγματι τους απαιτούμενους κανόνες μοναδικότητας ή idempotency. Διατηρήστε επίσης τα αναγνωριστικά εκτελέσεων που έχετε ήδη επεξεργαστεί, ώστε μια επαναληπτική εκτέλεση να μην αυξήσει τη θέση δύο φορές.
Έχω αδυναμία στην ταπεινή οθόνη κατάστασης εντολών. Την ημέρα της επανεκκίνησης, οι μικρές γραμμές της γίνονται ξαφνικά το πιο ενδιαφέρον περιβάλλον εργασίας σε όλο το κτίριο.
3. Επαναφέρετε τη θέση και ξεκινάτε νέο καθολικό P&L
Ας δούμε ένα παράδειγμα spot χωρίς μόχλευση και χωρίς προμήθειες. Ξεκινήστε με μετρητά $10,000, αγοράστε 10 μονάδες στα $100 και αποθηκεύστε checkpoint όταν η τιμή αποτίμησης φτάσει τα $110.
Η σωστή κατάσταση είναι $9,000 σε μετρητά συν θέση αξίας $1,100: ίδια κεφάλαια $10,100. Αν η ανάκτηση επαναφέρει τις 10 μονάδες αλλά μηδενίσει τα μετρητά στην αρχική τιμή των $10,000, εμφανίζει $11,100. Δημιουργήσατε $1,000 με την επανεκκίνηση μιας διεργασίας.
Άλλες εκδοχές του προβλήματος είναι λιγότερο εντυπωσιακές. Η ανάκτηση διατηρεί τα ίδια κεφάλαια, αλλά μηδενίζει την τιμή εισόδου στα $110. Τα συνολικά ίδια κεφάλαια μπορεί να παραμένουν σωστά, ενώ αλλάζει ο επιμερισμός μεταξύ πραγματοποιημένων και μη πραγματοποιημένων κερδών ή ζημιών. Αν μια εντολή stop ή μια συνθήκη εξόδου αναφέρεται στην τιμή εισόδου, αυτή η λογιστική συντόμευση αλλάζει πλέον τη συμπεριφορά των συναλλαγών.
Ή το σύστημα ξεχνά το προηγούμενο υψηλό των ιδίων κεφαλαίων. Ας υποθέσουμε ότι τα ίδια κεφάλαια κορυφώθηκαν στα $10,600 πριν πέσουν στα $10,100. Η υποχώρησή τους είναι περίπου 4.72%. Αν κατά την ανάκτηση μηδενιστεί το υψηλότερο σημείο, η στρατηγική ξαφνικά θεωρεί ότι η υποχώρηση είναι μηδενική. Κάθε έλεγχος κινδύνου που βασίζεται στην υποχώρηση μόλις μηδενίστηκε χωρίς έγκριση.
Η ζημιά μπορεί λοιπόν να είναι ασυνέχεια στα ίδια κεφάλαια, ύποπτα μικρότερη υποχώρηση ή κανόνας κινδύνου που σταματά να ενεργοποιείται μετά από αναπτύξεις. Διατηρήστε το καθολικό και την κατάσταση της στρατηγικής που εξαρτάται από τη λογιστική: κινήσεις μετρητών, θέσεις, σχετική τιμή κτήσης, δεδουλευμένες χρεώσεις και μνήμη ελέγχου κινδύνου. Αντιπαραβάλετε τα ίδια κεφάλαια μετά την ανάκτηση με το καθολικό, στην ίδια χρονική στιγμή αποτίμησης.
Ένα checkpoint χρειάζεται συνεπές όριο. Αν αποθηκεύσετε τα μετρητά μετά από μια εκτέλεση, αλλά την ποσότητα θέσης πριν από αυτήν, θα προκύψει μια κατάσταση που δεν υπήρξε ποτέ. Καταγράψτε μαζί τις σχετικές καταστάσεις ή αποθηκεύστε μια ανθεκτική ακολουθία συμβάντων από την οποία μπορούν να ανακατασκευαστούν. Αποθηκεύστε μαζί και τον δείκτη συμβάντων, ώστε κατά την ανάκτηση να μην παραλειφθεί ούτε να εφαρμοστεί δύο φορές η εκτέλεση.
Στο ερευνητικό περιβάλλον δοκιμών θα διατηρούσα μια δοκιμή που εκτελεί πρώτα μία αναφορά αναπαραγωγής χωρίς διακοπή και μετά επανεκκινεί μια δεύτερη εκτέλεση σε επίτηδες δύσκολα σημεία: κατά την αρχικοποίηση δείκτη, μετά από μερική εκτέλεση και όσο ισχύει ένα όριο κινδύνου. Χρησιμοποιήστε την ίδια σειρά συμβάντων και διατηρήστε τυχόν τυχαία κατάσταση του προσομοιωτή. Συγκρίνετε την πρώτη απόφαση μετά την ανάκτηση, τα αρχεία εντολών και εκτελέσεων, καθώς και την πορεία των ιδίων κεφαλαίων. Ένα ίδιο τελικό υπόλοιπο μπορεί να κρύψει σφάλματα που αλληλοαναιρούνται.
Για κατάρρευση μετά την υποβολή αλλά πριν από την επιβεβαίωση, το περιβάλλον δοκιμών πρέπει επίσης να διατηρεί ανεξάρτητα την κατάσταση της υπηρεσίας εκτέλεσης από τη διεργασία της στρατηγικής. Διαφορετικά, διαγράφει ακριβώς την αβεβαιότητα που προσπαθείτε να ελέγξετε.
Οι προδιαγραφές μιας στρατηγικής περιλαμβάνουν όσα θυμάται. Κάντε αυτή τη μνήμη αρκετά σαφή, ώστε να μπορείτε να σταματήσετε τη διεργασία στη μέση μιας αναπαραγωγής και να δείξετε ακριβώς πώς συνεχίζει τη δουλειά της.
← Όλα τα άρθρα


