Sunday 29 October 2017

Trading Strategi Svm


MetaTrader 5 - Trading Machine Learning: Hvordan Støtte Vector Maskiner kan brukes i Trading Hva er en Support Vector Machine En støtteteknormaskin er en metode for maskinlæring som forsøker å ta inn data og klassifiseres i en av to kategorier. For at en støttevektormaskin skal være effektiv, er det nødvendig å først bruke et sett med treningsinngangs - og utdata for å bygge støttemodulmaskinmodellen som kan brukes til å klassifisere nye data. En støttevektormaskin utvikler denne modellen ved å ta treningsinngangene, kartlegge dem til flerdimensjonalt mellomrom, og deretter bruke regresjon for å finne en hyperplan (en hyperplan er en overflate i n-dimensjonalt rom som adskiller plassen til to halvrom) som skiller seg best de to klassene av innganger. Når støttevektormaskinen har blitt opplært, kan den vurdere nye innganger med hensyn til separerende hyperplanet og klassifisere det til en av de to kategoriene. En støttevektormaskin er i hovedsak en inngangsutgangsmaskin. En bruker er i stand til å legge inn en inngang, og basert på modellen utviklet gjennom trening, vil den returnere en utgang. Antall innganger for en hvilken som helst støttevektormaskin varierer teoretisk fra en til uendelig, men i praksis er datakraft begrenset hvor mange innganger som kan brukes. Hvis for eksempel N-innganger brukes for en bestemt støttevektormaskin (heltalverdien av N-kan-området fra en til uendelig), må støttevektormaskinen kartlegge hvert sett av innganger i det N-dimensjonale rommet og finne en (N-1 ) - dimensjonal hyperplane som best adskiller treningsdataene. Figur 1. Støttevektormaskiner er inputoutputemaskiner Den beste måten å konseptualisere hvordan en støttevektormaskin fungerer, er å vurdere den todimensjonale saken. Anta at vi vil opprette en støttetvektormaskin som har to innganger og returnerer en enkelt utgang som klassifiserer datapunktet som tilhørende en av to kategorier. Vi kan visualisere dette ved å plotte det på et 2-dimensjonalt diagram som for eksempel diagrammet nedenfor. Figur 2. Venstre: Støtte vektor maskininnganger kartlagt til et 2D-diagram. De røde sirkler og blå kryss er brukt til å betegne de to klassene av innganger. Figur 3. Høyre: Støtte vektor maskininnganger kartlagt til et 2D-diagram. De røde sirkler og blå kryss er brukt til å betegne de to klassene av innganger med en svart linje som indikerer separerende hyperplanet. I dette eksemplet angir de blå kryssene datapunkter som tilhører kategori 1 og de røde kretsene som representerer datapunkter som tilhører kategori 2. Hver enkelt av de individuelle datapunktene har unik inngang 1 verdi (representert ved deres posisjon på x-aksen ) og en unik inngang 2-verdi (representert ved sin posisjon på y-aksen) og alle disse punktene er kartlagt til det 2-dimensjonale rommet. En støttevektormaskin kan klassifisere data ved å lage en modell av disse punktene i 2-dimensjonalt rom. Støttevektormaskinen observerer dataene i 2-dimensjonalt rom, og bruker en regresjonsalgoritme for å finne en 1-dimensjonal hyperplan (aka-linje) som mest nøyaktig skiller dataene i sine to kategorier. Denne skillelinjen blir da brukt av støttevektormaskinen til å klassifisere nye datapunkter i enten kategori 1 eller kategori 2. Animasjonen nedenfor illustrerer prosessen med å trene en ny støttervektormaskin. Algoritmen vil starte ved å lage en tilfeldig gjetning for å finne en separerende hyperplan, og deretter øke iterativt nøyaktigheten av hyperplanen. Som du kan se, begynner algoritmen ganske aggressivt, men senker den da den begynner å nærme seg ønsketløsningen. Figur 4. En animasjon som viser en trening vektor maskin trening. Hyperplanet konvergerer gradvis på den ideelle geometrien for å skille mellom de to dataklassene. Det 2-dimensjonale scenariet ovenfor presenterer tillater oss å visualisere prosessen med en støttevektormaskin, men det er bare i stand til å klassifisere et datapunkt ved hjelp av to innganger. Hva om vi vil bruke flere innganger Heldigvis gir støttevektormaskinalgoritmen oss det samme i høyere dimensjoner, selv om det blir mye vanskeligere å konseptualisere. Tenk på dette, du ønsker å opprette en støttevektormaskin som tar 20 innganger og kan klassifisere et hvilket som helst datapunkt ved hjelp av disse inngangene i enten kategori 1 eller kategori 2. For å gjøre dette må støttevektormaskinen modellere dataene i 20 dimensjonalt rom og bruk en regresjonsalgoritme for å finne en 19-dimensjonal hyperplan som skiller datapunktene i to kategorier. Dette blir svært vanskelig å visualisere som det er vanskelig for oss å forstå noe over 3-dimensjoner, men alt du trenger å vite er at det fungerer på nøyaktig samme måte som det for det 2-dimensjonale tilfellet. Hvordan fungerer støttevektorer Eksempel: Er det en skinn? Tenk deg dette hypotetiske scenariet, du er en forsker som undersøker et sjeldent dyr som bare finnes i dybden av Arktis kalt Shnicks. Gitt fjernheten av disse dyrene, har bare en liten håndfull blitt funnet (kan si rundt 5000). Som forsker står du fast med spørsmålet. Hvordan kan jeg identifisere en Schnick? Alt du har til disposisjon er de forskningsblader som tidligere ble publisert av en håndfull forskere som har sett en. I disse forskningsdokumentene beskriver forfatterne visse egenskaper om de Schnicks de fant, det vil si høyde, vekt, antall ben, etc. Men alle disse egenskapene varierer mellom forskerpapirene uten å anse det som ikke er synlig. Hvordan kan vi bruke disse dataene til å identifisere et nytt dyr som en schnick En mulig løsning på vårt problem er å bruke en støttevektormaskin for å identifisere mønstrene i dataene og lage et rammeverk som kan brukes til å klassifisere dyr som enten en schnick eller ikke en schnick. Det første trinnet er å skape et sett med data som kan brukes til å trene støttemaskinvektoren din for å identifisere schnicks. Opplæringsdataene er et sett med innganger og matchende utganger for støttevektormaskinen for å analysere og trekke ut et mønster fra. Derfor må vi bestemme hvilke innspill som skal brukes og hvor mange. Teoretisk sett kan vi ha så mange innganger som vi vil, men dette kan ofte føre til langsom trening (jo flere innganger du har jo mer tid det tar støttevektormaskinen å trekke ut mønstre). Også, du vil velge innspill verdier som vil ha en tendens til å være relativt konsistent på tvers av alle schnicks. For eksempel vil dyrets høyde eller vekt være et godt eksempel på en inngang fordi du forventer at dette ville være relativt konsistent på tvers av alle schnicks. Imidlertid vil gjennomsnittsalderen til et dyr være et dårlig valg av innspill fordi du forventer at alder av identifiserte dyr vil variere betydelig. Av denne grunn ble følgende innganger valgt: Høydevekt Antall ben Antall øyne Lengden på dyrets armer Dyrets gjennomsnittlige hastighet Frekvensen av dyrene som passer til samtalen Med de valgte inngangene kan vi begynne å kompilere treningsdataene våre . Effektive opplæringsdata for en støttevektormaskin må oppfylle visse krav: Dataene må ha eksempler på dyr som er schnicks Dataene må ha eksempler på dyr som ikke er schnicks I dette tilfellet har vi forskerpapir fra forsker som har vellykket identifisert en schnick og oppført sine eiendommer. Derfor kan vi lese disse forskningspapirene og trekke ut dataene under hver av inngangene og tildele en utgang av enten ekte eller falsk til hvert av eksemplene. Opplæringsdataene i dette tilfellet kan se ut som i tabellen nedenfor. Tabell 1. Eksempel tabell av schnick observasjoner Når vi har samlet dataene for alle våre treningsinnganger og utganger, kan vi bruke den til å trene vår støttevektormaskin. Under treningsprosessen vil støttevektormaskinen opprette en modell i syvdimensjonalt mellomrom som kan brukes til å sortere hver av treningseksemplene til enten sann eller falsk. Støttevektormaskinen fortsetter å gjøre dette til den har en modell som nøyaktig representerer treningsdataene (innenfor den angitte feiltoleransen). Når treningen er fullført, kan denne modellen brukes til å klassifisere nye datapunkter som enten sant eller falskt. Fungerer støttevektormaskinen egentlig med Schnick-scenariet, har jeg skrevet et skript som tester hvor godt en støtteteknormaskin faktisk kan identifisere nye schnicks. For å gjøre dette har jeg brukt funksjonalitetsbiblioteket Support Vector Machine Learning, som kan lastes ned fra markedet. For å modellere dette scenariet effektivt må vi først bestemme hva som er de faktiske egenskapene til en Schnick. Egenskapene jeg har antatt i dette tilfellet har blitt oppført i tabellen under. Hvis et dyr oppfyller alle kriteriene under, så er det en Schnick. Tabell 2. Sammendrag av parametere som definerer en schnick Nå som vi har definert vår Schnick, kan vi bruke denne definisjonen til å eksperimentere med støttevektormaskiner. Det første trinnet er å skape en funksjon som er i stand til å ta de syv inngangene til et gitt dyr og returnere den faktiske klassifiseringen av dyret som en schnick eller ikke. Denne funksjonen blir brukt til å generere treningsdata for støttevektormaskinen, samt vurdere ytelsen til den på slutten. Dette kan gjøres ved å bruke funksjonen nedenfor. Det neste trinnet i prosessen er å skape en funksjon som kan generere treningsinngangene og utgangene. Inngangene i dette tilfellet vil bli generert ved å lage tilfeldige tall innenfor et sett område for hver av de syv inngangsverdiene. Deretter for hvert sett av tilfeldige innganger generert, vil isItASchnick () - funksjonen ovenfor bli brukt til å generere den tilsvarende ønskede utgang. Dette gjøres i funksjonen nedenfor: Vi har nå et sett med treningsinnganger og - utganger, det er nå på tide å lage våre støttevektormaskiner ved hjelp av Support Vector Machine Learning Tool tilgjengelig i markedet. Når en ny støttevektormaskin er opprettet, er det nødvendig å sende treningsinngangene og utgangene til den og utføre opplæringen. Vi har nå en støttevektormaskin som har blitt opplært med å identifisere Scnhicks. For å bekrefte dette kan vi teste den endelige støttende vektormaskinen ved å be den om å klassifisere nye datapunkter. Dette gjøres ved først å generere tilfeldige innganger, og bruker deretter isItASchnick () - funksjonen til å avgjøre om disse inngangene korresponderer med en faktisk Schnick. Deretter bruker du støttevektormaskinen til å klassifisere inngangene og avgjøre om det forutsagte resultatet samsvarer med det faktiske resultatet. Dette gjøres i funksjonen nedenfor: Jeg anbefaler å spille med verdiene i de ovennevnte funksjonene for å se hvordan støttemodulmaskinen utfører under forskjellige forhold. Hvorfor er støttevektormaskinen så nyttig Fordelen med å bruke en støttevektormaskin for å trekke ut komplisert mønster fra dataene er at det ikke er nødvendig å forstå tidligere oppførselen til dataene. En støttevektormaskin kan analysere dataene og trekke ut kun innsikt og relasjoner. På denne måten fungerer det som en svart boks som mottar en inngang og genererer en utgang som kan vise seg å være svært nyttig for å finne mønstre i dataene som er for komplekse og ikke åpenbare. En av de beste funksjonene til støttevektormaskiner er at de er i stand til å håndtere feil og støy i dataene veldig bra. De kan ofte se det underliggende mønsteret i dataene og filtrere ut datautviklere og andre kompleksiteter. Tenk på følgende scenario, når du utfører din forskning på Schnicks, kommer du over flere forskningsblanketter som beskriver Schnicks med massivt forskjellige egenskaper (som en sknick som er 200kg og er 15000mm høy). Feil som dette kan føre til forvrengninger din modell av hva en Schnick er, noe som potensielt kan føre til at du gjør en feil når du klassifiserer nye Schnick-funn. Fordelen med støttevektormaskinen er at den vil utvikle en modell som stemmer overens med det underliggende mønsteret mot en modell som passer til alle treningsdatapunktene. Dette gjøres ved å tillate et visst feilnivå i modellen for å muliggjøre at støttevektormaskinen overser eventuelle feil i dataene. I tilfelle av Schnick-støttevektormaskinen, hvis vi tillater en feiltoleranse på 5, vil trening bare prøve å utvikle en modell som stemmer overens med 95 av treningsdataene. Dette kan være nyttig fordi det tillater trening å ignorere den lille prosentdelen av utjevningene. Vi kan undersøke denne egenskapen til støttevektormaskinen videre ved å endre vårt Schnick-skript. Funksjonen nedenfor er lagt til for å introdusere bevisst tilfeldige feil i treningsdatasettet. Denne funksjonen velger tilfeldig treningspoeng og erstatter inngangene og tilsvarende utdata med tilfeldige variabler. Denne funksjonen tillater oss å introdusere bevisst feil i treningsdataene våre. Ved å bruke denne feilfylte data kan vi opprette og trene en ny støtteteknormaskin og sammenligne ytelsen med den opprinnelige. Når skriptet kjøres, produserer det følgende resultater i ekspertloggen. I et treningsdatasett med 5000 treningspunkter, var vi i stand til å introdusere 500 tilfeldige feil. Når du sammenligner ytelsen til denne feilfylte støttevektormaskinen med den opprinnelige, blir ytelsen bare redusert med lt1. Dette skyldes at støttevektormaskinen er i stand til å overse utjevningene i datasettet ved trening og fortsatt er i stand til å produsere en imponerende nøyaktig modell av de sanne dataene. Dette antyder at støttevektormaskiner kan være et mer nyttig verktøy for å utvinne komplekse mønstre og innsikt fra støyende datasett. Figur 5. Den resulterende ekspertloggen ved å kjøre Schnick-skriptet i MetaTrader 5. Demo Versions En full versjon av koden ovenfor kan lastes ned fra Code Base, men dette skriptet kan bare kjøres i terminalen din hvis du har kjøpt en fullversjon av Support Vector Machine Learning-verktøyet fra markedet. Hvis du bare har en demoversjon av dette verktøyet lastet ned, vil du være begrenset til å bruke verktøyet via strategistesten. For å tillate testing av Schnick-koden ved hjelp av demoversjonen av verktøyet, har jeg omskrevet en kopi av skriptet til en ekspertrådgiver som kan distribueres ved hjelp av strategitesteren. Begge disse kodeversjonene kan lastes ned ved å følge koblingene nedenfor: Fullversjon - Bruke et skript som distribueres i MetaTrader 5-terminalen (krever en kjøpt versjon av Support Vector Machine Learning Tool) Demoversjon - Bruk en ekspertrådgiver som er distribuert i MetaTrader 5-strategi testeren (krever bare en demoversjon av støttevektormaskinens læringsverktøy). Hvordan kan støtte vektormaskiner brukes i markedet? Det er ganske enkelt ganske enkelt, Schnick-eksemplet som er beskrevet ovenfor, men det er ganske mange likheter som kan tegnes mellom dette eksemplet og ved hjelp av støttevektormaskiner for teknisk markedsanalyse. Teknisk analyse er fundamentalt om bruk av historiske markedsdata for å forutsi fremtidige prisbevegelser. På samme måte i schnick-eksempelet brukte vi observasjonene fra tidligere forskere for å forutsi om et nytt dyr er en sknick eller ikke. Videre er markedet plaget av støy, feil og statistiske avvikere som gjør bruken av en støttevektormaskin et interessant konsept. Grunnlaget for et vesentlig antall teknologiske analysemetoder omfatter følgende trinn: Overvåking av flere indikatorer Identifisering av hvilke forhold for hver indikator korrelerer med en potensielt vellykket handel. Sjekk hver indikator og vurder når alle (eller de fleste) signaliserer en handel. Det er mulig å vedta en lignende tilnærming til å bruke støttevektormaskiner for å signalisere nye handler på en lignende måte. Støttevektormaskinens læringsverktøy ble utviklet med dette i tankene. En fullstendig beskrivelse av hvordan du bruker dette verktøyet, finnes i Market, så jeg gir bare en rask oversikt. Prosessen for bruk av dette verktøyet er som følger: Figur 6. Blokkediagrammet som viser prosessen for implementering av støttevektormaskinverktøyet i en ekspertrådgiver Før du kan bruke Support Vector Machine Learning Tool, er det viktig å først forstå hvordan treningen innganger og utganger blir generert. Hvordan genereres treningsinnganger Så, de indikatorene du vil bruke som innganger, har allerede blitt initialisert, så vel som din nye støttevektormaskin. Det neste trinnet er å sende indikatorhåndtakene til den nye støttende vektormaskinen og instruere den om hvordan du genererer treningsdataene. Dette gjøres ved å ringe funksjonen setIndicatorHandles (). Denne funksjonen lar deg passere håndtakene til initialiserte indikatorer inn i støttevektormaskinen. Dette gjøres ved å gi passord og heltall som inneholder håndtakene. De to andre inngangene for denne funksjonen er offsetverdien og antall datapunkter. Offset-verdien angir forskyvningen mellom den nåværende linjen og startlinjen som skal brukes til å generere treningsinngangene, og antall treningspunkter (betegnet med N) angir størrelsen på treningsdataene dine. Diagrammet nedenfor illustrerer hvordan man bruker disse verdiene. En forskyvningsverdi på 4 og en N-verdi på 6 vil fortelle støttevektormaskinen å bare bruke stolpene tatt i det hvite torget for å generere treningsinnganger og utganger. På samme måte vil en forskyvningsverdi på 8 og en N-verdi på 8 fortelle støttevektormaskinen å bare bruke stolpene tatt i det blå torget for å generere treningsinnganger og utganger. Når funksjonen setIndicatorHandles () har blitt kalt, er det mulig å ringe genInputs () - funksjonen. Denne funksjonen vil bruke indikatorhåndtakene til å passere for å generere en rekke inngangsdata som skal brukes til opplæring. Figur 7. Lysdiagram som illustrerer verdiene for Offset og N Hvordan genereres treningsutganger Treningsutgangene genereres ved å simulere hypotetiske handler basert på historiske prisdata og avgjøre om en slik handel ville ha vært vellykket eller mislykket. For å gjøre dette, er det noen få parametre som brukes til å instruere støttemateriellets læringsverktøy hvordan man vurderer en hypotetisk handel som enten vellykket eller mislykket. Den første variabelen er OPTRADE. Verdien av dette kan enten være KJØP eller SELL, og vil svare til enten hypotetisk kjøp eller salg av handler. Hvis verdien av dette er KJØP, da når du genererer utgangene, vil det bare se på den potensielle suksessen til hypotetiske kjøpshandlinger. Alternativt, hvis verdien av dette er SELG, da når du genererer utgangene, vil det bare se på den potensielle suksessen til hypotetiske salgshandlinger. De neste verdiene som brukes, er stoppfallet og ta fortjeneste for disse hypotetiske handler. Verdiene er satt i pips og vil angi stopp og grenseverdier for hver av de hypotetiske handler. Den endelige parameteren er varighet for handel. Denne variabelen måles i timer og vil sikre at kun handler som er ferdige innen denne maksimale varigheten, anses som vellykkede. Årsaken til å inkludere denne variabelen er å unngå støttevektormaskinens signaleringsvirksomhet i et sakte, flytende, sidelengs marked. Betraktninger som skal gjøres ved valg av innganger Det er viktig å legge inn litt tanke i innspillingsvalget ved implementering av støttevektormaskiner i din handel. I likhet med Schnick-eksempelet, er det viktig å velge et innspill som forventes å ha likhet på tvers av forskjellstilfeller. For eksempel kan du bli fristet til å bruke et glidende gjennomsnitt som en inngang, men siden den langsiktige gjennomsnittsprisen har en tendens til å endres ganske dramatisk over tid, kan et glidende gjennomsnitt i isolasjon ikke være det beste inputet til bruk. Dette skyldes at det ikke vil være noen signifikant likhet mellom den bevegelige gjennomsnittsverdien i dag og de bevegelige gjennomsnittsverdiene for seks måneder siden. Anta at vi handler EURUSD og bruker en støtteteknormaskin med en gjennomsnittlig innsats til signalkjøp. Si at dagens pris er 1,10, men det genererer treningsdata fra seks måneder siden da prisen var 0,55. Ved trening av støttevektormaskinen kan mønsteret det finner bare føre til at en handel blir signalisert når prisen er rundt 0,55, siden dette er de eneste dataene den vet. Derfor kan din støttevektormaskin aldri signalisere en handel før prisen senker ned til 0,55. I stedet kan en bedre inngang til bruk for støttevektormaskinen være en MACD eller lignende oscillator fordi verdien av MACD er uavhengig av det gjennomsnittlige prisnivået og bare signalerer relativ bevegelse. Jeg anbefaler at du eksperimenterer med dette for å se hva som gir de beste resultatene for deg. En annen vurdering å gjøre når du velger innspill, er å sikre at støttevektormaskinen har et tilstrekkelig øyeblikksbilde av en indikator for å signalisere en ny handel. Du kan i din egen handelsopplevelse finne at en MACD bare er nyttig når du har de siste fem stolpene å se på, da dette vil vise en trend. En enkelt stang i MACD kan være ubrukelig isolert, med mindre du kan fortelle om den går opp eller ned. Derfor kan det være nødvendig å sende de siste par stolpene i MACD-indikatoren til støttevektormaskinen. Det er to mulige måter du kan gjøre dette på: Du kan opprette en ny tilpasset indikator som bruker de siste fem stolpene i MACD-indikatoren til beregne en trend som en enkelt verdi. Denne tilpassede indikatoren kan da sendes til støttevektormaskinen som en enkelt inngang, eller Du kan bruke de forrige fem stolpene i MACD-indikatoren i støttevektormaskinen som fem separate innganger. Måten å gjøre dette på er å initialisere fem forskjellige forekomster av MACD-indikatoren. Hver av indikatorene kan initialiseres med en forskjellig forskyvning fra den nåværende linjen. Deretter kan de fem håndtakene fra de separate indikatorene overføres til støttevektormaskinen. Det bør bemerkes at alternativ 2 vil ha en tendens til å forårsake lengre gjennomføringstider for din ekspertrådgiver. Jo flere innganger du har, desto lenger tid vil det ta for å lykkes med å trene. Implementere supportvektormaskiner i og ekspertrådgiver Jeg har utarbeidet en ekspertrådgiver som er et eksempel på hvordan noen kan potensielt bruke støttevektormaskiner i egen handel (en kopi av dette kan lastes ned ved å følge denne lenken mql5encode1229). Forhåpentligvis vil Expert Advisor tillate deg å eksperimentere litt med støttevektormaskiner. Jeg anbefaler at du copychangemodify Expert Advisor slik at den passer til din egen handelsstil. EA fungerer som følger: To nye støttevektormaskiner blir opprettet ved hjelp av svMachineTool-biblioteket. En er satt opp for å signalisere nye Kjøp handler, og den andre er satt opp for å signalere nye selgerhandler. Sju standardindikatorer initialiseres med hver av håndtakene deres lagret til et heltall array (Merk: En hvilken som helst kombinasjon av indikatorer kan brukes som innganger, de må bare sendes til SVM i et heltallstall). Utvalget av indikatorhåndteringer overføres til de nye støttevektormaskiner. Ved hjelp av en rekke indikatorhåndtak og andre parametere brukes historiske prisdata til å generere nøyaktige innganger og utdata som skal brukes til opplæring av støttevektormaskiner. Når alle inngangene og utgangene er generert, blir begge støttevektormaskiner trent. De utdannede støttevektormaskinene brukes i EA til å signalisere nye kjøp og salg av handler. Når en ny kjøp eller salg av handel signaliseres, åpner handelen sammen med manuelle Stop Loss og Take Profit bestillinger. Initialiseringen og opplæringen av støttevektormaskinen utføres i funksjonen onInit (). Som referanse er dette segmentet av svTrader EA inkludert med notater. Avansert Support Vector Machine Trading Ytterligere evner ble bygd inn i støttevektormaskinens læringsverktøy for de mer avanserte brukerne der ute. Verktøyet lar brukerne passere i sine egne tilpassede inngangsdata og utdata (som i Schnick-eksempelet). Dette gjør at du kan tilpasse design dine egne kriterier for støtte vektor maskininnganger og utganger, og manuelt passere i disse dataene for å trene den. Dette åpner muligheten til å bruke støttevektormaskiner i ethvert aspekt av din handel. Det er ikke bare mulig å bruke støttevektormaskiner til å signalisere nye handler, men det kan også brukes til å signalere avslutning av handler, pengehåndtering, nye avanserte indikatorer etc. For å sikre at du ikke mottar feil, er det viktig å forstå hvordan Disse innganger og utganger skal struktureres. Inputs: Inputene sendes til SVM som et 1-dimensjonalt utvalg av dobbelte verdier. Vær oppmerksom på at alle innspill du oppretter må sendes inn som en dobbel verdi. Booleske, heltall, etc. må alle omdannes til en dobbel verdi før de sendes inn i støttevektormaskinen. Inngangene kreves i følgende form. For eksempel, antar vi passerer i innganger med 3 innganger x 5 treningspunkter. For å oppnå dette må vårt doble array være 15 enheter lange 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 er også nødvendig å passere i en verdi for antall innganger. I tilfelle NInputs3. Utganger: Utganger sendes inn som en rekke boolske verdier. Disse boolske verdiene er ønsket utgang fra SVM korrespondert til hvert sett av innganger som er sendt inn. Følg eksemplet ovenfor, si at vi har 5 treningspunkter. I dette scenariet vil vi passere i en boolsk matrise av utdataverdier som er 5 enheter lange. Når du genererer dine egne innganger og utganger, må du være sikker på at lengden på dine arrays samsvarer med verdiene du sender inn. Hvis de ikke samsvarer, vil det oppstå en feil som melder deg om uoverensstemmelsen. Hvis vi for eksempel har gått inn i NInputs3, og innganger er en rekkevidde av lengde 16, vil en feil bli kastet (siden vil en ninputsverdi på 3 bety at lengden på en hvilken som helst inngangsarray må være et flertall av 3) . På samme måte må du sørge for at antall sett av innganger og antall utdata du sender inn er like. Igjen, hvis du har NInputs3, lengden på innganger på 15 og en lengde på utganger på 6, vil en annen feil bli kastet (som du har 5 sett med innganger og 6 utganger). Prøv å sikre at du har nok variasjon i treningsutgangene dine. Hvis du for eksempel passerer 100 treningspoeng, som betyr et utgangsarrangement med lengde 100, og alle verdiene er falske med bare ett sant, er differensieringen mellom det sanne saken og det falske tilfellet ikke tilstrekkelig nok. Dette vil ha en tendens til å føre til SVM-trening veldig fort, men den endelige løsningen er svært dårlig. Et mer variert treningssett vil ofte føre til en mer affektiv SVM. Trading med Support Vector Machines (SVM). Endelig har alle stjernene rettet opp, og jeg kan trygt bruke litt tid på back-testing av nye handelssystemer og Support Vector Machines (SVM). ) er den nye 8220toy8221 som skal holde meg opptatt en stund. SVM er et velkjent verktøy fra området overvåket maskinlæring. og de brukes både til klassifisering og regresjon. For mer informasjon, se litteraturen. Det synes for meg at den mest intuitive søknaden om handel er regresjon, så let8217s begynner med å bygge en SVM-regresjonsmodell. Etter vår erfaring med ARMAGARCH-modeller, begynner vi å prøve å prognostisere avkastning, i stedet for priser. På samme måte, i våre første tester vil vi bare bruke avkastningen av de foregående 5 dagene som funksjonene som bestemmer avkastningen av en bestemt dag. Vi starter med en historie på 500 dager som treningssettet. I mer matematiske termer, for treningssettet har vi N-funksjoner, for hver av dem har vi M-prøver. Vi har også M-svar. Gitt en rekke funksjonsverdier, er den venstre matrisen, SVM trent til å produsere responsverdien. I vårt spesifikke eksempel har vi fem kolonner (funksjoner), hver kolonne som svarer til avkastningen med et annet lag (fra 1 til 5). Vi har 500 prøver og de tilsvarende svarene. Når SVM er utdannet på dette settet, kan vi begynne å mate det med sett med fem funksjoner, som svarer til avkastningen for de fem foregående dagene, og SVM vil gi oss svaret, som er den forventede avkastningen. For eksempel, etter å ha trent SVM på de foregående 500 dagene, vil vi bruke avkastningen for dagene 500, 499, 498, 497 og 496 (disse er våre som inngang for å oppnå den forventede avkastningen for dag 501. Fra alle tilgjengelige pakker I R bestemte jeg meg for å velge e1071-pakken. Et nært annet valg var kernelab-pakken, som jeg fortsatt planlegger å prøve i fremtiden. Så prøvde jeg noen strategier. Først prøvde jeg noe som ligner ARMAGARCH-tilnærming 8211 forsinket avkastning fra de fem foregående dagene. Jeg var ganske overrasket over å se at denne strategien virket bedre enn ARMAGARCH (dette er ARMAGARCHs hjemland og jeg ville vært ganske glad bare med sammenlignbare resultater). Neste gang prøvde jeg å de samme fem funksjoner, men prøver å velge den beste delmengden. Utvalget ble gjort med en grådig tilnærming, som begynner med 0 funksjoner, og interaktiv legger til funksjonen som minimerer feilen best. Denne tilnærmingen forbedret ting ytterligere. Til slutt prøvde jeg en annen approac h med omtrent et dusin funksjoner. Funksjonene inkluderer retur over en annen tidsperiode (1-dag, 2-dagers, 5-dagers, etc), noen statistikk (middel, median, sd, etc) og volum. Jeg brukte samme grådige tilnærming til å velge funksjoner. Dette siste systemet viste også en veldig god ytelse, men det tok et stykke tid å løpe. Tiden for å avslutte dette innlegget, må resultatene for back-testing vente. Inntil da kan du selv spille med full kildekoden. Her er et eksempel på å bruke det: Hei I Windows fungerer ikke Work2 på grunn av multicore-problem. En ting som jeg ikke forstår, er reflektert i dette til rader av kode rets retsindex (data) data dataindex (rets) Etter min mening er it8217s mer effektiv til å slå sammen serien smth som mydtret lt-na. exclude (flette (rets, data) og for å ha bare ett argumentobjekt å fungere, ring i stedet for 2 Interessant arbeid, takk Mike Argh, Windows 8211 Jeg bruker det sjeldent i det siste. Ganske overrasket, siden parallellpakken er en del av basen R-distribusjonen nå. Forhåpentligvis vil det bli behandlet snart I mellomtiden, hva med å ikke bruke parallell kjøring. Det finnes også andre pakker som gir parallell kjøring, men det ville være mer arbeid. Du har rett på flette 8211 Jeg lurer fortsatt på hvorfor jeg gjorde det på denne måten denne gangen. I8217m mottar feil. Nå er feilen gt data svmFeatures (tt), c (1,2) Feil i match. fun (FUN). objekt 8216skewness8217 ikke funnet Men når jeg lager dataobjekt manuelt, mottar jeg feil i prediksjon svmComputeOneForecast lt - funksjon relatert til dimensjoner og samplingquotcrossquot It039 er vanskelig for meg å feilsøke skjevhet, kommer fra PerformanceAnalytics-pakken, som du må installere fra CRAN. Legge til krav (PerformanceAnalytics) som den første linjen i svmFeatures bør adressere det første problemet. Nå er feilen feil i merge. xts (res, xts (na. trim (lag (rollmean (rets, k 21, juster 8220right8221). lengden på 8216dimnames8217 2 ikke lik array-omfanget. Det ser ut til at i Windows-koden trenger mange endringer 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