•  untoreh-light

Optimeringskaninhål i python

Påskynda backtesting för freqtrade kryptohandelsbot.

Freqtrade Är en kryptohandelsbot i python. Jag brukade leka med en gaffel ett tag, fixa några buggar och något beteende som jag inte gillade. Att lista buggarna här skulle vara tråkigt så jag ska istället prata om saker som jag tycker är intressanta.

Hur freqtrade (FQT) fungerar, på en hög nivå

FQT är inte händelsebaserat, det är loopbaserat. Vad betyder det här? Vi kan prata om utföraren (live operation) eller backtestern. I det här fallet är de båda loopbaserade.

Kort omväg här. Vad föredrar jag? Slingor eller evenemang?

...återgår till FQT, i live-läge, bearbetar den order i en loop. Var X:e sekund frågar den börsen efter uppdateringar. Den håller koll på:

Ruh-roh

Loopbaserad liveexekvering har ett uppenbart problem. Den är synkron. Om du bearbetar till många par kommer exekveringen att vara mindre lyhörd och upprepas mer sällan, vilket släpar efter utvecklingen av prisåtgärder. Så trots att jag föredrar loopar för backtesting så föredrar jag event för live-exekvering.

Nackdelen? Om du använder händelser för det ena och loopar för det andra är det lättare för modeller eller parametrar för strategin att skilja sig åt och inte matcha verkligheten.

Mitt försvarsargument mot detta är att att ständigt köra självutvärdering (backtesting) och liveexekvering undviker detta problem eftersom de kommer så småningom justera.

FQT har många konfigurationsparametrar och många gånger skulle skillnaden mellan boten och strategin bli gråaktig eftersom strategin inte kan styra hur orderna exekveras av boten. Boten hanterar "roi" som är ett rutnät av take-profit prisgränser och "släpande stoploss" på samma sätt men på nedsidan. Strategin ger bara parametrarna och boten gör resten. Jag var inte ett fan av detta.

Återuppringningar för köp- och säljsignaler. Avslut skulle ske baserat på signaler som returneras av återuppringningar som skulle beräkna signalen på en dataram. Problemet med detta är att signalen är statisk; du kan bara dynamiskt beräkna en 1-rads dataram och mata den till boten, men det skulle inte vara backtestbart. Det här är bra om du inte värderar backtesting så mycket, för var och en.

Patchworks

Det jag modifierade i FQT för att försöka få det att bete sig efter min smak.

Det finns ett gäng andra justeringar, som utvärdering av parallella signaler som jag så småningom tog bort när jag fokuserade mer på att bygga snabba signaler, och justeringar för plottning och konfigurationsalternativ, men de är inte anmärkningsvärda.

Jakten på vektoriserad backtest

Jag provade många versioner av backtesting för att påskynda det. Det var allt, inte alls, värt det. Beräkningslogik mellan köp och säljoperation med hjälp av numpy arrays. Det är som att spela tetris med din hjärna. Jag menar där blocken är gjorda av din grå substans, och du försöker sätta ihop dem. Här listar vi dem

Vi har också lagt till några ytterligare funktioner till backtestet, som spridning och likviditet beräkning, och den tidigare nämnda tidsvägda avkastningen.

Jakten på parallell optimering

Varför ville jag ha en snabb backtester? Eftersom jag vill köra många av dem så att jag kan hitta den bästa av de bästa parameterkonfigurationerna...naturligtvis, bortse från alla begrepp som överanpassning, överparametrisering, bristande fokus, etc... Låt oss lista upp vad jag jobbade med:

Slutsatser

Vi startade FQT backtesting till 11 . Men vi använde det aldrig riktigt i produktion :).

Lite efter numbifieringav backtestaren lades ytterligare callbacks till strategin som bröt åtskillnaden mellan backtesting och strategiutvärdering, vilket innebar att för att hålla saken snabb måste du också skriva din strategi i numba! Men jag blev trött på den skakiga blandningen av python/numpy/numba gotchas och eftersom jag inte gillade liveexekveringen av FQT så släppte jag det hela ändå, för grönare (eller ska jag säga) rosa! ) betesmarker.

Hur som helst...optimering är crack.

Inläggstaggar: