Tussentijds verslag over de ontwikkeling van AI en de optimalisering van de prestaties van de code

Verhaaltitelafbeelding

De pokerbot is dood, lang leve de BitSurfer! - Nee serieus, wat is er gebeurd?

De PokerBot en Poker Adviseur waren twee zeer interessante projecten, en ik heb van beide veel geleerd! De PokerAdvisor pikt de kaarten op van het scherm, voert ze automatisch in een AI in en voorspelt de uitkomst van de hand. Terwijl de Pokerbot gepland was om zelf te spelen - alles was voorbereid, maar online poker was vrij veel verboden in Zwitserland.

Dus het was tijd om verder te gaan. Maar wat had de volgende grote uitdaging kunnen zijn?

Bitcoin-prijsgrafiek

Ik stuitte op Coinbase, een crypto-makelaar, waar ik vooral geïnteresseerd was in Bitcoin.

Ze hebben netjes een API waarmee u uw favoriete handelssoftware zoals Metatrader of dergelijke kunt aansluiten. Maar nee.

Het plan is natuurlijk niet om een interface te maken met onze favoriete handelssoftware. Het was eerder mijn idee om mijn eigen interface vanaf nul te bouwen met mijn behoeften in het achterhoofd. Het was ongelooflijk moeilijk en een zeer steile leercurve, maar het was zeker de moeite waard.

De eerste alfaversie is klaar. De interface is erg lelijk, maar de vorm volgt de functie. Mijn idee van goed ontworpen software is niet in de eerste plaats een mooie gebruikersinterface. Ik wil dat mijn software gewoon zijn ding doet. Absoluut. Op de achtergrond. Niets om te installeren, niets om voor het scherm te zitten en de software te vertellen wat hij moet doen. Loop het gewoon door en kijk gefascineerd toe.

De interface bestaat in wezen uit een visualisatie van de marktgegevens en de genormaliseerde invoergegevens voor de AI.

Wat heb ik geleerd? Eerst moest ik verbinding maken met Coinbase. Ik heb veel geleerd over API's en gelukkig was het met de beschikbare pakketten vrij eenvoudig.

Inleiding tot het prestatieaspect van de programmering

Ik heb veel moeten leren over het structureren van data voor AI, en daar was in principe veel kennis over de prestaties van de code mee gemoeid. Tot het punt waarop het volledig krankzinnig wordt. Het ging er vooral om dat ik nog steeds aan mijn 7-jarige machine werkte die ik terug kreeg van mijn opleiding. Het is goed verouderd, maar je kunt de leeftijd echt voelen.... Vanaf mijn eerstvolgende computer kan ik ongeveer 10x de prestatie voor mijn use-cases verwachten! De processor alleen al is ongeveer 400% sneller als hij veel draden verbruikt (wat ik wel doe).

Ik bevond me in de volgende situatie:

Mijn code duurt ongeveer een week om 8 jaar gegevens te verwerken (elk gegevenspunt is 2s ~ 126.000.000 prijspunten). Ondertussen is de volgende generatie processoren en grafische kaarten nog maar een paar maanden verwijderd en veelbelovend.

De hoeveelheid te verwerken gegevens is immens, en zo ben ik in de optimalisatie van de codeprestaties terechtgekomen. Ik had al enige ervaring met multi-threaded workers om meerdere taken tegelijkertijd uit te voeren. Hierdoor had ik al iets minder dan 3,5x de prestaties omdat mijn CPU 4 kernen heeft. Het duurde nu twee dagen om gegevens over 8 jaar te verwerken. Dat was nog te veel. Als ik backtests doe, wil ik de resultaten zien. En ik wil ze snel.

Ik moest meer kijken naar de optimalisatie van de prestaties en ontwikkelde mijn eigen werkers-abstractie op basis van de taak in C#. In principe wordt er een fabricagemethode toegepast die ik tijdens mijn stage bij INA Lahr heb geleerd. Het is alsof je een machine (of werker) hebt met een invoerwachtrij en een uitvoerwachtrij. De wachtrij werkt als een buffer en kan elke cpu-kern helpen om het werk gelijkmatig te verdelen. Het is als een modulaire, schaalbare arbeiderspijplijn waar werknemers items uit een wachtrij of tas kunnen nemen en verwerken.

Dit gaf ook een grote prestatieboost. Ik was nu in staat om alle gegevens in ongeveer een nacht te verwerken, maar ik besloot om het nog verder te repliceren om te zien hoe ver het kon gaan. Ik heb me geabonneerd op een Visual Studio extensie "dotTrace" die goed werkt bij het vinden van knelpunten binnen de code. U kunt een spoor opnemen en dan per functie zien hoe lang het duurt om het uit te voeren. Ik vond een functie die ik helemaal niet verwachtte - de uitgangssnarenbouwer smoorde de hele pijpleiding. U kunt hier meer over lezen in destapeloverloopvraag

Al met al is het proces vrij eenvoudig:

  1. Identificeer de grootste krachtbelasting
  2. Elimineer het
  3. Blijf dit doen tot je een redelijke prestatie hebt geleverd.

In het bovenstaande voorbeeld zou dit het CLR worker proces met ID 10584 zijn. Dit klinkt op dit punt een beetje verwarrend, maar JetBrains heeft rechts de aanroepboom waar we kunnen zien welke functie wordt gebruikt:

Conclusies en afhaalmaaltijden

Ik weet dat er meer macht zou zijn op dit gebied, maar voor nu ben ik vrij blij met het resultaat.

Op dit moment vliegt 2 jaar voorbij in minder dan 4 minuten, en ik heb versnellingen geschakeld om de acties beter in de gaten te houden.

screenshot van backtester

De vermogenslijn en de statistieken worden ook opgeslagen. Het is mogelijk om zoveel accounts en strategieën te simuleren / uit te voeren als u wilt, met slechts een kleine daling van de prestaties.

Ik heb al verschillende strategieën geprobeerd met indicatoren en zo. Zonder veelbelovende resultaten. Ik heb immers een winnende strategie gevonden die geen van deze dingen doet. Het volgt de trend niet en wedt er ook niet tegen. Het probeert niets te voorspellen. Noch de perfecte ingang, noch de perfecte uitgang. Het is vrij eenvoudig, maar ik ga niet in op de details van de strategie. Denk buiten de kaders en misschien vind je wel iets.

vermogenslijn die omhoog gaat

Dat is een jaarlijks rendement van maar liefst 20%. Om eerlijk te zijn, zou ik meer ruimte hebben gemaakt met de buy-and-hold strategie, maar aan de andere kant, ik voorspel niets, we hebben niet deze krankzinnige pieken (en tuimelt).

Dat is iets waar ik op kan bouwen en zien wat mogelijk is en wat niet. Een complete marktsimulatie in de zandbak. Een testomgeving met bijna onbeperkte mogelijkheden.

Dat is het voor vandaag, en ik hoop dat je genoten hebt van de glimp in sommige van mijn lopende projecten.