Giovedì 2 aprile, 16:02 Eastern. Il book in paper aveva l'aspetto che avevamo progettato: long di circa $240,000 del perpetual BTCUSDT, short un paniere ponderato per beta di COIN, MSTR, MARA e RIOT, residuale sotto i $500. Il job di hedge del venerdì era partito alle 15:45 la settimana prima. Il funding alle 16:00 UTC era stato un errore di arrotondamento. Ho staccato pensando che finalmente avessimo una sleeve crypto che non si limitava a ricreare il beta Nasdaq.
Il venerdì era Venerdì Santo. Me ne sono accorto solo perché la chat crypto continuava a postare screenshot di liquidazioni e la chat equity era diventata silenziosa in quel modo specifico che significa che nessuno è alla postazione. NYSE e Nasdaq erano chiusi. Binance no. Dalla chiusura cash del giovedì fino alle 16:00 Eastern del venerdì il perp era in calo del 4.8%. Gli short azionari quel giorno non esistevano come mercato. Erano una riga di prezzi del giovedì in un pannello di rischio.
Il bot di rischio ha postato comunque.
beta sul paniere di hedge: 0.04. residuale 1d: −$11,184. status: NEUTRAL
Ho ancora quello screenshot. Un collega l'ha stampato e attaccato sul frigo nell'ufficio che usiamo a malapena. Il NEUTRAL verde stava facendo un sacco di lavoro. Il bot calcolava il beta dagli ultimi print azionari che aveva, cioè l'asta di chiusura del giovedì, contro un mark BTC che si muoveva da ventiquattro ore. Un mark congelato è una fotografia del giovedì. Chiamare quella fotografia un hedge è il modo in cui ti infili nel weekend di Pasqua con una posizione crypto nuda e un report che ti fa i complimenti per questo.
Lunedì il mercato cash ha aperto. Il paniere ha aperto in gap al ribasso, ma non del 4.8%, e non tutti insieme. COIN ha aperto a −2.1%. MSTR ha fatto di più. MARA ha fatto di meno. Abbiamo passato la mattina a operare su un book che aveva vissuto un'intera sessione extra che non potevamo coprire, poi abbiamo tirato fuori il backtest che aveva benedetto questo design e gli abbiamo fatto una domanda scortese. Cosa hai fatto lo scorso Venerdì Santo, e quello prima, e ogni feriale in cui il mercato azionario stava fermo mentre BTC negoziava durante la festività?
L'agente di ricerca che aveva scritto il codice della prima versione aveva ricampionato tutto su barre da 15 minuti e fatto il forward-fill. Pandas freq='B' era nel notebook, il che sembra una scelta da adulti finché non ti ricordi cosa fa davvero. 'B' significa da lunedì a venerdì. Il Venerdì Santo è un venerdì. Juneteenth 2026 cadeva di venerdì. L'osservanza dell'Independence Day cadeva di venerdì. La funzione calendario non aveva un calendario. Aveva un filtro sui giorni della settimana.
Il job di hedge gira i venerdì alle 15:45 Eastern, un orario ragionevole per operare verso la chiusura cash in una settimana normale. Il Venerdì Santo è sempre un venerdì. Nella finestra 2023–2026 quel job si è allineato con quattro Venerdì Santi, il Juneteenth, la chiusura completa del 3 luglio e quattro sessioni del giorno dopo Thanksgiving che avevano già suonato la campana all'1:00 PM. Dieci sessioni del venerdì. In ognuna di esse il simulatore aveva accettato ordini azionari. I fill erano la chiusura del giovedì, o l'ultimo print regolare del venerdì portato avanti, travestiti da trade live nel blotter. I mark crypto giravano live. La serie del residuale si prendeva il merito di mosse di hedge a cui una gamba non aveva mai avuto modo di rispondere.
I weekend erano lo stesso bug su un orario di cui almeno scherzavamo a birre. Le festività erano la versione su cui nessuno scherzava, perché il notebook diceva giorni lavorativi e il Venerdì Santo continua a sembrare, visceralmente, un giorno in cui il sistema finanziario da adulti è al lavoro. Le banche sono aperte. Fedwire è attivo. Un'API di un broker può sembrare sveglia e non avere comunque dove mandare un ordine su COIN.
Le chiusure anticipate erano più silenziose e, nel blotter, più sgarbate. Il 28 novembre 2025, il giorno dopo Thanksgiving, il NYSE ha chiuso all'1:00 PM. Il nostro job si è svegliato comunque alle 15:45, ha guardato una serie a 15 minuti che trascinava l'ultimo print delle 12:59 da quasi tre ore, e ha «negoziato la chiusura». Il modello di fill ci ha persino addebitato lo slippage dell'asta di chiusura. Non c'era nessuna asta alle 16:00. L'asta era avvenuta alle 13:00, senza di noi. Il paper, quel pomeriggio, ha avuto il fallimento più onesto: nuovi ordini rifiutati, ordini working cancellati nella chiusura anticipata, un fill rate pari a zero.
| Sessione | Mercato cash | Fill del backtest | Paper |
|---|---|---|---|
| Venerdì Santo 2026 | Chiuso tutto il giorno | Paniere eseguito alla chiusura del giovedì | Rifiuti; mark stantii dal giovedì |
| Juneteenth 2026 | Chiuso tutto il giorno | Stesso job del venerdì, stessi fill fantasma | Scoperto dopo, nel replay |
| 3 luglio 2026 | Chiuso (4 luglio osservato) | Venerdì 15:45 contro un print del giovedì | Nessuna sessione cash a cui unirsi |
| 28 nov 2025 | chiusura all'1:00 PM | ribilanciamento 15:45, ultimo print 12:59, slippage d'asta | Rifiuti dopo le 13:00 |
| Sabato ordinario | Chiuso | Barre azionarie in forward-fill, perp live | Nomi congelati, perp live |
Abbiamo rilanciato il book con un file di sessione per venue: orari regolari, festività, chiusure anticipate, la chiusura 16:00 vs 13:00, e un contatore di ore stantie su ogni mark. Gli ordini verso una sessione cash chiusa non fanno fill all'ultimo. Vengono rifiutati. Il pannello di rischio non può stampare NEUTRAL se una qualsiasi gamba di hedge è stantia da più di poche ore. Il test unitario è brutto e mi piace: prendi un venerdì normale, dipingilo chiuso, asserisci zero fill su COIN e un flag stantio sul paniere. E poi dipingi le 13:00 come chiusura e asserisci che il job delle 15:45 non dia neppure un'occhiata al modello d'asta.
Lo Sharpe del residuale è passato da 1.14 a 0.61. Non tratto nessuno dei due numeri come un motivo per operare. Tratto il gap come una confessione. Gran parte di quello che chiamavamo residuale di hedge era volatilità crypto da festività, raccolta nei giorni in cui la gamba short azionaria era un souvenir della sessione precedente. Anche i weekend facevano una parte di quel lavoro, cosa che già scontavamo a voce. Le festività si nascondevano nel ricampionamento sui giorni lavorativi, che è un nascondiglio assai più imbarazzante.
Facciamo ancora girare il job del venerdì alle 15:45. Ora legge un file con dodici righe per il 2026, due delle quali non sono ancora arrivate. Thanksgiving è il 26. Il giorno dopo, il mercato cash muore alle 13:00. Ho messo quella chiusura all'1:00 PM nel calendario due volte, sotto due nomi diversi, perché a novembre non mi fido di me stesso, e perché pandas continuerà allegramente a chiamare quel venerdì un giorno lavorativo se glielo lascio fare.
← Tutti gli articoli


