MetaTrader 5 - Trading Machine Learning: Hur stödjer vektormaskiner kan användas i handel Vad är en supportvektormaskin En stödvektormaskin är en metod för maskininlärning som försöker ta in data och klassificeras i en av två kategorier. För att en stödvektormaskin ska fungera är det nödvändigt att först använda en uppsättning träningsinmatnings - och utgångsdata för att bygga stödmekanismsmodellen som kan användas för att klassificera ny data. En stödvektormaskin utvecklar denna modell genom att ta in träningsinmatningarna, kartlägga dem i multidimensionellt utrymme och sedan använda regression för att hitta en hyperplan (en hyperplan är en yta i n-dimensionell rymd som skiljer utrymmet i två halvdelar) som skiljer sig bäst de två klasserna av ingångar. När stödvektorns maskin har blivit utbildad kan den bedöma nya ingångar med avseende på den separerande hyperplanen och klassificera den i en av de två kategorierna. En stödvektormaskin är i huvudsak en ingångsutmatningsmaskin. En användare kan lägga in en inmatning, och baserat på modellen utvecklad genom träning kommer den att returnera en utgång. Antalet ingångar för en given stödvektormaskin sträcker sig teoretiskt från en till oändligheten, men i praktiken begränsar datakraften hur många ingångar som kan användas. Om till exempel N ingångar används för en särskild stödvektormaskin (heltalets värde från N till ett oändligt), måste stödvektormaskinen kartlägga varje uppsättning ingångar i N-dimensionellt utrymme och hitta en (N-1 ) - dimensionell hyperplane som bäst separerar träningsdata. Figur 1. Support Vector Machines är inputoutputmaskiner Det bästa sättet att konceptualisera hur en supportvektormaskin fungerar är genom att beakta det tvådimensionella fallet. Anta att vi vill skapa en stödvektormaskin som har två ingångar och returnerar en enda utgång som klassificerar datapunkten som tillhör en av två kategorier. Vi kan visualisera detta genom att plotta det på ett tvådimensionellt diagram, såsom diagrammet nedan. Figur 2. Vänster: Stöd vektor maskininmatningar mappade till ett 2D diagram. De röda cirklarna och de blå korsarna används för att beteckna de två klasserna av ingångar. Figur 3. Höger: Stöd vektorinmatningar inmatade till ett 2D-diagram. De röda cirklarna och de blå korsarna används för att beteckna de två klasserna av ingångar med en svart linje som indikerar separeringshyperplanet. I det här exemplet anger de blå korsen datapunkter som hör till kategori 1 och de röda cirklarna som representerar datapunkter som hör till kategori 2. Varje enskild datapunkt har unikt inmatningsvärde 1 (representerat av sin position på x-axeln ) och ett unikt ingång 2-värde (representerat av deras position på y-axeln) och alla dessa punkter har kartlagts till det 2-dimensionella utrymmet. En stödvektormaskin kan klassificera data genom att skapa en modell av dessa punkter i 2-dimensionellt utrymme. Stödvektormaskinen observerar data i 2-dimensionellt utrymme och använder en regressionsalgoritm för att hitta en 1-dimensionell hyperplane (aka-linje) som mest precist separerar data i sina två kategorier. Denna separeringslinje användes sedan av stödvektormaskinen för att klassificera nya datapunkter i antingen kategori 1 eller kategori 2. Animeringen nedan illustrerar processen att träna en ny stödvektormaskin. Algoritmen börjar med att göra en slumpmässig gissning med att hitta en separerande hyperplans, och det förbättrar iterativt noggrannheten hos hyperplanet. Som du kan se börjar algoritmen ganska aggressivt, men då saktar den ner när den börjar närma sig önskemålslösningen. Figur 4. En animering som visar en support vektor maskin träning. Hyperplanet konvergerar gradvis på den ideala geometrin för att separera de två dataklasserna. Det 2-dimensionella scenariot ovan presenterade låter oss visualisera processen för en stödvektormaskin, men det kan bara klassificera en datapunkt med två ingångar. Vad händer om vi vill använda fler ingångar Tack så mycket ger stödmekanismalgoritmen oss att göra detsamma i högre dimensioner, men det blir mycket svårare att konceptualisera. Tänk på detta, du vill skapa en stödvektormaskin som tar 20 ingångar och kan klassificera vilken datapunkt som helst med hjälp av dessa ingångar i antingen kategori 1 eller kategori 2. För att kunna göra detta måste supportvektorns maskin modellera data i 20-dimensionellt utrymme och använd en regressionsalgoritm för att hitta en 19-dimensionell hyperplan som skiljer datapunkterna i två kategorier. Det blir mycket svårt att visualisera, eftersom det är svårt för oss att förstå något över 3-dimensioner, men allt du behöver veta är att det fungerar på exakt samma sätt som det gör för det 2-dimensionella fallet. Hur fungerar stödmekanismer Exempel: Är det en sknick Föreställ dig det här hypotetiska scenariot, du är en forskare som undersöker ett sällsynt djur som bara finns i djupet i Arktis kallat Shnicks. Med tanke på dessa djurs avlägsenhet har bara en liten handfull någonsin hittats (vi kan säga omkring 5000). Som forskare står du fast med frågan. hur kan jag identifiera en schnick Allt du har till ditt förfogande är de forskningshandlingar som tidigare publicerats av en handfull forskare som har sett en. I dessa forskningshandlingar beskriver författarna vissa egenskaper om de Schnicks som de hittade, det vill säga höjd, vikt, antal ben etc. Men alla dessa egenskaper varierar mellan forskningspapiren utan märkbart mönster. Hur kan vi använda dessa data för att identifiera ett nytt djur som schnick En möjlig lösning på vårt problem är att använda en stödvektormaskin för att identifiera mönstren i data och skapa en ram som kan användas för att klassificera djur som antingen schnick eller inte en schnick. Det första steget är att skapa en uppsättning data som kan användas för att träna din supportvektormaskin för att identifiera schnicks. Träningsdata är en uppsättning ingångar och matchande utgångar för stödvektorns maskin för att analysera och extrahera ett mönster från. Därför måste vi bestämma vilka insatser som ska användas och hur många. Teoretiskt sett kan vi ha så många insatser som vi vill, men det kan ofta leda till långsam träning (ju mer ingångar du har desto mer tid tar stödmekanismen att extrahera mönster). Du vill också välja inmatningsvärden som tenderar att vara relativt konsekventa över alla schnicks. Exempelvis skulle djurets höjd eller vikt vara ett bra exempel på en insats eftersom du förväntar dig att detta skulle vara relativt konsekvent över alla schnicks. Däremot skulle en genomsnittlig ålder för ett djur vara ett dåligt val av inmatning eftersom du förväntar dig att åldern för identifierade djur skulle variera mycket. Därför valdes följande ingångar: Höjd Vikt Antalet ben Antal ögon Djursens längd Djurens genomsnittliga hastighet Djuren hos djuren parar samtal Med de ingångar som valts kan vi börja kompilera våra träningsdata . Effektiva träningsdata för en stödvektormaskin måste uppfylla vissa krav: Datan måste ha exempel på djur som är schnicks Dataen måste ha exempel på djur som inte är schnicks I det här fallet har vi forskargrupper av forskare som framgångsrikt har identifierat en schnick och listade sina fastigheter. Därför kan vi läsa dessa forskningshandlingar och extrahera data under var och en av ingångarna och allokera en utmatning av antingen sann eller falsk för var och en av exemplen. Träningsdata i det här fallet kan likna tabellen nedan. Tabell 1. Exempel tabell över schnick observationer När vi har samlat in data för alla våra träningsingångar och utgångar, kan vi använda den för att träna vår supportvektormaskin. Under träningsprocessen skapar stödvektorns maskin en modell i sju dimensionellt utrymme som kan användas för att sortera var och en av träningsexemplen till antingen true eller false. Stödvektormaskinen fortsätter att göra detta tills den har en modell som exakt representerar träningsdata (inom den angivna feltoleransen). När träningen är klar kan den här modellen användas för att klassificera nya datapunkter som antingen sant eller falskt. Fungerar Support Vector Machine faktiskt med Schnick-scenariot, har jag skrivit ett manus som testar hur bra en stödvektormaskin faktiskt kan identifiera nya schnicks. För att göra detta har jag använt biblioteket för supportvektorns maskinlärarverktyg som kan laddas ner från marknaden. För att modellera detta scenario effektivt måste vi först bestämma vilka Schnicks egentliga egenskaper är. De egenskaper som jag antagit i detta fall har listats i tabellen nedan. Om ett djur uppfyller alla kriterierna nedan är det en Schnick. Tabell 2. Sammanfattning av parametrar som definierar en schnick Nu när vi har definierat vår Schnick kan vi använda den här definitionen för att experimentera med stödvektormaskiner. Det första steget är att skapa en funktion som kan ta de sju ingångarna till ett visst djur och återge den egentliga klassificeringen av djuret som en schnick eller inte. Denna funktion kommer att användas för att generera träningsdata för stödvektorns maskin samt utvärdera prestanda av den vid slutet. Detta kan göras med hjälp av funktionen nedan. Nästa steg i processen är att skapa en funktion som kan generera träningsingångarna och utgångarna. Ingångar i detta fall kommer att genereras genom att skapa slumptal inom ett angivet intervall för var och en av de sju inmatningsvärdena. Då för varje uppsättning av slumpmässiga ingångar som genereras kommer isItASchnick () - funktionen ovan att användas för att generera motsvarande önskade utgång. Detta görs i funktionen nedan: Vi har nu en uppsättning träningsingångar och - utgångar, det är dags att skapa våra supportvektormaskiner med hjälp av stödvektorns maskinverktyg som finns på marknaden. När en ny supportvektormaskin har skapats är det nödvändigt att skicka träningsingångarna och utgångarna till den och genomföra träningen. Vi har nu en stödvektormaskin som har blivit framgångsrikt utbildad för att identifiera Scnhicks. För att verifiera detta kan vi testa den slutliga supportvektorns maskin genom att be den att klassificera nya datapunkter. Detta görs genom att först generera slumpmässiga ingångar, och sedan använda funktionen isItASchnick () för att bestämma om dessa ingångar motsvarar en faktisk Schnick, använd sedan stödvektormaskinen för att klassificera ingångarna och bestämma om det förväntade resultatet matchar det aktuella resultatet. Detta görs i funktionen nedan: Jag rekommenderar att du spelar med värdena inom ovanstående funktioner för att se hur stödvektormaskinen utför under olika förhållanden. Varför är Support Vector Machine så användbar Fördelen med att använda en supportvektormaskin för att extrahera komplext mönster från data är att det inte är nödvändigt att förstå uppförandet av data. En stödvektormaskin kan analysera data och extrahera dess enda insikter och relationer. På så sätt fungerar det som en svart låda som mottar en ingång och genererar en utgång som kan visa sig vara mycket användbar för att hitta mönster i data som är för komplexa och inte uppenbara. En av de bästa egenskaperna hos supportvektorer är att de kan hantera fel och buller i data mycket bra. De kan ofta se det underliggande mönstret inom data och filtrera bort datautjämnare och andra komplexiteter. Tänk på följande scenario, när du utför din forskning på Schnicks, kommer du över flera forskningspapper som beskriver Schnicks med massivt olika egenskaper (som en sknick som är 200kg och är 15000mm lång). Fel som detta kan leda till snedvridningar din modell av vad en Schnick är, vilket kan leda till att du gör ett fel när du klassificerar nya Schnick-upptäckter. Fördelen med stödvektorn är att den kommer att utveckla en modell som överensstämmer med det underliggande mönstret mot en modell som passar alla träningsdatapunkter. Detta görs genom att tillåta en viss felnivå i modellen för att möjliggöra för stödvektormaskinen att förbise eventuella fel i data. I fallet med Schnick-stödvektormaskinen, om vi tillåter en feltolerans på 5, försöker träningen bara att utveckla en modell som överensstämmer med 95 av träningsdata. Detta kan vara användbart eftersom det tillåter träning att ignorera den lilla procenten av utjämnare. Vi kan undersöka denna egenskap hos supportvektormaskinen ytterligare genom att ändra vårt Schnick-skript. Funktionen nedan har lagts till för att introducera avsiktliga slumpmässiga fel i vår träningsdatasats. Denna funktion väljer slumpmässigt träningspunkter och ersätter ingångarna och motsvarande utgång med slumpmässiga variabler. Med den här funktionen kan vi introducera avsiktliga fel i vår träningsdata. Med hjälp av denna felfyllda data kan vi skapa och träna en ny stödvektormaskin och jämföra dess prestanda med den ursprungliga. När skriptet körs, producerar det följande resultat i expertloggen. Inom en träningsdatasats med 5000 träningsplatser kunde vi introducera 500 slumpmässiga fel. När man jämföra prestanda för den här felfyllda supportvektorn med den ursprungliga, reduceras prestandan endast med lt1. Detta beror på att stödvektorns maskin har möjlighet att förbise outliersna i datamängden vid träning och fortfarande kan producera en imponerande exakt modell av de sanna data. Detta tyder på att stödvektormaskiner kan vara ett mer användbart verktyg för att extrahera komplexa mönster och insikter från bullriga dataset. Figur 5. Den resulterande expertloggen efter körningen av Schnick-skriptet i MetaTrader 5. Demoversioner En fullständig version av ovanstående kod kan hämtas från Code Base, men det här skriptet kan bara köras i din terminal om du har köpt en full version av Support Vector Machine Learning-verktyget från marknaden. Om du bara har en demoversion av det här verktyget hämtat, kommer du att vara begränsad till att använda verktyget via strategitestaren. För att tillåta testning av Schnick-koden med hjälp av demoversionen av verktyget har jag omskrivit en kopia av manuset till en expertrådgivare som kan distribueras med hjälp av strategitestaren. Båda dessa kodversioner kan laddas ned genom att följa länkarna nedan: Full Version - Använda ett skript som används i MetaTrader 5-terminalen (kräver en inköpt version av Support Vector Machine Learning Tool) Demoversion - Använd en expertrådgivare som är distribueras i MetaTrader 5-strategistestaren (kräver endast en demoversion av stödvektorns maskinverktyg). Hur kan stödjande vektormaskiner användas på marknaden? Det är ganska enkelt, men Schnick-exemplet diskuteras ovan, men det finns ganska många likheter som kan dras mellan detta exempel och med hjälp av stödvektormaskinerna för teknisk marknadsanalys. Teknisk analys handlar i grunden om att använda historiska marknadsdata för att förutsäga framtida prisrörelser. På samma sätt inom schnick-exemplet brukade vi använda observationerna från tidigare forskare för att förutse om ett nytt djur är en sknick eller inte. Dessutom är marknaden plågad av buller, fel och statistiska utjämnare som gör användningen av en stödvektormaskin ett intressant koncept. Grunden för ett betydande antal tekniskt analysmetoder är att följa följande steg: Övervaka flera indikatorer Identifiera vilka villkor för varje indikator som hör samman med en potentiellt framgångsrik handel Se varje indikator och bedöma när alla (eller de flesta) signalerar en handel Det är möjligt att anta ett liknande tillvägagångssätt för att använda stödvektormaskiner för att signalera nya affärer på ett liknande sätt. Supportverktygsmaskinens lärande verktyg utvecklades med detta i åtanke. En fullständig beskrivning av hur man använder det här verktyget finns på marknaden, så jag kommer bara att ge en snabb översikt. Processen för att använda det här verktyget är enligt följande: Figur 6. Blockdiagrammet som visar processen för implementering av stödvektorns maskinverktyg i en expertråd Innan du kan använda verktyget för stödvektor för vektorvektor är det viktigt att först förstå hur träningen ingångar och utgångar genereras. Hur genereras träningsinmatningar Så, de indikatorer som du vill använda som ingångar har redan initierats liksom din nya supportvektormaskin. Nästa steg är att överföra indikatorhandtagen till din nya supportvektormaskin och instruera den om hur du genererar träningsdata. Detta görs genom att ringa funktionen setIndicatorHandles (). Med den här funktionen kan du skicka handtag av initialiserade indikatorer till stödvektorns maskin. Detta görs genom att passera och heltal array som innehåller handtagen. De två andra ingångarna för denna funktion är offsetvärdet och antalet datapunkter. Förskjutningsvärdet anger offset mellan den aktuella fältet och startfältet som ska användas för att generera träningsingångarna och antalet träningspunkter (betecknas med N) anger storleken på dina träningsdata. Diagrammet nedan illustrerar hur man använder dessa värden. Ett förskjutningsvärde på 4 och ett N-värde av 6 kommer att berätta stödvektormaskinen att bara använda staplarna som fångas i den vita rutan för att generera träningsingångar och utgångar. På liknande sätt kommer ett förskjutningsvärde på 8 och ett N-värde av 8 att berätta stödvektomaskinen att endast använda staplarna som fångas i den blå rutan för att generera träningsingångar och utgångar. När funktionen setIndicatorHandles () har ringts kan man ringa genInputs () - funktionen. Denna funktion kommer att använda indikatorhanteringarna för att generera en rad inmatningsdata som ska användas för träning. Figur 7. Lysdiagram som illustrerar värdena för Offset och N Hur genereras träningsutgångar Utbildningsutgångar genereras genom att simulera hypotetiska handlar baserat på historisk prisdata och bestämma om en sådan handel skulle ha varit framgångsrik eller misslyckad. För att göra detta finns det några parametrar som används för att instruera stödvektorns maskinverktygsverktyg hur man bedömer en hypotetisk handel som antingen framgångsrik eller misslyckad. Den första variabeln är OPTRADE. Värdet av detta kan antingen vara KÖP eller SÄLJ och motsvarar antingen hypotetisk köp eller sälja affärer. Om värdet av detta är KÖP, då när man genererar utgångarna kommer det bara att se på den potentiella framgången hos hypotetiska köpbranscher. Alternativt, om värdet av detta är SÄLJ, då när det genereras utdata ser det bara ut om den potentiella framgången med hypotetiska försäljningsaffärer. Nästa värden som används är stoppförlusten och vinsten för dessa hypotetiska affärer. Värdena är inställda i pips och kommer att ställa in stopp - och gränsvärden för var och en av de hypotetiska handlarna. Den sista parametern är handelsvaraktigheten. Denna variabel mäts i timmar och kommer att säkerställa att endast affärer som är färdiga inom denna maximala varaktighet anses vara framgångsrika. Anledningen till att denna variabel ingår är att undvika supportvektormaskinens signaleringsverksamhet i en långsiktig rörlig sidoprodukt. Överväganden att göra när du väljer inmatningar Det är viktigt att lägga in en viss tanke i inmatningsvalet när du implementerar stödvektorgaskiner i din handel. Liknande Schnick-exemplet är det viktigt att välja en ingång som förväntas ha liknande överviktsincidenser. Du kan till exempel frestas att använda ett glidande medelvärde som en inmatning, men eftersom det långsiktiga genomsnittspriset tenderar att förändras ganska dramatiskt över tid, är det kanske inte ett glidande medelvärde som är den bästa insatsen att använda. Detta beror på att det inte finns någon signifikant likhet mellan det glidande medelvärdet idag och de glidande medelvärdena för sex månader sedan. Antag att vi handlar EURUSD och använder en stödvektormaskin med ett glidande medelvärde för insignal till signalhandel. Säg att det aktuella priset är 1,10, men det genererar träningsdata från sex månader sedan när priset var 0,55. När du tränar stödvektormaskinen, kan mönstret det bara leder till att en handel signaleras när priset är cirka 0,55, eftersom det här är den enda data den vet. Därför kan din support vektor maskin aldrig signalera en handel tills priset sjunker tillbaka till 0,55. Istället kan en bättre inmatning för användning för stödvektorns maskin vara en MACD eller en liknande oscillator eftersom MACD-värdet är oberoende av den genomsnittliga prisnivån och endast signalerar relativ rörelse. Jag rekommenderar att du experimenterar med detta för att se vad som ger bästa resultat för dig. En annan övervägning att göra vid val av ingångar är att säkerställa att stödvektorns maskin har en tillräcklig ögonblicksbild av en indikator för att signalera en ny handel. Du kan i din egen affärserfarenhet finna att en MACD endast är användbar när du har de senaste fem staplarna att titta på, eftersom detta kommer att visa en trend. En enda stång i MACD kan vara värdelös isolerad om du inte kan berätta om den går upp eller ner. Därför kan det vara nödvändigt att skicka de senaste streckarna i MACD-indikatorn till stödvektorns maskin. Det finns två möjliga sätt att göra detta: Du kan skapa en ny anpassad indikator som använder de senaste fem staplarna i MACD-indikatorn till beräkna en trend som ett enda värde. Den här anpassade indikatorn kan sedan överföras till stödvektormaskinen som en enda ingång, eller du kan använda de fem föregående fem staplarna i MACD-indikatorn i stödvektorns maskin som fem separata ingångar. Sättet att göra detta är att initiera fem olika instanser av MACD-indikatorn. Var och en av indikatorerna kan initieras med en annan förskjutning från den aktuella fältet. Sedan kan de fem handtagen från de separata indikatorerna överföras till stödvektomaskinen. Det bör noteras att alternativ 2 tenderar att leda till längre exekveringstider för din expertrådgivare. Ju fler insatser du har desto längre tid tar det att träna. Implementera supportvektorer i och expertrådgivare Jag har utarbetat en expertrådgivare som är ett exempel på hur någon potentiellt kan använda supportvektorer i sin egen handel (en kopia av detta kan laddas ner genom att följa den här länken mql5encode1229). Förhoppningsvis kan expertrådgivaren låta dig experimentera lite med stödvektorer. Jag rekommenderar att du copychangemodify Expert Advisor för att passa din egen handelsstil. EA fungerar som följer: Två nya stödvektormaskiner skapas med hjälp av biblioteket svMachineTool. En är inrättad för att signalera nya köpförbindelser och den andra är inrättad för att signalera nya Säljaffärer. Sju standardindikatorer initialiseras med var och en av sina handtag som är lagrade till ett heltal (Obs! En kombination av indikatorer kan användas som ingångar, de behöver bara skickas till SVM i ett enda heltal). Mängden indikatorhanteringar skickas till de nya stödvektormaskinerna. Med hjälp av en uppsättning indikatorhandtag och andra parametrar används historisk prisdata för att generera korrekta inmatningar och utgångar som ska användas för att träna stödvektorns maskiner. När alla insignaler och utgångar har genererats utbildas båda stödvektormaskinerna. De utbildade supportvektormaskinerna används i EA för att signalera nya köp och säljaffärer. När en ny köp eller sälja handel signaleras öppnas handeln med manuella Stop Loss och Take Profit-order. Initialiseringen och träningen av stödvektormaskinen exekveras inom funktionen onInit (). För din referens har detta segment av svTrader EA inkluderats nedan med anteckningar. Avancerad Support Vector Machine Trading Ytterligare kapacitet inbyggdes i stödverktygsmaskinens inlärningsverktyg för de mer avancerade användarna där ute. Verktyget gör det möjligt för användarna att skicka in egna anpassade inmatningsdata och utgångsdata (som i Schnick-exemplet). Detta gör det möjligt för dig att skräddarsy dina egna kriterier för att stödja vektorinmatningsingångar och - utgångar och manuellt passera i dessa data för att träna den. Detta öppnar möjligheten att använda supportvektorer i någon aspekt av din handel. Det är inte bara möjligt att använda stödvektormaskiner för att signalera nya affärer, men det kan också användas för att signalera stängning av affärer, penninghantering, nya avancerade indikatorer etc. För att du inte ska få fel är det viktigt att förstå hur Dessa ingångar och utgångar ska struktureras. Ingångar: Inmatningar skickas till SVM som en 1-dimensionell uppsättning dubbelvärden. Observera att alla inmatningar du skapar måste skickas in som ett dubbelvärde. Boolean, heltal etc. måste alla omvandlas till ett dubbelvärde innan de skickas in i stödvektorns maskin. Inmatningarna krävs i följande formulär. Antag exempelvis att vi passerar inmatningar med 3 ingångar x 5 träningspunkter. För att uppnå detta måste vår dubbla array vara 15 enheter långa i formatet: A 1 B 1 C 1 A 2 B 2 C 2 A 3 B 3 C 3 A 4 B 4 C 4 A 5 B 5 C 5 Det är också nödvändigt att passera i ett värde för antalet ingångar. I fallet NInputs3. Utgångar: utgångar skickas in som en rad booleska värden. Dessa booleska värden är den önskade utsignalen från SVM motsvarade var och en av uppsättningarna av ingångar som passerat. Följ ovanstående exempel, säg att vi har 5 träningspunkter. I detta scenario kommer vi att passera i en booleskt array av utgångsvärden som är 5 enheter långa. När du skapar egna ingångar och utgångar, se till att längden på dina arrayer matchar de värden du skickar in. Om de inte matchar kommer ett fel att genereras som meddelar dig om skillnaden. Om vi till exempel har passerat NInputs3 och ingångar är en uppsättning med längd 16, kommer ett fel att kastas (eftersom ett ninputs-värde av 3 betyder att längden på vilken ingångsserie som helst måste behöva vara en multipel av 3) . På samma sätt, se till att antalet uppsättningar av ingångar och antalet utdata som du skickar in är lika. Återigen, om du har NInputs3, längden på ingångarna på 15 och en längd av utgångar på 6, kommer ett annat fel att kastas (eftersom du har 5 uppsättningar av ingångar och 6 utgångar). Försök att se till att du har tillräckligt med variation i träningsutgångarna. Om du till exempel skickar in 100 träningspoäng, vilket betyder en utmatningsgrupp med längd 100 och alla värden är falska med endast en sant, är skillnaden mellan det sanna fallet och det falska fallet inte tillräckligt tillräckligt. Detta kommer att tendera att leda till SVM-träningen mycket snabbt, men den slutliga lösningen är väldigt dålig. En mer mångsidig träningsuppsättning leder ofta till en mer affektiv SVM. Trading med Support Vector Machines (SVM). Slutligen har alla stjärnor anpassats och jag kan med säkerhet ägna lite tid för backtestning av nya handelssystem och Support Vector Machines (SVM). ) är den nya 8220toy8221 som kommer att hålla mig upptagen en stund. SVMs är ett välkänt verktyg från området övervakat maskinlärande. och de används både för klassificering och regression. Mer information finns i litteraturen. Jag tycker att den mest intuitiva ansökan om handel är regression, så let8217s börjar med att bygga en SVM-regressionsmodell. Efter vår erfarenhet av ARMAGARCH-modeller börjar vi försöka prognostisera avkastning, i stället för priser. På samma sätt, i våra första tester, kommer vi bara att använda avkastningen under de senaste 5 dagarna som funktioner som bestämmer avkastningen för en viss dag. Vi börjar med 500-dagars historia som träningsuppsättning. I mer matematiska termer har vi N-funktioner för träningsuppsättningen, för var och en av dem har vi M-prov. Vi har också M-svar. Med en rad av funktionsvärden utbildas den vänstra matrisen, SVM, för att producera responsvärdet. I vårt specifika exempel har vi fem kolumner (funktioner), varje kolumn motsvarar avkastningen med en annan lagring (från 1 till 5). Vi har 500 prov och motsvarande svar. När SVM är utbildad på den här uppsättningen kan vi börja mata den med uppsättningar av fem funktioner som motsvarar avkastningen för de fem föregående dagarna, och SVM ger oss svaret, vilket är den prognostiserade avkastningen. Till exempel, efter att ha utbildat SVM under de föregående 500 dagarna, kommer vi att använda avkastningen för dagarna 500, 499, 498, 497 och 496 (dessa är våra som ingång för att få den prognostiserade avkastningen för dag 501. Från alla tillgängliga paket I R bestämde jag mig för att välja e1071-paketet. Ett nära andrahandsval var kärnlabpaketet, som jag fortfarande planerar att försöka i framtiden. Sedan försökte jag några strategier. Först försökte jag något som mycket liknar ARMAGARCH-metoden 8211 fördröjda avkastningar från de fem föregående dagarna. Jag blev ganska förvånad över att se att denna strategi fungerar bättre än ARMAGARCH (det här är ARMAGARCHs hemland och jag skulle ha varit ganska glad bara med jämförbar prestation). Nästa försökte jag att samma fem funktioner, men försökte välja den bästa delmängden. Urvalet gjordes med ett girigt tillvägagångssätt, som började med 0-funktioner och interaktivt lägger till funktionen som minimerar felet bäst. Detta tillvägagångssätt förbättrade sakerna ytterligare. Till sist försökte jag en annan approac h med ungefär ett dussin funktioner. Funktionerna inkluderade avkastning under olika tidsperioder (1 dag, 2-dag, 5-dagars, etc), viss statistik (medelvärde, s. media, sd, etc) och volym. Jag använde samma giriga inställning för att välja funktioner. Det här sista systemet visade också en mycket bra prestation, men det tog en hel del tid att springa. Tiden för att avsluta det här inlägget måste resultaten av back-testen vänta. Fram till dess kan du spela med hela källkoden själv. Här är ett exempel på att använda det: Hej I Windows fungerar inte82 på grund av multicore-problem. En sak som jag inte förstår, återspeglas här i raderna av koden rets rättsindex (data) data dataindex (rets) Enligt min mening är it8217s effektivare att slå samman serier smth som mydtret lt-na. exclude (merge (rets, data) och att ha bara ett argumentobjekt att fungera ringa istället för 2 Intressant arbete, tack Mike Argh, Windows 8211 Jag använder det sällan nyligen. Det är ganska förvånat, eftersom parallellpaketet är en del av bas R-distributionen nu. Förhoppningsvis kommer det att behandlas snart Under tiden, vad sägs om att inte använda parallellkörning. Det finns också andra paket som ger parallell körning, men det skulle vara mer arbete. Du har rätt om sammanfogningen 8211 Jag undrar fortfarande varför jag gjorde det här den här gången. :) I8217m tar emot fel. Nu är felet gt data svmFeatures (tt), c (1,2) Fel i match. fun (FUN). objekt 8216skewness8217 inte hittat Men när jag gör ett manuellt dataobjekt får jag fel i prediktionen svmComputeOneForecast lt - funktion relaterad till dimensioner och samplingquotcrossquot It039s svårt för mig att felsöka sked kommer från PerformanceAnalytics-paketet, som du behöver installera från CRAN. Lägga till krav (PerformanceAnalytics) som första linjen i svmFeatures bör ta itu med det första problemet. nu är fel fel i merge. xts (res, xts (na. trim (lag (rollmean (rets, k 21, justera 8220right8221). längd 8216dimnames8217 2 inte lika med arrayutsträckning det verkar som om i Windows-kod behöver många ändringar Mike, I never meant the code to be used directly (until now I was providing only snippets), but I am surprised that R on Windows is so ugly. Not sure what8217s your goal, but to analyze the strategies performance, you can use the indicator series which are already computed. It8217s just pure academic interest on SVM. I used to work with clusters, PCA and I am curious how SVM is doing the same work. In windows a lot of error are related to objects with dates as xts is or data frames. UNIX is better but all brokers give API for windows. Some of them in Java and only this we may use from UNIX. I don8217t like win architecture but it8217s a habit already and I don8217t have time to change OS. I just tried it on windows 7, 64 bit, R version 2.15.2. I get a warning from svmFeatures, which I know how to fix (calling sd on an xtszoo object does interesting conversion to a matrix), but no problems. Running: Thanks I8217ll try. One question if you don8217t mind Why are you using get with function cetSymbols from quantmod package I use call vers Example SPY lt - getSymbols(039SPY039, auto. assign FALSE) You have a lot to compute and get consume memory and takes time to obtain objects name as a string var The same error I8217m using R 2.15.1 But I8217m surprised with this result before call gt head(data) 1 function (8230, list character(), package NULL, lib. loc NULL, 2 verbose getOption(8220verbose8221), envir. GlobalEnv) 3 4 fileExt lt - function(x) 5 db lt - grepl(quot...(gzbz2xz)quot, x) 6 ans lt - sub(quot..quot, quotquot, x) It seems that data is reserved word And now I don039t know what is going to features functionTrading with Support Vector Machines (SVM) Finally all the stars have aligned and I can confidently devote some time for back-testing of new trading systems, and Support Vector Machines (SVM) are the new 8220toy8221 which is going to keep me busy for a while. SVMs are a well-known tool from the area of supervised Machine Learning. and they are used both for classification and regression. For more details refer to the literature. It seems to me that the most intuitive application for trading is regression, so let8217s start by building an SVM regression model. Following our experience with ARMAGARCH models, we will start by trying to forecast returns, instead of prices. Likewise, in our first tests, we will use only the returns of the previous 5 days as the features determining the return of a particular day. We will start with history of 500 days as the training set. In more mathematical terms, for the training set we have N features, for each of them we have M samples. We also have M responses. Given a row of feature values, the left matrix, the SVM is trained to produce the response value. In our specific example, we have five columns (features), each column corresponding to the returns with a different lag (from 1 to 5). We have 500 samples and the corresponding responses. Once the SVM is trained on this set, we can start feeding it with sets of five features, corresponding to the returns for the five previous days, and the SVM will provide us with the response, which is the forecasted return. For example, after training the SVM on the previous 500 days, we will use the returns for days 500, 499, 498, 497 and 496 (these are ours as the input to obtain the forecasted return for day 501. From all the packages available in R, I decided to choose the e1071 package. A close second choice was the kernlab package, which I am still planning to try in the future. Then I tried a few strategies. First I tried something very similar to the ARMAGARCH approach 8211 the lagged returns from the five previous days. I was quite surprised to see this strategy performing better than the ARMAGARCH (this is the home land of the ARMAGARCH and I would have been quite happy just with comparable performance) Next, I tried to the same five features, but trying to select the best subset. The selection was done using a greedy approach, starting with 0 features, and interactively adding the feature which minimizes the error best. This approach improved things further. Finally, I tried a different approac h with about a dozen features. The features included returns over different period of time (1-day, 2-day, 5-day, etc), some statistics (mean, median, sd, etc) and volume. I used the same greedy approach to select features. This final system showed a very good performance as well, but it took a hell of a time to run. Time to end this post, the back-testing results have to wait. Until then you can play with the full source code yourself. Here is an example of using it: Never miss an update Subscribe to R-bloggers to receive e-mails with the latest R posts. (You will not see this message again.)Support Vector Machines: A Guide for Beginners In this guide I want to introduce you to an extremely powerful machine learning technique known as the Support Vector Machine (SVM). It is one of the best out of the box supervised classification techniques. As such, it is an important tool for both the quantitative trading researcher and data scientist. I feel it is important for a quant researcher or data scientist to be comfortable with both the theoretical aspects and practical usage of the techniques in their toolkit. Hence this article will form the first part in a series of articles that discuss support vector machines. This article specifically will cover the theory of maximal margin classifiers . support vector classifiers and support vector machines . Subsequent articles will make use of the Python scikit-learn library to demonstrate some examples of the aforementioned theoretical techniques on actual data. Motivation for Support Vector Machines The problem to be solved in this article is one of supervised binary classification . That is, we wish to categorise new unseen objects into two separate groups based on their properties and a set of known examples, which are already categorised. A good example of such a system is classifying a set of new documents into positive or negative sentiment groups, based on other documents which have already been classified as positive or negative. Similarly, we could classify new emails into spam or non-spam, based on a large corpus of documents that have already been marked as spam or non-spam by humans. SVMs are highly applicable to such situations. A Support Vector Machine models the situation by creating a feature space . which is a finite-dimensional vector space. each dimension of which represents a feature of a particular object. In the context of spam or document classification, each feature is the prevalence or importance of a particular word. The goal of the SVM is to train a model that assigns new unseen objects into a particular category. It achieves this by creating a linear partition of the feature space into two categories. Based on the features in the new unseen objects (e. g. documentsemails), it places an object above or below the separation plane, leading to a categorisation (e. g. spam or non-spam). This makes it an example of a non-probabilistic linear classifier. It is non-probabilistic, because the features in the new objects fully determine its location in feature space and there is no stochastic element involved. However, much of the benefit of SVMs comes from the fact that they are not restricted to being linear classifiers. Utilising a technique known as the kernel trick they can become much more flexible by introducing various types of non-linear decision boundaries. Formally, in mathematical language, SVMs construct linear separating hyperplanes in high-dimensional vector spaces. Data points are viewed as (vec , y) tuples, vec (x1, ldots, xp) where the xj are the feature values and y is the classification (usually given as 1 or -1). Optimal classification occurs when such hyperplanes provide maximal distance to the nearest training data points. Intuitively, this makes sense, as if the points are well separated, the classification between two groups is much clearer. However, if in a feature space some of the sets are not linearly separable (i. e. they overlap), then it is necessary to perform a mapping of the original feature space to a higher-dimensional space, in which the separation between the groups is clear, or at least clearer. However, this has the consequence of making the separation boundary in the original space potentially non-linear. In this article we will proceed by considering the advantages and disadvantages of SVMs as a classification technique, then defining the concept of an optimal linear separating hyperplane . which motivates a simple type of linear classifier known as a maximal margin classifier (MMC). We will then show that maximal margin classifiers are not often applicable to many real world situations and as such need modification, in the form of a support vector classifier (SVC). We will then relax the restriction of linearity and consider non-linear classifiers, namely support vector machines . which use kernel functions to improve computational efficiency. Advantages and Disadvantages of SVMs As a classification technique, the SVM has many advantages, many of which are due to its computational efficiency on large datasets. The Scikit-Learn team have summarised the main advantages and disadvantages here but I have repeated and elaborated on them for completeness: Advantages High-Dimensionality - The SVM is an effective tool in high-dimensional spaces, which is particularly applicable to document classification and sentiment analysis where the dimensionality can be extremely large (geq 106). Memory Efficiency - Since only a subset of the training points are used in the actual decision process of assigning new members, only these points need to be stored in memory (and calculated upon) when making decisions. Versatility - Class separation is often highly non-linear. The ability to apply new kernels allows substantial flexibility for the decision boundaries, leading to greater classification performance. Disadvantages p gt n - In situations where the number of features for each object (p) exceeds the number of training data samples (n), SVMs can perform poorly. This can be seen intuitively, as if the high-dimensional feature space is much larger than the samples, then there are less effective support vectors on which to support the optimal linear hyperplanes, leading to poorer classification performance as new unseen samples are added. Non-Probabilistic - Since the classifier works by placing objects above and below a classifying hyperplane, there is no direct probabilistic interpretation for group membership. However, one potential metric to determine effectiveness of the classification is how far from the decision boundary the new point is. Now that weve outlined the advantages and disadvantages, were going to discuss the geometric objects and mathematical entities that will ultimately allow us to define the SVMs and how they work. There are some fantastic references (both links and textbooks) that derive much of the mathematical detail of how SVMs work. In the following derivation I didnt want to reinvent the wheel too much, especially with regards notation and pedagogy, so Ive formulated the following treatment based on the references provided at the end of the article, making strong use of James et al (2013). Hastie et al (2009) and the Wikibooks article on SVMs. I have made changes to the notation where appropriate and have adjusted the narrative to suit individuals interested in quantitative finance. Linear Separating Hyperplanes The linear separating hyperplane is the key geometric entity that is at the heart of the SVM. Informally, if we have a high-dimensional feature space, then the linear hyperplane is an object one dimension lower than this space that divides the feature space into two regions. This linear separating plane need not pass through the origin of our feature space, i. e. it does not need to include the zero vector as an entity within the plane. Such hyperplanes are known as affine . If we consider a real-valued p-dimensional feature space, known mathematically as mathbb p, then our linear separating hyperplane is an affine p-1 dimensional space embedded within it. For the case of p2 this hyperplane is simply a one-dimensional straight line, which lives in the larger two-dimensional plane, whereas for p3 the hyerplane is a two-dimensional plane that lives in the larger three-dimensional feature space (see Fig 1 and Fig 2): If we consider an element of our p-dimensional feature space, i. e. vec (x1. xp) in mathbb p, then we can mathematically define an affine hyperplane by the following equation: begin b0 b1 x1 . bp xp 0 end b0 neq 0 gives us an affine plane (i. e. it does not pass through the origin). We can use a more succinct notation for this equation by introducing the summation sign: Notice however that this is nothing more than a multi-dimensional dot product (or, more generally, an inner product ), and as such can be written even more succinctly as: If an element vec in mathbb p satisfies this relation then it lives on the p-1-dimensional hyperplane. This hyperplane splits the p-dimensional feature space into two classification regions (see Fig 3): Elements vec above the plane satisfy: While those below it satisfy: The key point here is that it is possible for us to determine which side of the plane any element vec will fall on by calculating the sign of the expression vec cdot vec b0. This concept will form the basis of a supervised classification technique. Classification Continuing with our example of email spam filtering, we can think of our classification problem (say) as being provided with a thousand emails (n1000), each of which is marked spam (1) or non-spam (-1). In addition, each email has an associated set of keywords (i. e. separating the words on spacing) that provide features . Hence if we take the set of all possible keywords from all of the emails (and remove duplicates), we will be left with p keywords in total. If we translate this into a mathematical problem, the standard setup for a supervised classification procedure is to consider a set of n training observations . vec i, each of which is a p-dimensional vector of features. Each training observation has an associated class label . yi in . Hence we can think of n pairs of training observations (vec i, yi) representing the features and class labels (keyword lists and spamnon-spam). In addition to the training observations we can provide test observations . vec (x 1. x p) that are later used to test the performance of the classifiers. In our spam example, these test observations would be new emails that have not yet been seen. Our goal is to develop a classifier based on provided training observations that will correctly classify subsequent test observations using only their feature values. This translates into being able to classify an email as spam or non-spam solely based on the keywords contained within it. We will initially suppose that it is possible, via a means yet to be determined, to construct a hyperplane that separates training data perfectly according to their class labels (see Figs 4 and 5). This would mean cleanly separating spam emails from non-spam emails solely by using specific keywords. The following diagram is only showing p2, while for keyword lists we may have pgt106. Hence Figs 4 and 5 are only representative of the problem. This translates into a mathematical separating property of: begin vec cdot vec i b0 gt 0,enspacetext enspace yi 1 end begin vec cdot vec i b0 lt 0,enspacetext enspace yi -1 end This basically states that if each training observation is above or below the separating hyperplane, according to the geometric equation which defines the plane, then its associated class label will be 1 or -1. Thus we have developed a simple classification process. We assign a test observation to a class depending upon which side of the hyperplane it is located on. This can be formalised by considering the following function f(vec ), with a test observation vec (x 1. x p): If f(vec ) gt 0 then y 1, whereas if f(vec ) lt 0 then y -1. However, this tells us nothing about how we go about finding the bj components of vec , as well as b0, which are crucial in helping us determine the equation of the hyperplane separating the two regions. The next section discusses an approach for carrying this out, as well as introducing the concept of the maximal margin hyperplane and a classifier built on it, known as the maximal margin classifier . Deriving the Classifier At this stage it is worth pointing out that separating hyperplanes are not unique, since it is possible to slightly translate or rotate such a plane without touching any training observations (see Fig 4). So, not only do we need to know how to construct such a plane, but we also need to determine the most optimal . This motivates the concept of the maximal margin hyperplane (MMH), which is the separating hyperplane that is farthest from any training observations, and is thus optimal. How do we find the maximal margin hyperplane Firstly, we compute the perpendicular distance from each training observation vec i for a given separating hyperplane. The smallest perpendicular distance to a training observation from the hyperplane is known as the margin . The MMH is the separating hyperplane where the margin is the largest. This guarantees that it is the farthest minimum distance to a training observation. The classification procedure is then just simply a case of determining which side a test observation falls on. This can be carried out using the above formula for f(vec ). Such a classifier is known as a maximimal margin classifier (MMC). Note however that finding the particular values that lead to the MMH is purely based on the training observations . That is, we still need to be aware of how the MMC performs on the test observations . We are implicitly making the assumption that a large margin in the training observations will provide a large margin on the test observations, but this may not be the case. As always, we must be careful to avoid overfitting when the number of feature dimensions is large (e. g. in Natural Language Processing applications such as email spam classification). Overfitting here means that the MMH is a very good fit for the training data but can perform quite poorly when exposed to testing data . I discuss this issue in depth in the article on the bias-variance trade-off . To reiterate, our goal now becomes finding an algorithm that can produce the bj values, which will fix the geometry of the hyperplane and hence allow determination of f(vec ) for any test observation. If we consider Fig 6, we can see that the MMH is the mid-line of the widest block that we can insert between the two classes such that they are perfectly separated. One of the key features of the MMC (and subsequently SVC and SVM) is that the location of the MMH only depends on the support vectors . which are the training observations that lie directly on the margin (but not hyperplane) boundary (see points A, B and C in Fig 6). This means that the location of the MMH is NOT dependent upon any other training observations. Thus it can be immediately seen that a potential drawback of the MMC is that its MMH (and thus its classification performance) can be extremely sensitive to the support vector locations. However, it is also partially this feature that makes the SVM an attractive computational tool, as we only need to store the support vectors in memory once it has been trained (i. e. the bj values are fixed). Constructing the Maximal Margin Classifier I feel it is instructive to fully outline the optimisation problem that needs to be solved in order to create the MMH (and thus the MMC itself). While I will outline the constraints of the optimisation problem, the algorithmic solution to this problem is beyond the scope of the article. Thankfully these optimisation routines are implemented in scikit-learn (actually, via the LIBSVM library ). If you wish to read more about the solution to these algorithmic problems, take a look at Hastie et al (2009) and the Scikit-Learn page on Support Vector Machines . The procedure for determining a maximal margin hyperplane for a maximal margin classifier is as follows. Given n training observations vec 1. vec n in mathbb p and n class labels y1. yn in , the MMH is the solution to the following optimisation procedure: Maximise M in mathbb , by varying b1. bp such that: begin yi left( vec cdot vec b0 right) geq M, quad forall i 1. n end Despite the complex looking constraints, they actually state that each observation must be on the correct side of the hyperplane and at least a distance M from it. Since the goal of the procedure is to maximise M, this is precisely the condition we need to create the MMC Clearly, the case of perfect separability is an ideal one. Most real world datasets will not have such perfect separability via a linear hyperplane (see Fig 7). However, if there is no separability then we are unable to construct a MMC by the optimisation procedure above. So, how do we create a form of separating hyperplane Essentially we have to relax the requirement that a separating hyperplane will perfectly separate every training observation on the correct side of the line (i. e. guarantee that it is associated with its true class label), using what is called a soft margin . This motivates the concept of a support vector classifier (SVC). Support Vector Classifiers As we alluded to above, one of the problems with MMC is that they can be extremely sensitive to the addition of new training observations. Consider Figs 8 and 9. In Fig 8 it can be seen that there exists a MMH perfectly separating the two classes. However, in Fig 9 if we add one point to the 1 class we see that the location of the MMH changes substantially. Hence in this situation the MMH has clearly been over-fit : As we mentioned above also, we could consider a classifier based on a separating hyperplane that doesnt perfectly separate the two classes, but does have a greater robustness to the addition of new invididual observations and has a better classification on most of the training observations. This comes at the expense of some misclassification of a few training observations. This is how a support vector classifier or soft margin classifier works. A SVC allows some observations to be on the incorrect side of the margin (or hyperplane), hence it provides a soft separation. The following figures 10 and 11 demonstrate observations being on the wrong side of the margin and the wrong side of the hyperplane respectively: As before, an observation is classified depending upon which side of the separating hyperplane it lies on, but some points may be misclassified. It is instructive to see how the optimisation procedure differs from that described above for the MMC. We need to introduce new parameters, namely n epsiloni values (known as the slack values ) and a parameter C, known as the budget . We wish to maximise M, across b1. bp, epsilon1. epsilonn such that: begin yi left( vec cdot vec b0 right) geq M (1 - epsiloni), quad forall i 1. n end begin epsiloni geq 0, quad sum epsiloni leq C end Where C, the budget, is a non-negative tuning parameter. M still represents the margin and the slack variables epsiloni allow the individual observations to be on the wrong side of the margin or hyperplane. In essence the epsiloni tell us where the ith observation is located relative to the margin and hyperplane. For epsiloni0 it states that the xi training observation is on the correct side of the margin. For epsiloni0 we have that xi is on the wrong side of the margin, while for epsiloni1 we have that xi is on the wrong side of the hyperplane. C collectively controls how much the individual epsiloni can be modified to violate the margin. C0 implies that epsiloni0, forall i and thus no violation of the margin is possible, in which case (for separable classes) we have the MMC situation. For C0 it means that no more than C observations can violate the hyperplane. As C increases the margin will widen. See Fig 12 and 13 for two differing values of C: How do we choose C in practice Generally this is done via cross-validation. In essence C is the parameter that governs the bias-variance trade-off for the SVC. A small value of C means a low bias, high variance situation. A large value of C means a high bias, low variance situation. As before, to classify a new test observation x we simply calculate the sign of f(vec ) vec cdot vec b0. This is all well and good for classes that are linearly (or nearly linearly) separated. However, what about separation boundaries that are non-linear How do we deal with those situations This is where we can extend the concept of support vector classifiers to support vector machines. Support Vector Machines The motivation behind the extension of a SVC is to allow non-linear decision boundaries. This is the domain of the Support Vector Machine (SVM). Consider the following Figs 14 and 15. In such a situation a purely linear SVC will have extremely poor performance, simply because the data has no clear linear separation: Hence SVCs can be useless in highly non-linear class boundary problems. In order to motivate how an SVM works, we can consider a standard trick in linear regression, when considering non-linear situations. In particular a set of p features x1. xp can be transformed, say, into a set of 2p features x1, x21. xp, x2p. This allows us to apply a linear technique to a set of non-linear features. While the decision boundary is linear in the new 2p-dimensional feature space it is non-linear in the original p-dimensional space. We end up with a decision boundary given by q(vec )0 where q is a quadratic polynomial function of the original features and hence is a non-linear solution. This is clearly not restricted to quadratic polynomials. Higher dimensional polynomials, interaction terms and other functional forms, could all be considered. Although the drawback is that it dramatically increases the dimension of the feature space to the point that some algorithms can become untractable. The major advantage of SVMs is that they allow a non-linear enlargening of the feature space, while still retaining a significant computational efficiency, using a process known as the kernel trick. which will be outlined below shortly. So what are SVMs In essence they are an extension of SVCs that results from enlargening the feature space through the use of functions known as kernels . In order to understand kernels, we need to briefly discuss some aspects of the solution to the SVC optimisation problem outlined above. While calculating the solution to the SVC optimisation problem, the algorithm only needs to make use of inner products between the observations and not the observations themselves. Recall that an inner product is defined for two p-dimensional vectors u, v as: Hence for two observations an inner product is defined as: While we wont dwell on the details (since they are beyond the scope of this article), it is possible to show that a linear support vector classifier for a particular observation vec can be represented as a linear combination of inner products: begin f(vec ) b0 sum alphai langle vec , vec i rangle end With n ai coefficients, one for each of the training observations. To estimate the b0 and ai coefficients we only need to calculate n(n-1)2 inner products between all pairs of training observations. In fact, we ONLY need to calculate the inner products for the subset of training observations that represent the support vectors . I will call this subset mathscr . This means that: begin ai 0 enspace text enspace vec i notin mathscr end This means we can rewrite the representation formula as: This turns out to be a major advantage for computational efficiency. This now motivates the extension to SVMs. If we consider the inner product langle vec i, vec k rangle and replace it with a more general inner product kernel function KK(vec i, vec k), we can modify the SVC representation to use non-linear kernel functions and thus modify how we calculate similarity between two observations. For instance, to recover the SVC we just take K to be as follows: Since this kernel is linear in its features the SVC is known as the linear SVC. We can also consider polynomial kernels, of degree d: This provides a significantly more flexible decision boundary and essentially amounts to fitting a SVC in a higher-dimensional feature space involving d-degree polynomials of the features (see Fig 16). Hence, the definition of a support vector machine is a support vector classifier with a non-linear kernel function. We can also consider the popular radial kernel (see Fig 17): begin K(vec i, vec k) exp left(-gamma sum (x - x )2 right), quad gamma 0 end So how do radial kernels work They are clearly quite different from polynomial kernels. Essentially if our test observation vec is far from a training observation vec i in standard Euclidean distance then the sum sum (x j - x )2 will be large and thus K(vec, vec i) will be very small. Hence this particular training observation vec i will have almost no effect on where the test observation vec is placed, via f(vec ). Thus the radial kernel has extremely localised behaviour and only nearby training observations to vec will have an impact on its class label. While this article has been very theoretical, the next article on document classification using Scikit-Learn makes heavy use of SVMs in Python. Biblographic Notes Originally, SVMs were invented by Vapnik (1996). while the current standard soft margin approach is due to Cortes (1995). My treatment of the material follows, and is strongly influenced by, the excellent statistical machine learning texts of James et al (2013) and Hastie et al (2009) . References Vapnik, V. (1996) The Nature of Statistical Learning Theory Cortes, C. Vapnik, V. (1995) Support Vector Networks, Machine Learning 20 (3): 273 James, G. Witten, D. Hastie, T. Tibshiranie, R. (2013) An Introduction to Statistical Learning Hastie, T. Tibshiranie, R. Friedman, J. (2009) The Elements of Statistical Learning Wikibooks (2016) Support Vector Machines (Link ) Scikit-Learn (2016) Support Vector Machines (Link ) Just Getting Started with Quantitative Trading
No comments:
Post a Comment