Maskininlärning och algoritmer som stöd för trading

För ett år sedan var det någon som skrev här senast.

Låt oss väcka diskussionen till liv.
Under julledigheten byggde jag en estimeringsprogramvara med Python och Tensorflow/LSTM/Deep-Learning, med vilken jag två gånger i veckan kalkylerade köpobjekt bland Nordnets certifikat och minifuturer med en insats på cirka 200 € och 15-20 värdepapper per gång för en veckas innehav.
Som bas använde jag PythonCoden tutorial.
EPOCHS=350, DROPOUT=0.4, LAYERS=2, NEURONS=256, BATCH_SIZE=64, N_STEPS=50
Jag har provat många olika inställningar, men tutorialens standardvärden verkar bara vara ganska bra. Jag minskade bara antalet epoker, eftersom TensorBoard indikerade en viss överinlärning med min egen förlustfunktion.
Detta är också positivt, eftersom träningen av 15 objekt inte tar så lång tid. Nu tar det cirka 6 minuter per ticker på en Azure VM med GPU. Med två VM:ar innebär det i praktiken en timmes operation för att hämta data från Nordnet, träna och handla.

Jag har ännu inte byggt en robot-handel, just nu håller jag fortfarande på att lära mig hur certifikaten och minifuturerna verkligen fungerar och hur man spelar med dem. Så handeln sker fortfarande manuellt.

Det har gett resultat på några veckor, ja, men volatiliteten är fruktansvärd. Intäkterna, liksom förlusterna, har främst kommit från enskilda fall och de andra har rört sig horisontellt. Kanske ska det vara så här. Resultatsäsongen kan också påverka.

Förlustfunktionen i algoritmen är egenkonstruerad och ska förutsäga short/long korrekt. Backtesterna ger en framgångsfrekvens på cirka 54%. I träningen använder jag nu tidsintervallet 2012 - 2020/6. Och sedan validering med ny data som algoritmen inte har sett 2020/7 - 2021/2. Här är det förstås så att valideringen inte inkluderar en riktig nedgång, och även om träningsdata innehåller ett par dippar, så är trenden huvudsakligen uppåtgående. Sedan i “produktionen” tränar jag fram till nuvarande tidpunkt, och söker sedan en prognos 5 börsdagar framåt.

Kanske under den här helgen ska jag skapa fejkdata där kurserna sjunker 2020/7-2021/2 för att se hur algoritmerna reagerar på det - det kommer att visa om detta har någon verklig nytta eller om den goda starten bara var tur.

Har det dykt upp andra som är intresserade av algo-trading här? Det skulle vara kul att utbyta åsikter och lära av er.

11 gillningar

Hur tänkte du göra fejkdata?

Om du känner till hur kurserna fungerar, varför behöver du maskininlärning när du bara kan hårdkoda dessa villkor i ditt program?

Om du inte känner till hur kurserna fungerar (du skulle förmodligen vara ganska rik om du gjorde det), säger prestandan för din prediktionsmodell med dina fejkdata ingenting om prestandan på riktiga kurser.

Jag skulle personligen göra löpande testning, till exempel träna modellen med det första året av din data och testa med månaden efter det året. Sedan flyttar du båda framåt en vecka, till exempel. När du har rullat igenom hela materialet får du en uppfattning om vilken nivå du kan uppnå med ett års material.

Hur fick du tillgång till Nordnet, har de ett öppet API för detta?

Jag testade en gång ett dussintal olika baslinjealgoritmer (rent tekniska MACD, ABCD etc, och DL-baserade LSTM) på olika aktier, och jag minns att jag fann att en mycket enkel MACD tycktes gå jämnast oavsett trend.

Till exempel, med Intels ticker verkade resultatet se ut som nedan. Det var cirka fyrahundra affärer under 40 år, och transaktionskostnader beaktades inte alls. Naturligtvis hade man tjänat mer pengar med en ren “håll”-strategi om man hade lyckats tajma köpet smart. Å andra sidan verkar det som om MACD kunde ha varit en ganska rationell följeslagare under kollapser och nedåttrender.

2 gillningar

