lördag 26 november 2011

En intressant selektionsteknik för genetiska algoritmer

Jag har funnit mig själv mer och mer ockuperad med att skapa genetiska algoritmer för att hitta och optimera tradingstrategier. Simulerad evolution är häftigt, man ger algoritmen en funktion att optimera och kan sedan luta sig tillbaka och se på när lösningarna muteras och fortplantar sig med varandra. Dock finns det många alternativ för hur detta ska skötas bäst för att få det mest optimala resultatet.

En vanlig teknik som jag använt är att låta fitnessvärdena för individerna i populationen utgöra ett roulettehjul där de med högre tar upp mer plats och därför får stå som original för nästa generation fler gånger. I min serie om candlestick-mönster valde jag just den här selektionstekniken. Dock är det inte så passande för alla fitnessfunktioner, ibland kan en individ få utgöra alltför stor del av hjulet och då omedelbart koncentrera all fortsatt evolution till ett litet område runtom den individen. Ett mer praktiskt sätt att välja ut individer och sätta press på populationen är att ha en turneringsselektion. Man låter två slumpmässigt utvalda individer "tävla" om att få vara förälder till den nya individen. Man kan t.ex. också låta förlorarens plats i populationen ersättas av den nya individen för att skapa ytterligare press. Det var den här tekniken jag hade när jag tränade de neurala nätverken på Xact-fonderna och Ericsson B-aktien.

En idé på en ännu bättre selektionsteknik fick jag från det här pappret. Genom att dela upp hela populationen i två delar, de m% sämsta och den 1-m% bästa och sedan ta en förälder från båda kan man hålla variationen intakt under lång tid samtidigt som det finns ett press till det bättre. Om man t.ex. vill ha ett så hög fitnessvärde som möjligt kan man låta m vara 51. De bästa 49% kommer då stå för hälften av föräldrarna och de sämsta 51% kommer stå för den andra hälften. Då de bättre individerna kommer ha högre chans att väljas kommer populationen att röra sig mot ett högre medelvärde för fitnessvärdena.

För att visa med ett exempel på hur det kan fungera har jag tagit exemplet på ett neuralt nätverk i MS Excel och låtit m vara 51. Här är resultatet från 500 iterationer med en populationsstorlek på 60 individer. Mutationstakten sattes till 0% och fitnessfunktionen sattes till total vinst.





KvA

torsdag 24 november 2011

Hur man gör ett enkelt neuralt nätverk i Excel

Självklart kanske det finns en add-in för att göra neurala nätverk i MS Excel, men det är mycket roligare att göra det själv. Här är hur jag gör det;
  1. Hämta historik för valfri aktie/ETF/vadsomhelst. Min data för Xact Bull 2 hämtar jag här.
  2. Lägga Datum i kolumn A och Stängningskursen i Kolumn B.
  3. Skriv "=B3/B2-1" i cell C3 och fyll ner.
  4. Skriv "=C7*J$6+C6*J$5+C5*J$4+C4*J$3+C3*J$2" i cell D7 och fyll ner.
  5. Skriv "=OM(D7>0;1;0)" i cell E8, "=E8*C8+1" i F8 och "=G7*F8" i G8 samt skriv ett startvärde på portföljen (typ 100) i G7 för att sedan fylla ner rad 8.
  6. Skriv "=SLUMP()*(SLUMP.MELLAN(0;1)*2-1)" i J2 och fyll ner till J6.
  7. Lägg in en fitness-funktion i J1, kan vara t.ex. sharpe-kvoten, total vinst eller en regression. Jag lade in en länkning till det sista värdet i portföljen, "=G521".
  8. Kör följande makro för att skapa 20 slumpmässiga viktvektorer: Sub Skapa_initial_population()
    kol = 14
    Do
    kol = kol + 1
    Range(Cells(1, kol), Cells(6, kol)).Value = Range("J1:J6").Value
    Loop Until kol = 34
    End Sub
  9. Skriv en egen makro för att göra resten!

Vad det här exemplet gör är att ta den dagliga procentuella förändringen och multiplicera med en vikt för de senaste fem dagarna. Är värdet över noll så ligger vi långa, annars utanför. Mycket enkel, men den kreative kan med säkerhet göra mycket roligt utifrån det här enkla exemplet.


KvA

fredag 11 november 2011

Borde vi bry oss om hur vart USA stänger?

Det är ofta man hör på diverse forum att det är sannolikt att börsen kommer gå upp eller ner för att de amerikanska börserna gjorde det senaste sessionen på andra sidan av Atlanten. Detta är så klart ganska intuitivt då (1) USA är världens ledande ekonomi, (2) större delen av handelsdagen där sker när stockholmsbörsen har stängt för dagen vilket lämnar en del att ta igen i nästföljande öppning.

Låt oss ta en titt på lite statistik över detta fenomen. Här är en sammanställning av hur OMXS30 har gått nästföljande dag baserat på hur S&P 500, ett index över de största bolagen i USA, har stängt från 1986.













Det finns en stark tendens att följa vad USA gjorde igår hos stockholmsbörsen. Det här går så klart inte att handla efter då vi inte kan veta hur S&P500 stänger innan OMXS30 stänger, men det visar att det finns en anledning att oroa sig om man sitter med hela portföljen i 4X björnar efter stängning samtidigt som USA går starkt.


KvA