3 Νοέμβριος 2026 · εκτέλεση

Κάναμε paper trading ένα basis trade. Γέμισε το ένα σκέλος.

Κάναμε paper trading ένα basis trade. Γέμισε το ένα σκέλος.

Η συνάρτηση ονομαζόταν enter_pack. Αυτό έπρεπε να είναι η προειδοποίηση. Ένας research agent είχε γράψει ένα BTC cash-and-carry: όταν το perpetual διαπραγματευόταν περισσότερο από οκτώ μονάδες βάσης πάνω από το spot, αγόραζε spot, σόρταρε το perp, καθόταν ακίνητος. Το funding και το basis θα έκαναν την υπόλοιπη δουλειά. Το backtest γέμιζε και τα δύο σκέλη στο ίδιο millisecond, στο mid, συν ένα tick ευγένειας. Η καμπύλη equity ήταν μια σκάλα. Κανείς δεν θα την έλεγε συναρπαστική. Αυτό ήταν το ατού.

Το προωθήσαμε σε paper μια Δευτέρα.

Δευτέρα: το πακέτο που γέμιζε πάντα

Το πρώτο σήμα έπεσε στις 11:17 UTC. Το basis στην οθόνη ήταν 9.4 bps, το perp ακριβό. Στο backtest, η enter_pack επέστρεψε δύο fills και υπόλοιπο μηδέν. Στο paper επέστρεψε ένα fill spot 0.40 BTC στο ask, και ένα resting short στο perp που δεν εκτελέστηκε.

Το spot είχε πληρώσει προμήθεια taker 4 bp και περίπου 1 bp spread. Η τιμή του perp που θέλαμε ήταν ακόμα στο βιβλίο, μετά δεν ήταν. Είκοσι δευτερόλεπτα αργότερα το quoted basis ήταν 5 bps, γιατί μόλις είχαμε κάνει lift στο spot. Σαράντα δευτερόλεπτα αργότερα γέμισε το perp, μετά την κίνηση. Είχαμε πακεταριστεί. Είχαμε πακεταριστεί σε ένα basis που δεν πλήρωνε πια την είσοδο και την έξοδο.

Το backtest θα είχε καταγράψει «+9.4 bps carry, υπόλοιπο 0.» Το blotter είχε 4 bps κόστος taker στο spot, ένα ακάλυπτο long 40 δευτερολέπτων, και ένα κενό εισόδου περίπου 5. Είχα δείγμα ενός και, παρόλα αυτά, υπερβολική εμπιστοσύνη στη σκάλα.

Τρίτη: ανοίξαμε τη συνάρτηση

enter_pack έπαιρνε μια λίστα σκελών και ένα στόχο mid. Έκανε loop, γέμιζε κάθε σκέλος στο mid * (1 ± slip), και έγραφε μία γραμμή χαρτοφυλακίου. Δεν υπήρχε δεύτερο timestamp. Δεν υπήρχε κλάδος στον οποίο το σκέλος δύο δεν υπήρχε. Το unit test έκανε assert residual == 0.

Αυτό είναι ένα τεστ που σε κάνει να νιώθεις ενήλικας. Δεν θα αποτύχει ποτέ.

Σπάσαμε το πακέτο σε δύο εντολές με δική τους κατάσταση: submitted, partial, filled, canceled. Το ατελές έγινε αντικείμενο πρώτης κατηγορίας. Το ιστορικό replay ακόμα δεν είχε πραγματικό βιβλίο, οπότε κλέψαμε. Καθυστερήσαμε το δεύτερο fill κατά μία τυχαία τιμή από την αναμονή της Δευτέρας (μέσος 26 δευτερόλεπτα, μια ουρά που δεν μου άρεσε), και μετατοπίσαμε την τιμή του κατά ό,τι έκανε το spot σε εκείνο το παράθυρο. Χοντροκομμένο, αλλά η σκάλα έβγαλε εγκοπές πριν το μεσημεριανό: πακέτα που έμπαιναν στα 3 bps, πακέτα που δεν έγιναν ποτέ πακέτα.

Τετάρτη: τρία δευτερόλεπτα, μετά πέταξέ το

Αν το δεύτερο σκέλος δεν είναι μέσα σε τρία δευτερόλεπτα, flatten το πρώτο. Έπρεπε να ξεκινήσουμε από εκεί. Ακούγεται συντηρητικό μέχρι να κοστολογήσεις το abort. Flatten σημαίνει ότι πέρασες το spread του spot για να μπεις και το περνάς για να βγεις. Δύο προμήθειες taker, δύο spread, χωρίς carry, χωρίς funding. Στο ξαναγραμμένο replay εκείνα τα abort δεν ήταν σπάνια. Στοιβάζονταν στις μπάρες όπου το basis έμοιαζε πιο «πραγματικό», που συνήθως είναι οι μπάρες όπου κάτι ήδη ρέει μέσα από το spot.

Μέχρι το βράδυ της Τετάρτης είχαμε δεκαεπτά paper σήματα να αντιπαρατεθούμε.