Tack för svaren!
@Alfons_Knautmauer Jag har gjort ett sådant test som du föreslog, men på det sätt jag beskrev, det vill säga att jag använt ett tiotal olika aktier, tränat fram till förra sommaren och sedan med dessa aktier undersökt hur många gånger algoritmen förutsåg rätt med long eller short. Jag har också testat ett sådant rullande test, men mycket lite. Anledningen var att det tar så mycket tid att träna om man kör flera tickers i många cykler. Men bra poäng, jag borde göra detta igen och bara lägga tid på det.

Med fejkdata menar jag att om man matar in till exempel en sinusvåg eller sågtand i algoritmen, så borde den känna igen mönstret och kunna handla lönsamt därefter. För det borde vara det enklaste DL-fallet.
En annan fejkdata jag funderade på var riktig aktiehistorik, men jag skulle justera den så att från en viss tidpunkt skulle aktievärdet delas med 1.001, nästa dags värde med 1.002 och så vidare, för att få mer nedgång eller fall i kurserna. Nu efter sommaren har kurserna stigit hela tiden och visst föreslår algoritmen också oftare long än short. Men å andra sidan skulle en blind apa också ha träffat rätt om den till exempel hade 70% long-aktier och 30% short hela tiden.
Vad jag också har gjort är att jag har ställt in min egen loss-funktion (loss-funkkarin) att fungera tvärtom, det vill säga att föreslå affärer som skulle leda till maximal förlust. Och det hände faktiskt, validerat med historisk data som algoritmen inte har sett, alltså.

@Seinakadun_Keisari Jag har bara hämtat Nordnet Markets-prislistan från Nordnet, för att veta vad som ens är vettigt att köpa. De flesta är sådana produkter att man gör förlust även om man har rätt till 60%. Det vore dock trevligt om Nordnet erbjöd prislistan som en .csv-fil.
Nordnet har ingen publicerad API. Men visst finns det API:er där, men jag använder dem inte nu. Om man skulle använda API:er, så skulle man behöva pilla med rätt headers, cookies och så vidare.
Det skulle naturligtvis bli mindre belastning på deras servrar om man kunde hämta den aktuella prislistan direkt från API:et, då skulle prisinformationen inte heller hinna bli gammal. Främst i prisinformationen är jag intresserad av hävstång och spread för varje produkt.
Robothandel skulle sedan vara ett eget projekt, och det skulle också kunna genomföras via ett webb-UI (web-ui) eller om man kommer på hur man använder API:er, så genom att använda dem. Båda har sina egna problem, ingen helt enkel sak, just specialfall, som situationer där priset sticker iväg och ingen handel uppstår.

1 gillning

Okej! Jag gjorde också ett eller två experiment där jag enbart handlade med MACD. Jag fick inte ett särskilt bra resultat med det under de senaste åren. Från tidigare år däremot. Ditt MACD-resultat ser dock väldigt bra ut. Om det vore på en logaritmisk skala skulle det kanske inte se lika bra ut, eftersom prestationen efter 2015 till exempel är 1200 → 1350, eller hur, alltså 12,5% bra på 6 år.

Jag märkte redan i de första DL-försöken att prestandan var enorm (i genomsnitt för flera aktier) under åren 2000-2011, men efter 2012 började det bli svårt och under de allra senaste åren kan man bara uppnå en mycket liten fördel. Därför har jag bara använt data från 2012-2021 för träning, och sedan bara aktier för vilka yahoo-API:et har historisk data i över sex år. Med kortare data, som ett år, tror jag att algoritmen också skulle behöva justeras, eftersom jag är rädd att den lätt överanpassar sig till den lilla datan.

Har du förresten använt Zipline eller Backtrader för backtesting? Jag lekte med dem förra hösten, men det hela blev lite ofärdigt. Om du har koder på Github någonstans kan jag vara intresserad. Kanske vi kunde hjälpa varandra? Jag studerade utifrån boken Machine Learning for Algorithmic Trading.

Jag hade faktiskt idén bakom dessa inlägg som en uppmuntran, ifall jag kunde hitta en sparringpartner eller flera för dessa algohobbyer.

Jag har mina koder på GitHub, men mest i privata repos.
Det är nog inget känsligt i de andra heller, internet är fullt av tutorials för algohandel. Men de flesta av mina repos är sådant ofullständigt skräp :slight_smile:
Och detta nuvarande produktionssystem (det låter imponerande med “produktion”) är fortfarande ganska manuellt och efter flera justeringar är jag inte särskilt stolt över kodkvaliteten. Jag måste (borde) också städa upp.

