REPORTAGE – Kvantitativ Analys
I detta reportage kommer jag att berätta hur mitt arbete med kvantitativ analys fungerar. Inledningsvis kommer jag övergripande att presentera de olika stegen hur jag skapat en fullt fungerande algoritm. En algoritm som löpande kan ta fram prognoser för aktiemarknaden. Kunskaperna jag förmedlar kommer från mitt arbete med Python programmering och som privat aktiehandlare. För min egen del har jag tjänat pengar genom mina algoritmer, jag har bl.a. varit kort mot marknaden sedan första veckan i januari, fram tills torsdag den 21 januari. Även de prognoser jag skapar åt www.marknadspodden.se har gett bra utfall, av de senaste fem veckorna har den portfölj jag presenterar ökat med hela +7,8 procent. Under 2016 har min portfölj ökat med +5,8 procent, ska jämföras med Stockholmsbörsen som backat mer än -10 procent under samma tid. Fler exempel finns på www.beststrategies4trading.com
Del 1.1 – Filosofin
Inlärning, erfarenhet och kunskap för oss människor startar direkt efter födseln. Ett litet barn kommer att efter de första gångerna den sett exempelvis en hund, att kunna på egen hand själv börja känna igen helt nya hundar som den får möta. Barnet lär sig vilken färg, form, antal ben och andra karaktärsdrag som är signifikativt med vad som just är en hund. Vid vuxen ålder har de flesta av oss, efter att sett och mött tusentals hundar i vårt liv, lärt oss att med rätt stor säkerhet bestämma vilka varelser som kan kallas en hund. Vi har förmodligen även lärt oss om de är farliga, vilken ras de tillhör och vad de normalt sett används till. Tanken är att ju fler tillfällen vi utsätts för någonting desto mer säkra och erfarna blir vi att hantera samma situation i framtiden. Denna filosofi finns enligt mig även för att se skillnaden på vilka historiska kursmönster som är utmärkande inför en kommande upp- respektive nedgång på börsen.
Del 1.2 – Möjligheterna
Att manuellt med ögonen till hjälp sitta framför datorn och följa olika aktiekursers utveckling, som underlag för att handla innebär att det finns en hel del praktiska begränsningar kring hur många aktier det är möjligt att följa varje dag. Eftersom aktiehandel till stor del handlar om en konstant ”tävling” mellan köpare och säljare om bästa handelsvillkor, handlar framgångsrik börshandel att bättre än andra handlare, förstå vid vilka tidpunkter och prisnivåer det skall göras affärer.
Av den anledningen blir det relativt orimligt att nybörjare med liten erfarenhet snabbt kan komma in och börja konkurrera med de allra främsta och mest erfarna handlarna på marknaden. Ett rimligt antagande enligt mig borde vara att börshandel minst kräver de omtalade 10 000 timmars praktisk erfarenhet, innan någon på allvar kan börja konkurrera med eliten.
Det unika som maskininlärning kan utföra, är att låta en algoritm läsa in massvis med information kring en enorm mängd olika historiska handelstillfällen och samtidigt instruera algoritmen att vid varje tillfälle, det även tillkommer ett framtida utfall. Algoritmen kommer därefter att själv ”lära sig” och para ihop vilken typ av historiska kursmönster och andra förutsättningar som är karakteristiskt inför kommande upp- respektive nedgång på marknaden.
Del 1.3 – Programvara
Python – Jag har valt att arbeta med programspråket Python, av det skälet att det är gratis att börja med, enbart att ladda ned och installera från deras officiella hemsida. Det finns även oändligt mycket dokumenterad källkod, inlärningsexempel samt utbildningar fritt tillgängligt via Internet. Samt att det finns ett väldigt bra extra bibliotek (Scikit Learn) med skript som hanterar alla de vanligaste algoritmtyperna för maskininlärning. För att arbeta med Python och för att bl.a. inte behöva enskilt ladda ned varje nödvändigt extra bibliotek med särskilda skript, har jag valt att använda mig av helhetslösning Anaconda från Continuum Analytics. Anaconda är även det gratis (i sitt grundutförande) och kommer bl.a. med texteditor Spider samt har ca 150 av de mest användbara extra biblioteken medpaketerade. Det innebär att allt det som behövs för att komma igång med maskininlärning för börshandel finns med vid första installationstillfället.
MetaStock – Jag använder mig av börsanalysprogrammet MetaStock, det programmet kostar ca 1500 kronor i grundutförande och därefter ca 500 kronor per månad för att få tillgång till aktuell dagsdata med fördröjning. För min del använder jag MetaStock i detta sammanhang för att programmet hanterar systemtestning väldigt bra. De algoritmer som Python och Scikit Learn använder, hanterar enbart hur hög träffsäkerhet prognoserna har mot den samlade mängden handelstillfällen, det är först genom systemtestning som jag kan ta reda på om träffsäkerheten är väl spridd över hela tidsserien.
Excel – Jag använder Microsofts trotjänare inom kalkylering främst för att kalibrera de resultat och prognoser algoritmen skapar. Det innebär i första hand att jämföra olika potentiella utfall och dess procentuella sannolikhet.
Del 1.4 – Hårdvara
Denna typ av arbete sköts med fördel med en dator som har många kärnor i sin processor, detta beror på att jag själv kan välja hur många tillgängliga kärnor som skall arbete parallellt när algoritmen gör sina beräkningar. Därefter är det en fördel med en processor som har hög driftsäkerhet, beror på att vissa beräkningar kan ta många dagar eller vid tillfällen då datorn under lång tid ska göra schemalagda aktiviteter. Personligen använder jag en Dell Precision T5500 med en 6 kärnig Xeon processor och 12GB ram med två skärmar.
I övrigt har jag två stycken extra datorer med en godtagbar prestanda som jag använder för längre testkörningar, men som inte är känsliga för oväntade driftsstop.
Del 1.5 – Historisk data
Valet av historisk data är det första riktigt stora och viktiga valet när jag börjar mitt arbete med maskininlärning. Här finns det minst två viktiga faktorer som styr detta val. För det första rör det sig om prestandan på min dator. Exempelvis när jag använder min äldre dator, med en Phenom processor med fyra kärnor och enbart 4GB i ram, kan jag som maximalt arbeta med en matris innehållandes 600 000 rader och 100 kolumner där talen är angivna med fyra decimaler.
Det andra valet handlar om vilka instrument som ska ingå och i vilket tidsformat dessa instrument ska användas. Från tidigare erfarenhet kring systemtestning vet jag att det finns en stor risk för överoptimering. En strategi med kursdata från ett fåtal instrument som enbart befinner sig i en stigande marknad utan större volatilitet kommer inte att fungera, om jag testar den på kursdata från en fallande marknad med stor volatilitet.
Själv har jag valt att köpa kursdata från kibot.com, det innebär att dessa data bör vara korrekt återgiven och med hög kvalité. Kostnaden för deras paket med de 200 vanligaste terminsinstrumenten är ca 70 USD för 30 minuters data, inkl. dagsdata, med värden tillbaks till mitten av 90-talet. Jag har även valt att använda mig av ett paket som innehåller de 50 mest omsatta aktierna och ETF:er från New York börsen, med snarlika prissättning och innehåll.
Del 1.6 – Indikatorer
Valet av indikatorer är det andra stora och viktiga valet när jag börjar mitt arbete med maskininlärning. Från min egen erfarenhet och från de utbildningar jag deltagit i som börshandlare anser jag att teknisk analys baserat på prisutvecklingen har visat sig vara bland de mest effektiva prognosmodellerna. Det bekräftas även av att jag noterar att många av de mest aktiva börshandlare med lång historik (förmodat framgångsrika) som väljer att publicera sina analyser i sociala medier, nästan uteslutande använder sig av dessa ”price action” metoder. Dessa metoder innebär att indikatorernas värden hämtas från tidigare lätt identifierbara toppar och bottnar för aktiekursen, därefter används dessa till att skapa olika mönster och formationer. Fördelen med att fokusera på mönster och formationer är att det inte spelar någon roll vilken tidsenhet som används. Exempelvis kommer årshögsta alltid ha samma värde oavsett om det är veckodata eller minutdata som används. Min teori kring varför teknisk analys framgångsrikt kan användas till att förutspå kursutvecklingen, beror enligt mig på att om många aktörer på marknaden (i brist på annat aktuellt beslutsunderlag) baserar sin handel på prisutveckling, kommer det även att få en faktisk påverkan för marknaden. Inom den socialpsykologiska vetenskapen finns det flera välkända teorier som beskriver dessa fenomen, bl.a. i studier inom numerisk kognition och självuppfyllande profetior. Min åsikt är att dessa får en större effekt om fler har möjligheten att uppfatta samma typer av mönster och formationer, vilket är fallet jämfört med traditionella indikatorer där värdet hela tiden kommer att skifta beroende på vilken tidsenhet som används. 200 dagars glidande medelvärde har nästan aldrig samma indikatorvärde som 200 minuters glidande medelvärde, samma sak gäller för alla indikatorer i formatet av oscillatorer, dvs. RSI, MACD etc.
Inom maskininlärning finns även möjlighet att låta algoritmen skapa värderingar kring vilka av de indikatorer som används som bidrar mest, till att öka prognosens träffsäkerhet. Genom det arbetet har jag funnit att volatiliteten, mätt som standardavvikelse tydligt bidrar till högre träffsäkerhet.
Fundamental data blir svårt att använda när jag använder mig av dagsdata, det är få fundamentala nyckeltal som har en daglig förändring av sina värden. De enda icke prisgenererade värden jag i nuläget valt att låta algoritmen ta med i inlärningsprocessen är datumvärden, dvs. veckodagens nummer, dag på året, månad på året m.fl.
Del 1.7 – Utfallsindelning
Valet av vilka olika typer av framtida utfall som algoritmen ska tränas mot att känna igen, är det tredje mycket viktiga valet när jag börjar mitt arbete med maskininlärning. Detta torde egentligen inte vara ett stort beslut, enkelt att ta den procentuella skillnaden mellan dagens slutkurs jämfört med morgondagens slutkurs. Dock vet jag genom min erfarenhet som börshandlare att det mentalt är mycket lättare att genomföra affärer där kursen nästan omgående börjar röra sig åt rätt håll. Av den anledningen är det inte önskvärt att träna algoritmen att hitta mönster som leder till slutligen positiv avkastning men som innan dess varit på prisnivåer som skulle inneburit betydande negativt avkastning. Det är även intressant att hitta mönster som är i början av en långvarig prisrörelse, ju färre omplaceringar som måste göras desto mindre transaktionskostnader behöver jag ta hänsyn till när strategin ska testas eller handlas i praktiken.
Jag har valt att dela in utfallet i två olika grupper, den första gruppen fokuserar på det faktiska utfallet men jämför då aktuell handelsdags slutkurs med en sammanvägning av kommande dags kurs för Öppning, Högsta, Lägsta och Stängning. I den andra gruppen låter jag relationen/kvoten mellan högsta möjliga prisuppgång och lägsta möjliga prisfall vara den avgörande faktorn. Exempelvis om kursen som lägst har en prisnedgång på en procent och som högst en prisuppgång på fem procent, blir det en faktor på positivt fem, desto högre faktor desto kraftfullare var stigningen och på motsvarande sätt innebär en negativ faktor sjunkande framtida kurser.
Därefter låter jag bägge dessa grupper delas in i vardera fem stycken faktiska utfallsklasser. Dessa utfallsklasser benämner jag, Stark nedgång, Nedgång, Neutral, Uppgång samt Stark uppgång. Den specifika indelningen har jag gjort genom att ranka värdena i de bägge grupperna från högsta till lägsta värde och gruppera dem procentuellt i enlighet med vedertagen normalfördelning, dvs. 38 procent är neutrala, 24 + 24 procent har stigit respektive sjunkit samt 7 + 7 procent är klassificerat som kraftig stigning respektive kraftig nedgång.
Det är mot dessa sammanlagt tio olika utfallsklasser (5 + 5) som jag låter algoritmen lära sig vilken nivå av sannolikhet, olika historiska kursmönster kommer att skapa. Varje av de två olika grupperna har som sagt fem olika utfallsklasser och således kommer algoritmen att tilldela alla de fem möjliga utfallen en procentsats, som motsvarar den prognostiserade sannolikheten. Av den anledningen kommer summan av de fem olika procentsatserna för de fem möjliga utfallsklasserna att alltid uppgå till 100 procent. Detta upprepas även för grupp nummer två, dvs. den grupp som tog hänsyn till kvoten mellan högsta och lägsta framtida prisutveckling.
Detta är dock inte tillräckligt omfattande enligt mig, utan jag har även valt att låta algoritmen lära sig sambanden mellan kursmönster och framtida utfall, mot sju stycken skilda framtida tidpunkter. Dessa tidpunkter är 1, 2, 3, 5, 8, 13 och 21 dagar in i framtiden, valet av siffror är inspirerade från Fibonaccios talserie. Syftet är att hitta framtida kursrörelser som är genuint förankrade mot både kort och medellångs sikt samt att hitta en kommande kursrörelser som är i början av sitt momentum.
Del 1.8 – Algoritm
Valet av specifik typ av algoritm är det tredje mycket viktiga valet när jag börjar mitt arbete med maskininlärning. För detta inlärningsarbete och den framtida produktionen av prognoser har jag fyra olika typer av krav.
För det första måste det vara möjligt att spara den information som algoritmen efter sin inlärning har skapat kring de samband som finns mellan olika typer av historiska kursmönster och framtida utfall. Detta beror på att jag inte är tvingad till att konstant använda uppdaterad data för inlärningsprocessen. Om jag använder en månad mer eller mindre kommer det inte att göra någon markant skillnad när de flesta dataserier ändå går tillbaks till mitten av 90-talet. Detta skapar alltså möjligheten att använda relativt omfattande inlärningsunderlag som inte behöver upprepat läsas in och tränas, för varje enskild framtida prognos.
För det andra vill jag använda en algoritm som är bra på att hantera fler utfallsklasser än bara två, då jag själv valt att använda fem stycken. Som jag tidigare beskrivit har jag valt att använda två typer av utfallsberäkningar med sju stycken tidslängder för varje beräkningstyp. Detta innebär att jag totalt sett tränar och använder fjorton stycken enskilda algoritmer som underlag för varje unik prognos. De två faktorer som avgör om en algoritm är bra, är främst hur hög träffsäkerhet och hur snabb den är under inlärningsprocessen.
För det tredje vill jag använda en algoritm som inte bara ger ett utslag för vilken av de olika utfallsklasserna som har högst sannolikhet, utan algoritmen ska även erbjuda metoder för att prognostisera procentuella sannolikheter för alla av mina fem utfallsklasser. Exakt hur stor är sannolikheten för Stark nedgång, Nedgång, Neutral, Uppgång samt Stark uppgång? Svaret på den frågan berättar om sannolikheten likartad eller om någon utfallsklass sticker ut mer än andra?
Svaret till mina önskemål blir att jag valt att använda en algoritm av typen Ensemble, närmare bestämt en ”Random Tree”. I mina efterforskningar kring maskininlärning för börshandel har jag identifierat att ”Random Tree” är en vanligt förekommande typ av algoritm.
Del 1.9 – Resultat
Algoritmen är inte dum, utan kommer alltid att söka en prognos som skapar högst träffsäkerhet mot de fördefinierade utfallsklasserna. I mitt fall har jag valt att låta de neutrala utfallet utgöra 38 procent av samtliga utfall. Det innebär att om algoritmen helt slumpmässigt väljer en utfallsklass under sin inlärningsprocess, kommer den i 38 procent av fallen ha korrekt svar. Här finns det två stycken motstridiga intressen mellan att tänka som en statistiker och som en erfaren börshandlare. Som statistiker vill du ha en så hög träffsäkerhet jämfört med det slumpmässiga utfallet som möjligt. Som erfaren börshandlare vill du hitta de tillfällen då sannolikheten för vinst kontra förlust är så hög som möjligt och i synnerhet vill du få indikationer när vinsten och den kursrörelse du förväntar dig blir så lång och ensidig som möjligt. Dessa två målsättningar är inledningsvis svåra att kombinera och min lösning på detta är att, dels identifiera de stora och tydliga kursrörelserna (de bästa) och låta dessa vara i två enskilda utfallsklasser. Dock kommer dessa att utgöra anomalier med ringa förekomster från inlärningsunderlaget, 7 + 7 procents av utfallen. Min lösning för att tillvarata möjligheten att få information om förväntade stora enkelriktade kursrörelser är att hela tiden jämföra de två skillnaderna i den procentuella sannolikheten i först Uppgång mot Nedgång samt sedan för Stor uppgång mot Stor nedgång. När jag börjar skapa min slutgiltiga prognos kommer jag att först beräkna skillnaderna i procentuell sannolikhet för två parvisa kombinationer från fem av de möjliga utfallsklasserna. Detta kommer att vara aktuellt för alla av de 14 olika algoritmerna jag använder i skapandet av en prognos för varje enskilt instrument, totalt sett kommer 28 stycken procentuella differenser ligga som grund i prognosen.
I nästa steg har jag noterat att storleken av de slutgiltiga procentuella utfallet (avkastningen) i kombination med träffsäkerheten förbättras om jag bortser från de tillfällen då den ovan nämnda, procentuella differensen är liten. Ju högre och tydligare den procentuella differensen är desto högre blir träffsäkerheten och avkastningen. Detta ska därefter kalibreras med hänsyn till vilka typer av instrument som ingår i underlaget med utförda prognoser samt hur höga transaktionskostnader dessa typer av instrument för med sig.
Nedan finns ett slumpmässigt urval från 5000 handelstillfällen med tillhörande prognos samt det procentuella utfallet efter en dag. De instrument som används är S&P500, Dow Jones Industrial, Guld, Olja, Nikki225, Hang Seng, EUR/USD, JPY/USD samt FTSE100. Dataserien är sorterad, från högsta dagliga utfall till lägsta (röd linje), de blå staplarna (visuellt avkapade) är det prognosvärde som var aktuellt. Genom att beräkna ett glidande medelvärde om 1000 prognoser (svar linje) finns det ett tydligt belägg för att det går att med viss sannolikhet förutspå kommande prisrörelser på börsen och att framtiden på marknaden inte är helt slumpartad.
Leave A Comment