17paper σήματα σε τέσσερις ημέρες
7πακέτα με και τα δύο σκέλη γεμάτα
18 bpsμετέπειτα κίνηση εναντίον υπόλοιπου long
Backtest, Δευτέρα πρωίPaper, μέχρι την Τετάρτη
ΕίσοδοςΚαι τα δύο σκέλη στο mid, ένα timestampSpot στο ask· perp 5–40s αργότερα, ή ποτέ
ΥπόλοιποΠάντα 0Ακάλυπτο σε 10 από 17 σήματα
Προμήθειες σε ενεργή συναλλαγήΔύο takerΔύο taker, ή τέσσερις αν κάνουμε abort
Οδηγός PnLBasis + fundingΌ,τι έκανε το spot όσο περιμέναμε
Ένα πακέτο είναι ολοκληρωμένο όταν έχουν γεμίσει και οι δύο εντολές, αλλιώς είναι μια κατευθυντική θέση για την οποία δεν έκανες sizing. Μάρκαρε το υπόλοιπο στο live βιβλίο όλη την ώρα που υπάρχει. Αν δεν μπορείς να το μαρκάρεις, δεν μπορείς να τρέξεις τη στρατηγική.

Ένας συνάδελφος έχει ακόμα ένα notebook που αντιμετωπίζει το πακέτο ως εισηγμένο προϊόν, BTC_CARRY, με σταθερό «φόρο εκτέλεσης» 2 bp. Μου άρεσε εκείνο το notebook. Παρήγαγε την ίδια σκάλα που παρήγαγε ο agent. Ένας φόρος είναι ένας μέσος. Τα ορφανά είναι μια κατανομή. Οι μέσοι δεν πατιούνται σε μια λεπτή ώρα· 0.40 BTC υπόλοιπου spot μπορεί.

Πέμπτη: υπόλοιπο, μετά καφές

Τα τρία δευτερόλεπτα ακύρωναν σχεδόν τα πάντα μόλις περιμέναμε και σε ουρά. Χαλαρώσαμε το paper στα δεκαπέντε. Στις 02:11 UTC την Πέμπτη, το spot γέμισε και το perp όχι. Ήμουν ακόμα στη φάση πένθους «θα μείνει, θα σηκωθεί» όταν πήγα να φτιάξω καφέ.

02:11:08 εκτελέστηκε BTCUSDT 0.40 αγορά
02:11:08 υποβλήθηκε BTCUSDT-PERP 0.40 πώληση, post-only
02:11:41 ακόμα σε εκκρεμότητα
02:26:00 σήμανση υπολοίπου −18.1 bps

Το BTC υποχώρησε 18 bps σε ένα ήσυχο παράθυρο. Το υπόλοιπο ήταν ολόκληρη η συναλλαγή. Το funding, όταν τυπώθηκε, πίστωσε ένα perp που δεν είχαμε. Το spot απλώς καθόταν εκεί ως long. Το overnight μονοπάτι του αρχικού backtest δεν περιείχε ποτέ μονόσκελη θέση, οπότε δεν είχε ποτέ θέσει την ερώτηση που θέτουμε σε κάθε άλλο βιβλίο: ποια είναι η χειρότερη μπάρα που μπορεί να τυπώσει αυτό το υπόλοιπο, και πού είναι το stop για μια θέση που δεν σκοπεύαμε να κρατήσουμε;

Ούτε τα επτά πλήρη πακέτα ήταν ήρωες. Μέχρι να τυπωθεί το δεύτερο σκέλος, το δικό μας lift στο spot είχε ήδη πιέσει τον δείκτη, και το basis εισόδου ήταν 3–5 bps χειρότερο από το snapshot που είχε πυροδοτήσει το σήμα. Το κατώφλι των οκτώ bps ήταν ένας αριθμός για μια οθόνη.

Τι θα παραλείπαμε την επόμενη φορά

Δεν θα στέλναμε στην παραγωγή ένα multi-leg ως μία συνάρτηση fill. Ίδιος κανόνας για ένα carry perp-spot, ένα calendar, ή το call vertical που ένας agent υποβάλλει ως δύο limit και μετά πανηγυρίζει όταν και τα δύο «γεμίζουν» στο mid.

  1. Κατάσταση εντολής ανά σκέλος, συμπεριλαμβανομένων των partial. Αντιμετώπισε το πακέτο ως γονέα δύο tickets.
  2. Ένα max-orphan timer που όντως πυροδοτείται, και ένα μονοπάτι flatten που πληρώνει δύο spread στην έξοδο.
  3. Mark-to-book στο υπόλοιπο, με stop διαστασιολογημένο για το υπόλοιπο. Το packed net είναι το λάθος ονομαστικό.
  4. Χωρίς πίστωση carry, χωρίς συσσώρευση funding, μέχρι να είναι και τα δύο σκέλη μέσα. Το ατελές είναι ατελές.
  5. Απέρριψε το mid-on-mid ως προεπιλογή για οτιδήποτε έχει δύο tickets. Αν πρέπει να μαντέψεις, μάντεψε χειρότερα στο λεπτό σκέλος και αργότερα στο δεύτερο fill.

Και δεν θα αφήναμε την test_pack_is_atomic να μπει στο repo. Το atomic είναι ιδιότητα μιας matching engine, όχι μιας βοηθητικής συνάρτησης. Το BTC spot και το BTC perpetual είναι δύο βιβλία που καμιά φορά ομοιοκαταληκτούν. Το paper είναι εκεί που σταματούν να ομοιοκαταληκτούν, κι αυτός είναι ο μόνος λόγος που η σκάλα ήταν ποτέ ενδιαφέρουσα.

backtestingcash-and-carryεκτέλεσηpaper tradingcrypto futures
ΚοινοποίησηXLinkedInFacebookRedditHacker NewsWhatsAppTelegramEmail
← Όλα τα άρθρα