Kanske vi kunde skicka privata meddelanden och kolla om vi är på samma våglängd?

Jag läste några böcker av Eric Chan för ett par år sedan och började med Excel, sedan gjorde jag alla möjliga justeringar med C#, Python, etc.

Nu för detta system började jag bara studera Tensorflow, gjorde flera experiment baserade på olika artiklar jag hittade online, oftast på Medium. Men jag har inte systematiskt lärt mig något genom att följa en bok, utan har snarare gått framåt genom försök och misstag och letat efter tips i olika artiklar.

Och om backtesting - nej, jag har inte använt några färdiga produkter, jag har bara kodat backtesterna med mina egna små händer.
Det finns naturligtvis alltid en misstanke om att det skulle finnas enklare sätt att göra saker, men då skulle jag behöva veta mer om dessa verktyg.

1 gillning

Jag skulle faktiskt rekommendera det här forumet eftersom det behandlar många typiska tillvägagångssätt i algoritmer som inte fungerar ganska bra. Marknadsdata innehåller så mycket brus att man behöver en ganska stark statistisk modellering för att avgöra om en signal är tillräckligt tillförlitlig eller inte. En alltför komplicerad modell kommer förmodligen att överanpassa sig till enbart brus. Ett annat typiskt problem sägs vara om backtestning inte modellerar bud/sälj-spreaden. I så fall kan testningen visa vinster som inte finns i verkligheten.

2 gillningar

Mina egna algoritmprognoser ser ut så här. Prognos för de kommande 4,5 månaderna. Dagarna är inte jämnt fördelade, utan halvvägs finns en prognostiserad situation för cirka 1,5 månader framåt.

Jag kan rekommendera boken jag nämnde. Här är ett github-repo med all kod, inklusive en Docker-container för miljön (öppen även utan boken). Med hjälp av den har jag kört dessa i Azure. Synd bara att boken handlar ganska mycket om den där Zipline, som kanske är lite för tung för min smak. Jag skulle vilja gå över mer till Backtrader.

1 gillning

Jag borde repetera formlerna för den kumulativa logaritmiska avkastningen…

Om jag inte minns helt fel, visade den tidigare grafen just den logaritmiska avkastningen, och avkastningen på 1200 → 1350 under de senaste 6 åren skulle innebära en avkastning på 150 %, dvs. en genomsnittlig årlig avkastning på cirka 25 %.

Avkastning och längd på affärerna:

Om man började med 100 dollar 1980 och satsade allt i varje affär, blev resultatet följande:

Å andra sidan, om varje transaktion kostade 0,5 % i avgifter, skulle slutresultatet vara 12 000 euro istället för 800k. Med 0,2 % i avgifter blev det 140k euro. Avgifternas andel spelar alltså en ganska avgörande roll för lönsamheten av denna strategi. (Om man verkligen skulle lägga upp en halv miljon skulle avgifterna naturligtvis inte vara tusen euro per affär, utan hos Nordea (Nivå 5) 0,06 %, dvs. 300 euro per affär, och i slutändan skulle avgifterna kosta mindre än 100k euro och man skulle få 700k euro i handen).

Här är de senaste 3 årens affärer. MACD har en ganska snygg förmåga att träffa bottnar och fungerar fortfarande idag. Intel har svängt ganska kraftigt fram och tillbaka och presterat dåligt, men MACD har kunnat uppvisa en ganska jämn uppgång på lång sikt. Det är värt att notera att MACD inte alls påverkades av coronadippen, och hoppade tillbaka ombord relativt nära bottnarna. I augusti 2020 verkar det däremot som att Intel hade en extremt dålig rapport samtidigt som AMD slog rekord, och dessa tekniska prylar kan naturligtvis inte reagera på det. Vore avkastningen bättre om man inte satt med baserat på tekniska indikatorer inför resultatpresentationer…

Är det det här repot för boken? Det verkar som att det finns en sammanfattning av själva boken också.

Japp, precis den. Har stött på några buggar därifrån, men har klarat mig och kommit vidare med dem. Det kan vara så att det har kommit korrigeringar för dessa sedan dess. Jag lyckades importera en delmängd av hex25-företaget som backtest-material till zipline med Yahoo Finance-data, om jag minns rätt från 2016->. Jag tog bort företag som hade haft en split och en merger från urvalet, eftersom jag var för lat för att korrigera kurserna för dem.

