torsdag 27 oktober 2011

Handla Xact Bull med ett neuralt nätverk

Svarta lådan
Neurala nätverk
är spännande så de ger oss möjligheten att fånga samband bortom det mänskliga förståndet. Vanliga indikatorer ger oss möjligheten att fånga en faktor i isolering, t.ex. en enkelt RSI där vi ser vad som händer efter höga och låga värden och kan därefter dra slutsatser. Ska vi därefter försöka kombinera det med en annan faktor t.ex. vilken dag i månaden det är börjar våra potentiella kombinationer gå över gränsen för vad som är möjligt att hantera. Vad händer om RSI-värdet är under 30 och det sker i mitten på månaden? Händer samma sak som när RSI är under 20 eller finns det något speciellt med lägen där marknaden bara är lite översåld? Att fånga alla icke-linjära samband är något neurala nätverk gör mycket bra.

För att testa om vi kan designa ett black box-system ska vi börja med att bestämma vilka saker som ska analyseras. Jag vill fånga så mycket som möjligt av informationen som finns i de senaste prisstaplarna och har bestämt mig för att ha fem inputs till nätverket. De är:

  • RSI(2), för att fånga prisförändringen.
  • Dag i månaden, för att fånga möjliga datumeffekter.
  • Stängningen i relation till högsta-och lägstakursen.
  • Omsättningen delat i summan av de senaste tio dagarnas omsättning, för att få in volymen också.
  • Dagens rang delat i summan av de senaste tio dagarna rang, för att kunna analysera volatiliteten.
När det är klart kan vi gå över till att välja en topologi för nätverket. Mitt nätverk kommer att se ut så här om man skulle illustrerat det (i paint).

Det är ett enkelt feedforward-nätverk där fem ingångs-neuroner är kopplade till fem neuroner i det gömda lagret som i sin tur är kopplade till utgångs-neuronen som säger om vi ska köpa eller inte. Varje koppling har en vikt, och varje neuron har ett tröskelvärde som säger om signalen den får från sina kopplingar är stark nog att agera på, är den det så avger neuronen en etta.
Jag kommer att testa nätverket genom att först träna vikterna på Xact Bull från den 24 februari 2005 till den 30 juni 2010. All efterkommande historik är vår valideringsdata där vi kan se om nätverket verkligen hittade något robust eller om den bara överoptimerade träningsperioden.
Träningen görs av en simulerad evolution, 100 individer skapas och testas för att sedan få kämpa om att få reproducera sig i 2500 iterationer. Fitness-värdet är i det här fallet signifikansen beräknade med students t-test.


Resultat och utvärdering







Signifikansen i vår träningsperiod visar att ett sådant resultat har en chans på runt 1 på 16 935 att vara orsakad av slumpen. Det blir lite sämre efteråt då chansen ökar till 1 på 11. Dock visar båda perioderna att nätverket kan slå en enskild investering i Xact Bull så kanske finns det värde i att hålla ett öga på den fortsatta utvecklingen.

Andra värdepapper som kunde vara kul att testa är de mest likvida aktierna och inverterade börshandlade fonder. Jag har många idéer på hur man ska förbättra nätverket, man skulle kunna lägga till fler inputs och lägga till fler neuroner för att förbättra flexibiliteten hos nätverket. Dock för varje tillägg med sig högre chans att nätverket lär sig träningsperioden utantill och då misslyckas så fort den utsätts för ny data.

Nästa gång testar jag Xact Bear.


KvA

11 kommentarer:

  1. Fantastiskt intressant läsning! Du får gärna gå in ännu mer i detalj om hur du kodar själva testerna.

    SvaraRadera
  2. Tja Max.

    Kul att du tycker det! Kodandet är inte speciellt komplicerat, lite VBA-kod bara som lägger ut formler och flyttar runt värden.

    SvaraRadera
  3. Du kommer väl ihåg att du bara får använda utvärderingsperioden EN gång?

    Det vill säga, du får inte titta på den förrän efter du har valt system och lagt ut det på bloggen i princip.

    Annars gör du dig själv till en del av optimeringen, vilket jag gissar är förklaring till dina spektakulära resultat.

    SvaraRadera
  4. Bra poäng, körde träningen faktiskt fem gånger bara för att se om det fungerade och tog sedan den femte som exempel. De andra fyra hade signifikanser mellan 30% och 5%. Har kört den flera gånger efteråt och den misslyckas aldrig i utvärderingsperioden. En del gånger är det bara en affär med det beror mest på att mitt val av fitnessfunktion har sina tillkortakommanden.

    Har en del idéer på hur man slipper det instabila resultatet. Man kan komma ifrån det genom att använda en deterministisk träningsmetod. Ska förklara mer sen.

    SvaraRadera
  5. Det vore mycket intressant om du vill lägga ut VBA-kod och annat material du nyttjat för att ta fram resultatet, på detta sätt kan även besökare till din blogg undersöka och fördjupa sig i materialet samt notera eventuella förbättringar osv.

    SvaraRadera
  6. Ska fixa något senare som vem som helst kan leka runt med!

    SvaraRadera
  7. Ja, det hade varit superintressant att få ta del av dina undersökningar ur ett experimentellt perspektiv!

    SvaraRadera
  8. Du skriver att "Fitness-värdet är i det här fallet signifikansen beräknade med students t-test", hur görs detta, gärna i programkod (C# möjligen)?

    Tacksam för hjälpen.

    SvaraRadera
  9. Finns funktioner för det i Excel, i C# har jag aldrig gjort det men skulle tro att det finns en massa bibliotek tillhands för dessa uppgifter.

    SvaraRadera
  10. Hej,jag hittade din blog för ett par dagar sedan och du har ju minst sagt skrivit om mycket, för mig, intressanta saker.

    Jag började själv skriva lite enkla algoritmer för en månad sedan, hitills har jag dock endast använt stängningspriset för att generera köp/säljsignaler. Implementerade RSI igår efter att ha läst om den här på bloggen.

    Har du något skäl att inte använda ylog-diagram för att bättre se tillväxten under de första åren?

    SvaraRadera
  11. Hejsan Anders!
    Logaritmisk skala skulle vara vettigt då värdetillväxten är så kraftig, men jag gjorde mig inte besväret då träningsperioden inte är så intressant. Plus att det ser mer imponerande ut linjärt skalad. =)

    SvaraRadera