Relazione intermedia sullo sviluppo dell'IA e sull'ottimizzazione delle prestazioni del codice

Immagine del titolo della storia

Il poker bot è morto, lunga vita al BitSurfer! - No, seriamente, cos'è successo?

Il PokerBot e il Poker Advisor sono stati due progetti molto interessanti, e ho imparato molto da entrambi! PokerAdvisor raccoglie le carte dallo schermo, le inserisce automaticamente in un'IA e prevede l'esito della mano. Mentre il Pokerbot è stato pianificato per giocare da solo - tutto è stato preparato, ma il poker online è stato praticamente vietato in Svizzera.

Quindi era il momento di andare avanti. Ma quale poteva essere la prossima grande sfida?

Grafico dei prezzi Bitcoin

Mi sono imbattuto in Coinbase, un broker di crittografia, dove mi interessava soprattutto Bitcoin.

Hanno ordinatamente un'API attraverso la quale è possibile collegare il vostro software di trading preferito come Metatrader o simili. Ma no.

Il piano, naturalmente, non è quello di interfacciarsi con il nostro software di trading preferito. È stata piuttosto una mia idea quella di costruire la mia interfaccia da zero, pensando alle mie esigenze. È stato incredibilmente difficile e una curva di apprendimento molto ripida, ma ne è valsa certamente la pena.

La prima versione alfa è pronta. L'interfaccia è molto brutta, ma la forma segue la funzione. La mia idea di software ben progettato non è principalmente un'interfaccia utente di fantasia. Piuttosto, voglio che il mio software faccia semplicemente il suo lavoro. Assolutamente sì. Sullo sfondo. Nulla da installare, nulla da posizionare davanti allo schermo e dire al software cosa fare dopo. Basta farla funzionare e guardarla con fascino.

L'interfaccia consiste essenzialmente in una visualizzazione dei dati di mercato e dei dati di input normalizzati per l'IA.

Cosa ho imparato? Per prima cosa, ho dovuto collegarmi a Coinbase. Ho imparato molto sulle API e fortunatamente con i pacchetti disponibili è stato abbastanza facile.

Introduzione all'aspetto prestazionale della programmazione

Ho dovuto imparare molto sulla strutturazione dei dati per l'IA, e questo ha comportato fondamentalmente una grande conoscenza delle prestazioni del codice. Al punto che diventa completamente folle. Si trattava per lo più di me che lavoravo ancora alla mia macchina di 7 anni, che ho ripreso dalla mia formazione. E' invecchiato bene, ma si sente davvero l'età.... Dal mio prossimo imminente computer, posso aspettarmi circa 10 volte le prestazioni per i miei casi d'uso! Il processore da solo è circa il 400% più veloce se consuma molti fili (cosa che io faccio).

Mi sono trovato nella seguente situazione:

Il mio codice richiede circa una settimana per elaborare 8 anni di dati (ogni punto dati è di 2s ~ 126.000.000.000 di punti di prezzo). Nel frattempo, la prossima generazione di processori e schede grafiche è a pochi mesi di distanza e molto promettente.

La quantità di dati da elaborare è immensa, e così sono entrato nel campo dell'ottimizzazione delle prestazioni del codice. Avevo già una certa esperienza con i lavoratori multithreaded per gestire più compiti contemporaneamente. Di conseguenza, ho già avuto un po' meno di 3,5x di prestazioni, dato che la mia CPU ha 4 core. Ci sono voluti due giorni per elaborare 8 anni di dati. Era comunque troppo. Quando faccio i backtest, voglio vedere i risultati. E li voglio in fretta.

Ho dovuto guardare di più all'ottimizzazione delle prestazioni e ho sviluppato la mia astrazione del lavoratore in base al compito in C#. In sostanza, implementa un metodo di fabbricazione che ho imparato durante il mio tirocinio presso l'INA Lahr. È come avere una macchina (o un lavoratore) con una coda di ingresso e una coda di uscita. La coda agisce come un buffer e può aiutare ogni nucleo di cpu a distribuire il lavoro in modo uniforme. È come una pipeline modulare e scalabile per gli operai, dove i lavoratori possono prendere gli articoli da una coda o da una borsa e lavorarli.

Questo ha anche dato un grande impulso alle prestazioni. Ora sono stato in grado di elaborare tutti i dati in circa una notte, ma ho deciso di replicarli ulteriormente solo per vedere fin dove potevano arrivare. Ho sottoscritto un'estensione di Visual Studio "dotTrace" che funziona alla grande nel trovare colli di bottiglia all'interno del codice. È possibile registrare una traccia e quindi vedere funzione per funzione il tempo necessario per l'esecuzione. Ho trovato una caratteristica che non mi aspettavo affatto - il costruttore di stringhe di uscita ha strozzato l'intero gasdotto. Potete saperne di più nella sezionedomanda sullo stack overflow

Tutto sommato, il processo è abbastanza semplice:

  1. Identificare il carico di potenza maggiore
  2. Eliminarlo
  3. Continuate a farlo fino a quando non otterrete una performance ragionevole.

Nell'esempio precedente, si tratterebbe del processo di lavoro CLR con ID 10584. A questo punto sembra un po' confuso, ma JetBrains ha l'albero delle chiamate sulla destra dove possiamo vedere quale funzione viene utilizzata:

Conclusioni e take away

So che ci sarebbe più potenza in questo settore, ma per ora sono abbastanza contento del risultato.

In questo momento, 2 anni volano in meno di 4 minuti, e ho cambiato marcia se le azioni devono essere osservate più da vicino.

screenshot di backtester

Vengono salvate anche la linea di capitale e le statistiche. È possibile simulare / eseguire tutti i conti e le strategie che si desidera, con solo un piccolo calo di prestazioni.

Ho già provato diverse strategie con indicatori e così via. Senza risultati promettenti. Dopotutto, ho trovato una strategia vincente che invece non fa nessuna di queste cose. Non segue la tendenza né scommette contro di essa. Non cerca di prevedere nulla. Né il punto d'ingresso né l'uscita perfetta. È abbastanza semplice, ma non entrerò nei dettagli della strategia. Pensate fuori dagli schemi e potreste trovare qualcosa.

linea azionaria in aumento

E' un enorme ritorno annuale del 20%. Ad essere onesti, avrei fatto più spazio con la strategia del buy-and-hold, ma d'altra parte, non sto predicendo nulla, non abbiamo questi folli picchi (e cadute).

Ora è qualcosa su cui posso costruire e vedere cosa è possibile e cosa non lo è. Una simulazione completa del mercato nella sandbox. Un ambiente di prova con possibilità quasi illimitate.

Questo è tutto per oggi, e spero che abbiate gradito la visione di alcuni dei miei progetti in corso.