Vilka parametrar för MACD använder du?

Demosimuleringen av Backtrader som @Alfons_Knautmauer tipsade om, visar att MACD(12,26)-inställningar skulle resultera i förluster under den tidsperioden, även utan handelskostnader (här är demon i mitt repo). Den översta blå kurvan är enligt mig “resultatet”, och tidsperioden är 2017-2021.

Edit. Svarar mig själv. Jag läste riktigt dåligt, demon är inte MACD, utan moving average cross-over. Pinsamt.
Edit2. Har nu korrigerat SMA till EMA, det vill säga att det nu är MACD. “MACD beräknas genom att subtrahera den 26-perioders exponentiella glidande medelvärdet (EMA) från den 12-perioders EMA.” Men detta ger ändå inte ett särskilt bra resultat.
Edit3. Jag ändrade även startkapitalet till 50 dollar för tydlighetens skull. Denna Backtrader, med dessa inställningar, utelämnar den sista och kanske mest lönsamma affären.

Prova att hitta hyperparametrar med Bayesiansk optimering (Bayesian optimization with Gaussian process) så slipper du krångla med inställningarna. Skopt (scikit optimization) paketet är ganska lätt att lära sig. Och förresten, den här tekniken kan användas för att hitta parametrar för vilken funktion som helst.

1 gillning

Du handlar antagligen bara korta och långa EMA-crossovers. Prova denna mer allmänt använda korsning av MACD och dess signallinje. Det innebär att man beräknar en separat t.ex. 9-dagars EMA från MACD, och handeln baseras på crossovers mellan denna MACD och dess signallinje.

Redigera. Backtrader-diagrammet ser rörigt ut för mig. Är de bollarna eurobelopp eller procent, och hur mycket beaktar det avgifter automatiskt?

2 gillningar

Jag slutade med maskininlärningsövningarna innan jag ens hann börja ordentligt. Av någon anledning hade jag tydligen inte tid att fördjupa mig i det. Ändå undrar jag varför alla verkar börja med sina egna grejer för att handla på aktiemarknaden? Även Medallion Fund tog minst ett decennium innan de fick sina aktiemarknadsalgoritmer att generera vinst. Innan dess gjorde de en bra vinst på valutahandel och råvaror. Det fick mig att tänka att det kanske vore bättre för även en “amatör” att börja där.

Jag, som undertecknad, har övat med kryptovalutor just för att kostnaderna är extremt låga, det finns mycket volatilitet, API:er och öppen källkodsbibliotek inom det området är omfattande, och kryptovalutor verkar röra sig mycket baserat på tekniska faktorer / sentiment jämfört med aktier. Jag vet inte hur beskattningen av valutahandel fungerar, men är det inte lite samma sak med dessa scener som med CFD:er, att förluster inte kan dras av, vilket gör det helt olönsamt?

Jag har inte orkat slutföra mina algoritmer, men min magkänsla är att man bara genom att apa efter konsensus på Inderes forum och med till exempel MACD skulle kunna uppnå bättre resultat än med mina egna känslomässiga trix. Kanske de nordiska marknaderna är så pass illikvida att det mycket väl skulle kunna finnas felprissatta produkter här, till exempel halvt gratis Efecte, Verkkokauppa under corona skulle någon algoritm lätt ha kunnat plocka upp. Jag har inte mycket tro på algoritmbaserad dagshandel på grund av slumpen, men på längre sikt verkar det vara ett mycket trevligt hjälpmedel, särskilt i situationer som coronadippen i mars.

4 gillningar

Jasså, ja just det. Jag kunde inte handla med MACD. Jag fixade det (Github). Den här bilden ser mer ut som din och jag fick Backtrader att utföra strategin All-In. Men resultatet är fortfarande inte smickrande. Ser det okej ut för dig?

Dessutom, när jag vänder på signalerna, alltså buy->sell och sell->buy, är resultatet bättre:

Om det inte längre finns några stora fel i detta, är min slutsats att vinsten kommer från att algoritmen ibland håller, och att handeln främst orsakar förluster.

Redigering. Ännu en fråga: jag tror att bollarna är dollar. Kostnaderna är som standard 0 antar jag, men du kan ställa in värden som slippage och commission därifrån. De har dock väldigt många olika inställningar för att matcha den verkliga världen.