18. august 2015 6. oktober 2015 Kalman filter og parhandel Tenk på dette scenariet. Du er en statistisk arbitragehandler på en stasjonskort eller HF. Som sådan holder du rutinemessig oversikt over ETF-eksponering som du må sikke. Den forrige natten instruerte du dine over natten handelsmenn å beregne sikringsforholdene for en matrise av ETF8217s. Neste morgen før markedet åpner, presenterer juniorhandlerne sine ivrige resultater for inspeksjonen. Når du ser hva du ser, laster du sikringsforholdene inn i handelsplattformen og venter på det åpne. Når markedet først åpnes for handel, balanserer du sikringene dine i henhold til de nye forholdene. Etterpå ser du i horror da hekkene dine ikke fungerer som forventet. Hva gikk galt Hver god handelsmann vet at de må tilpasse seg når forholdene i markedet endres, så hvorfor krever vi ellers fra våre handelsmodeller. De handlende i vårt eksempel baserte seg på statiske sikringsforhold for å drive sin handelslogikk. Som et resultat åpnet de seg opp til det som er kjent som parameterrisiko. Oppdatering av parametrene når ny informasjon blir tilgjengelig, er en måte å beskytte deg mot denne underforståtte handelsrisikoen. Langt den mest allestedsnærværende modellen for å oppnå dette i et handelsscenario er Kalman Filter. Dette er nyttig når du arbeider med en lineær modell, for eksempel parhandel, som i sin enkleste form reduserer til handel med rest av en lineær regresjon: Hvor er dagens pris på den første aksjen, er dagens pris på den andre aksjen , er vårt nåværende sikringsforhold og er nåværende spredningspris vi handler. Vi kunne også estimere sikringsforholdet ved hjelp av loggendringene i X og Y, i stedet for nivåene. Dette ville være mer sannsynlig å være tilfelle i et High Frequency Trading-scenario, hvor alt vi bryr oss om er prisendringer. Kalman-filteret gjør at vi kan variere sikringsforholdet over tid. For eksempel, anta at vi antar at sikringsforholdet følger en tilfeldig tur, dvs. Hvor er den nåværende tilstanden til sikringsforholdet, er den siste tilstanden og er tilfeldig hvit støy med gjennomsnitt på null og volatilitet. Kalman-filteret ble designet for å estimere 8220hidden state8221 av en lineær Gauss-modell som Pairs Trading. Filteret er basert på et system av ligninger: er den gjeldende skjulte tilstanden (f. eks. Sikringsforholdet), overgangsmatrisen (f. eks. Identitetsmatrisen) er den siste observasjonsvektoren (f. eks. Loggendringen av lager Y) er siste observasjonsmatrise (f. eks. loggendringen i lager X) er Gaussisk hvit støy med gjennomsnittlig null og avvik. Let8217s ser på et konkret eksempel på Kalman Filter i aksjon for å få bedre forståelse for de bevegelige delene. Spesielt ønsket vi å markere betydningen av ditt valg av og. Forholdet mellom disse to parametrene kalles signal-støyforholdet. Hvis det er lite forhold til, vil filteret legge mesteparten av vekten til neste estimat på tilstanden til det siste estimatet (dvs. filteret vil favorisere sin nåværende tilstand over ny informasjon). Hvis omvendt er sant, vil filteret tilpasse seg svært raskt til ny informasjon på bekostning av sin tidligere tilstand. Følgende diagram illustrerer effekten pent. Hver linje representerer modell8217s nåværende estimat av sikringsforholdet mellom ETF8217s SPY og EEM ved hjelp av forskjellige verdier for å holde konstant. Jo høyere signal / støyforhold, desto raskere passer modellen til ny informasjon: Python har en enkel og effektiv implementering av Kalman Filter kalt pykalman. Vi lastet ned gratis intraday lagerdata for SPY og EEM ved hjelp av getgoogledata-funksjonen vi tidligere delte. For å implementere dette for deg selv, kan du følge med nedenfor. Det første trinnet er å importere modulene som kreves: Deretter kan vi laste ned aksjekursene og tranformere dem til loggendringene: Nå lader8217s skille datasettet inn i prøver for å beregne filterets opprinnelige tilstand: Nå kan vi kjøre hvert filter ved hjelp av en annen signal-til-støy-forhold: Dette er en løst koblet etterfølger til vårt forrige innlegg. Konstruere en stat arb-parhandel For et godt skrevet eksempel på hvordan du bruker en spredningsmodell med et avskjær og et sikringsforhold, sjekk TheAlgoEngineer. Interessert i ressurser for Parhandel Ønsker du å lære hvordan du kan min sosiale datakilder som Google Trends, StockTwits, Twitter, og Estimér Sørg for å laste ned vår bok Intro til sosiale data for handelsfolk Følg bloggen via e-post Post navigasjon Siste innlegg Siste kommentarer KategorierKalman filter og valuta styrke Ble medlem Aug 2011 Status: Medlem 1.132 Innlegg Imidlertid spiller jeg med Recursive Bayesian estimators (en. wikipedia. orgwikiRecursi. ianestimation) som Kalman filteret er et spesielt tilfelle. Jeg vil ikke komme inn i gory detaljer se Bayesian Prognoser og Dynamiske Modeller av West og Harrison. Først prøvde jeg å estimere trend og volatilitet i markedet. Men det er ikke hva dette innlegget handler om. Det handler om hvorfor du bedre vil være lenge på dragen i dag. Markedsavkastningen er ikke normalt distribuert, men et sted mellom Cauchy og Student distribuert. Kalman-filterforestillinger nedbrytes raskt for ikke-normale innovasjoner. Det er derfor jeg bruker et annet Kalman-filter som anslår feilen til den første og jeg tilbakemelding denne informasjonen i den første modellen som en modulasjon av den lovlige variansen av staten. En slags dynamisk markørkvotering lt-gt smoothnessquot. Denne første modellen er en andre ordinær polynomisk lokal estimering. Jeg valgte en 2-polynomisk rekkefølge fordi den kan tilnærme (Taylor) en jevn funksjon som en sinusbølge for et marked med en syklisk komponent (rekkevidde eller valatile trend) eller en eksponentiell trend (for indeks og aksjer). Også akselerasjonsfaktoren bidrar til å fange opp prisen i tilfelle av en plutselig bevegelse. Det andre filteret bruker bare en konstant modell. Jeg bruker H4 til å måle den daglige trenden. Her er et skjermbilde av EURUSD H4. Den blå linjen er den ideelle, men ikke-kausal, lavpasfilter sinc (en. wikipedia. orgwikiSincfilter) brukt med 41 prøver. Det gir deg en ide om laget. Filteret er grønt når trenden er mest sannsynlig oppe og rød ellers. Dash-konvolutten er 95 konfidensintervallet av gjennomsnittlig prisoverslag. Nedenfor er feilen mellom prisen og estimatet (svart) og denne verdien filtrert med det andre filteret (rødt). Det følger ikke feilen for mye for ikke å gjøre hovedfiltret over-reagere. Vedlagt bilde (klikk for å forstørre) Ingen grådighet. Ingen frykt. Bare matte. Ble medlem Aug 2011 Status: Medlem 1.132 Innlegg Nå har jeg et estimat av den mest sannsynlige trenden. Det er viktig å huske på at det er en sannsynlighet ikke en visshet. Jeg kan bruke denne informasjonen til å definere om EURUSD trolig er opp eller ned. OK, jeg hører deg, jeg kan også se på diagrammet og se om det heves eller faller :-). Du har rett. Men ideen jeg hadde, er å gjenta dette med hver av de store, ikke bare for å vite om de er opp eller ned, men hvor mye de er opp eller ned. Hvis GBPUSD går ned, betyr det at USD er sterkere enn Pound. Hvis EURUSD også er nede, er EUR også svakere enn USD. Men hvilken av GBP eller EUR er den svakeste En kan ikke bare bruke pipverdien av trenden fordi verdien av en pip er ikke den samme for alle parene. Av denne grunn bruker jeg prosentandelen av variasjon. Ved å dele en prisforskjell med en pris får du en unit-less verdi. På denne måten blir jeg kvitt unitcale og jeg kan sammenligne EURNZD og USDJPY direkte. Fordi EURGBP er (EURUSD) (GBPUSD), er det ikke nødvendig å filtrere alle parene. Prisberegningen og trendestimatet av de store er nok til å linearisere med god nok nøyaktighet. Hvis du finner GBP er svakere enn EUR enn du kan bestille de tre valutaene: GBP lt EUR lt USD. Det er fornuftig å søke en god oppføring kort på GBPUSD fordi den er der vi har en god sjanse til å fange en trend. Nå for hvert par bestiller jeg valutaene parvis, sterkere - svakere. Hver valuta er belønnet med en poengsum hver gang den er sterkere enn en annen. Denne poengsummen er den estimerte prosentvise veksten. På slutten har hver valuta en poengsum og listen over valutaene sterkere enn den. Jeg kan organisere dette i en graf. Det skal representere et estimat av pengestrømmen. Ikke spør meg om en tilpasset indi som jeg ikke kan programmere MQL. Hvis du er interessert i å kode et indi basert på denne ideen, kan jeg hjelpe deg hvis tiden tillater det. Vedlagt bilde (klikk for å forstørre) Åpent spørsmål: Hvis det er en syklus i grafen, er det fornuftig å kurvhandel de envolverte valutaene i en ring som er veldig interessant, vil se på linkene du postet, for tiden bruker jeg verdiendringene for bias og holder handler og legger til oss, jeg har ikke funnet noe som kommer i nærheten av informasjonen jeg får fra disse parene. Selv om jeg ser på verdiendringen i pipverdien og den totale prosentandelen, har det blitt perfekt i utmerket, men fortsatt pågår. du nevner handel i en kurv, dette kan være svært givende. Et godt eksempel på denne typen handel var i dag, jeg hovedsakelig handelen kabel som som alle relaterte par ble presset ned. det ledende paret i dagens endring var cable. its verdi var 60 pluss pips mens de andre doller kryssene ikke hadde flyttet. Yenparene hadde også stanset, men på dette punktet var det ingen tegn på retningsendring. Styrken i kabelen var clue. i plassert handler på 4 yen par, doller chf, doller cad og euro. inkludert min første kabel lenge ive fikk nær 400 pips. korrelasjonene blir avvist mye på dette forumet fordi det ikke forstås. måten du har beskrevet og forsket på, viser hvordan korrelasjonene i forhold til det er veldig mye der, kompensert av det pip verdi sammen med endrede forhold innenfor det eget individ fundamentals. but disse syklusene er der og kan brukes. Det ser ut til at en valuta kan være sterk, enten fordi den mottar mye fra noen andre valutaer eller fordi den mottar fra alle de andre. Vanligvis matcher de 2 forholdene. Hvilken er den sterkeste USD med den største poengsummen eller EUR mottak fra alle de andre (poengsummen er summen av trendhellingen). Vær også oppmerksom på at det er en syklus JPY-gtAUD-gtUSD. Ingen grådighet. Ingen frykt. Bare matte. Ble med i desember 2010 Status: Foook Bollinger-dr. Kegel vet 9,292 innlegg Nå har jeg et estimat av den mest sannsynlige trenden. Det er viktig å huske på at det er en sannsynlighet ikke en sikkerhet. På slutten har hver valuta en poengsum og listen over valutaene sterkere enn den. Jeg kan organisere dette i en graf. Det skal representere et estimat av pengestrømmen. Ikke spør meg om en tilpasset indi som jeg ikke kan programmere MQL. Hvis du er interessert i å kode et indi basert på denne ideen, kan jeg hjelpe deg hvis tiden tillater det. Jeg gjør noe lignende. Jeg spiller med indeksene. 7 valutaer 21 valutapar. Jeg merker dem med litt statistisk anerkjennelse en gang om dagen. Gir hvert valutapar et sekvensnummer (kvotering dagkvot1 og kvotering dagkvot 0). Det kan bli presentert som en pengestrøm. Men det er vanskelig å si. Definitivt har noen svakheter. Definitivt er det lettere å handle, men man må være disiplinert mens vi er i trenden og når vi har en korreksjon. Harde ting. Som jeg ser det, presenterer det meg som er de heteste valutaene der ute. Betydning på en negativ og positiv måte. Topp 2 i og - Nedre 2. Problemet med disse systemene er alltid tidsforsinkelsen av overgangen til korreksjon, senere inn i dypere korrigert stadium og til slutt presentasjon av en ny trend. Vanskelig å programmere dette. Derfor er det så viktig at man er definitivt prøver å finne ut det hver dag hva som skjer. Jeg bruker 4 forskjellige hastigheter med indekser. Sterke trend er definitivt gi meg en presentasjon av pengestrømretningen (Bilde 1). Jeg adlyder det, og jeg prøver å spille bare denne retningsprosessen. De siste ukene har vi sterkt lov på GBP og EUR, mens vi prøver å bli kvitt CAD og JPY. Ganske enkle ting på en måte, men hvis du ikke handler monthlyweekly diagrammer og man ikke bruker stopper over 300 pippere, er det fortsatt ikke en lett oppgave når du skal gå inn og hvordan du skal ringe en rettelse slutter. Speed Trend diagram (Bilde 2) er der man kunne finne noen bevis der spillet skal slutte. Minst mistenker hva som skal skje i en rettelse. Svært vanskelige ting å gjøre som volatilitet i denne ekstremen kommer til å bli høyere. Spesielt det fader den første trendflyten som representerer i en veldig sterk motstrøm daglig lys. Valutapar (bilde 3) viser valutaen GBP som en av de sterkeste og AUD en av de svakeste. I forrige måned etter få sterke uker med høyere rente kunne vi se noen pause i oppgangen. Det er også sett på det daglige diagrammet, med letthet. Men som vist på diagrammet, kan vi se at allerede den 6. desember kunne vi se at vi er i ferd med å komme inn i en korrigeringsfeil dagspause. Hvorfor AUDL (lang) og AUDs (kort) indekser krysset 4. desember, Fortsatt i negativ sone. Det samme gjelder både GBP-indekser. De krysset inn i svakhet 6. desember, så vi har et sterkt forslag til en dypere korreksjon. Minst en bør være veldig forsiktig med å kjøpe dips, definitivt bør man i de siste dagene kvitte seg med posisjonen en dag før. Vi kunne enkelt flytte på en HH daglig, men bør være begrenset. Nå kommer jeg til mine spørsmål. Fungerer du fortsatt på dette problemet Kan du dele hva var dine generelle funn om indekshandel. Sykluser Har du noen resultater i å finne lovende faktorer til kanten probabitity i din favør angående quotonly retracementquot. Det ser ut til at en valuta kan være sterk, enten fordi den mottar mye fra noen andre valutaer eller fordi den mottar fra alle de andre. Vanligvis matcher de 2 forholdene. Hvilken er den sterkeste USD med den største poengsummen eller EUR mottak fra alle de andre (poengsummen er summen av trendhellingen). Vær også oppmerksom på at det er en syklus JPY-gtAUD-gtUSD. Ble medlem Aug 2011 Status: Medlem 1.132 Innlegg Jeg undersøkte ikke på syklusene. Jeg fant dette kan interresing for kurvhandlere. Laget er en morder med denne indikatoren. Det er ofte. Når det oppdages et par er sterkt trending, er flyttingen allerede gjort. Men fading dette trekket er dødelig. Så du må vente på en retracement. Går multi-tidsramme var det jeg fant det logiske neste trinnet. Du gjorde dette også. For eksempel er AN for tiden i min topp bearish liste for daglig. Selvfølgelig trenger ingen Kalman filter for å se AN er bearish på daglig. Men det ble bullish på H4. Jeg ville oversette dette ved: tid for bjørnene å ta profitt. Det er også bullish på H1. Når det blir bearish på H1, vil jeg prøve å finne en teknisk mulighet til å kort mot H4 for å komme inn på neste sving på D1. Selvfølgelig vil jeg være sent på H1 og sikkert for tidlig på H4. Men det er bedre enn en 300 pip SL på D1 gitt at jeg ikke kan vite om dette trekket ikke er det første etappen av en reversering. Dessverre er det svært vanskelig å objektivt anslå gyldigheten av denne tilnærmingen for å anslå styrken for pengestrømme. Som med en indikator kan du ikke estimere sin kraft utenfor omfanget av et handelssystem som bruker det. Hvis du får dårlige resultater, er det på grunn av systemets indi, at leverandøren ikke klarer å bruke systemet. Hvis resultatene er gode, vet du ikke om det er fordi indi er et godt verktøy, eller hvis du bare hadde flaks til å være i gunstig markedsforhold for systemet i løpet av testperioden. Vedlagte bilder (klikk for å forstørre) Hvis resultatene er gode, vet du ikke om det er fordi indi er et godt verktøy, eller hvis du bare hadde flaks til å være i en gunstig markedstilstand for systemet i løpet av testperioden. Dette er akkurat riktig. Jeg tester dette fra 13. august og får veldig gode resultater. Glad. Men kan fortsatt ikke se om dette var veldig gunstig de siste fire månedene, eller dette kan virkelig fungere i lengre periode. Det jeg er sikker på er at med filtrering oppføringer ut og å finne god styringskontroll av de åpne posisjonene. alt som kunne gi noen relativt god avkastningskurve. Går gjennom statistisk arbeid der jeg hovedsakelig konsentrerer seg om gevinst ved EA6 ved hver regel. Finne den optimale R: R som er best uten ytterligere filtrering. Deretter skal jeg prøve å finne den skallede delen der oppe. Jeg er i fjerde fase atm, og jeg tenker Ill allerede funnet noen veldig interessante innstillinger, som var positive gjennom dette testutvalget. Jeg drepte mange dårlige frø, men holdt bare få, og jeg innsnevrer det fortsatt ... tar tid. Jeg kan ikke teste dette systemet som det tar hele markedet samtidig. Jeg prøvde å gjøre det i Excel, men ville ta for mye tid. Jeg er arbeidskollektiv, men det vil ta måneder å etablere, så måneder. etc Jeg bygger veloppdragen pigz .. Jeg lurer på om du noen gang har tenkt på å bruke KF målinger som en del av en inngang for et maskinlæringssystem for å få handelssignaler. Noen av systemene jeg bruker utnytter liknende målinger av valutasikkerhet og har anstendig prognoser evner. Jeg gjør vanligvis maskinlæring ved å bruke R eller noen C-baserte maskinlæringsbiblioteker (libs som vafler eller hai). Jeg ser at du kan potensielt bygge et system her hvor KF fungerer som en inngang, og du kan få spådommer om trendutvikling for en kurv av valutaer. Tanken var å velge en kurv med tre quote-prognostiserende parquot ved å parre de tre sterkeste og de tre svakeste valutaene. Parring er laget ved å ta vare på deres korrelasjoner. Ved hjelp av denne metoden får jeg vekter som gjelder for MM: de er de tre parene og prosentandelen på skjermbildene. Paret laget av de resterende to valutaene er sannsynligvis varierende og bør kanskje gis til et middels reversjonsbasert system. Om å bruke en KF til å estimere markedsutviklingen, laget jeg en ved hjelp av utvalgsdiagrammer. Så langt klassifiserer den 9 markedstrender: ekstremt opp, veldig opp, opp, litt opp, flatt. ekstremt nede. De er fargekodede. Fra dette deler jeg dataene for hver klasse for å få sannsynligheten for avstanden av prisen fra det gjennomsnittet som er gitt klassen: Vedlagt bilde (klikk for å forstørre) Resultatet er pent lineært og jeg kan forbedre estimeringen av gjennomsnittet. Det er den grønne linjen og de blå og røde bandene. Vedlagt bilde (klikk for å forstørre) Mitt problem er nå å bruke det for å oppdatere systemets eksponering. Her er jeg helt blokkert for nå. Tanken var å velge en kurv med tre quote-prognostiserende parquot ved å parre de tre sterkeste og de tre svakeste valutaene. Parring er laget ved å ta vare på deres korrelasjoner. Ved hjelp av denne metoden får jeg vekter som gjelder for MM: de er de tre parene og prosentandelen på skjermbildene. Men hvis jeg forstår riktig hva du gjør med dette, synes å være å få et estimat av markedets nåværende trendstilstand, er dette kanskje ikke så nyttig siden du er interessert i fremtiden og ikke i staten som har utviklet seg frem til nå (hvor bra er det å vite at markedet er trending hvis du går inn i en handel det stopper). Jeg lurer på om du har forsøkt å bruke maskininnlæringsmetoder - ved å bruke dine KF-verdier som input - for å estimere hva fremtidig trendende tilstand i markedet vil være. Det som ville være mest nyttig ville ikke være en måling av markedets nåværende trendnivå, men et sannsynlighetsoverslag over hva fremtidens trendende markedssituasjon ville være. Jeg lurer på om dine KF-baserte målinger har forutsigbar evne med hensyn til fremtidige markedstrendsstater. Siden du vurderer et komplekst utvalg av markedsinteraksjoner, virker det trolig at dette kan være tilfelle. Hva tror du Tilgi meg hvis jeg misforstår noe, kanskje du allerede får fremtidige spådommer, og jeg savner noe av denne informasjonen. Ble medlem Aug 2011 Status: Medlem 1.132 Innlegg Jeg har aldri prøvd å forutsi staten utenom en polynomisk ekstrapolering som har absolutt ingen prediktiv kraft. Den fremtidige trendingstilstanden vil være den samme som den nåværende pluss en tilfeldig drift: Linjært økende varians. Trenden er den røde linjen under diagrammet. Den blå er utviklingshastigheten av trenden. Begge osciallte rundt deres gjennomsnitt (0). Merk skalaenheten er en standardavvik av sine egne verdier (orange2 sigma). Tendensen er gjennomsiktig, men jeg har aldri prøvd å passe en O-U-prosess. OK. En linje på TODO :-) Ingen grådighet. Ingen frykt. Bare matte. Medlemmene må ha minst 0 bilag å poste i denne tråden. 0 handelsmenn ser nå Forex Factoryreg er et registrert varemerke. Kalman Filter-Based Trading Trading Strategy I QSTrader Tidligere på QuantStart har vi vurdert de matematiske grunnene til State Space Models og Kalman Filters. samt anvendelsen av pykalman-biblioteket til et par ETFer for å dynamisk justere et sikringsforhold som grunnlag for en gjennomsnittlig tilbakevendende handelsstrategi. I denne artikkelen vil vi diskutere en handelsstrategi opprinnelig på grunn av Ernest Chan (2012) 1 og testet av Aidan OMahony over på Quantopian 2. Vi vil benytte seg av Python-baserte open source QSTrader backtesting rammeverk for å implementere strategien. QSTrader vil utføre den tunge løftingen av stillingssporing, porteføljebehandling og datainntak, mens vi kun konsentrerer oss om koden som genererer handelssignalene. Handelsstrategien Parhandelsstrategien gjelder for et par Exchange Traded Funds (ETF) som begge sporer resultatene av varierende varighet amerikanske statsobligasjoner. De er: Målet er å bygge en middels reverting strategi fra dette paret ETFs. Den syntetiske spredningen mellom TLT og IEI er tidsserien som vi faktisk er interessert i å lengre eller forkorte. Kalman-filteret brukes til å dynamisk spore sikringsforholdet mellom de to for å holde spredningen stasjonær (og dermed gjennomsiktig). For å opprette handelsregler er det nødvendig å bestemme når spredningen har flyttet for langt fra forventet verdi. Hvordan avgjør vi hva for langt er Vi kunne benytte et sett av faste absolutte verdier, men disse må være empirisk bestemt. Dette ville introdusere en annen fri parameter i systemet som ville kreve optimalisering (og ytterligere fare for overfitting). En parameterløs tilnærming til å skape disse verdiene er å vurdere et flertall av standardavviket til spredningen og bruke disse som grensene. For enkelhet kan vi sette koeffisienten til multipelen til å være lik en. Derfor kan vi gå lengre spredningen dersom prognosefilen faller under spredningens negative standardavvik. Tilsvarende kan vi redusere spredningen dersom prognosefilen overstiger den positive standardavviket til spredningen. Utgangsbestemmelsene er rett og slett motsatt av inngangsreglene. Den dynamiske sikringsforholdet er representert av en komponent av den skjulte tilstandsvektoren ved tid t, thetat, som vi vil betegne som theta0t. Dette er beta-skråningsverdien som er kjent fra lineær regresjon. Langt spredningen betyr her å kjøpe (lengter) N-enheter av TLT og selge (shorting) lfloor, hvor lfloor er gulvet som representerer høyeste heltall mindre enn x. Sistnevnte er nødvendig da vi må gjennomføre et stort antall enheter av ETFene. Kortslutning av spredningen er motsatt av dette. N styrer den totale størrelsen på stillingen. et representerer prognosen feil eller residual feil av prediksjonen ved tid t, mens Qt representerer variansen av denne prediksjonen ved tid t. For fullstendighet er reglene angitt her: et lt - sqrt - Lang spredningen: Gå lang N-aksjer av TLT og gå kort lfloor-enheter i IEI et ge - sqrt - Avslutt lang: Lukk alle lange stillinger av TLT og IEI et gt sqrt - Kort spredningen: Gå kort N-aksjer av TLT og gå lang lfloor-enheter av IEI et le sqrt - Avslutt kort: Lukk alle korte stillinger av TLT og IEI Kalman-filterets rolle er å hjelpe oss med å beregne tetat, samt et og Qt. thetat representerer vektoren av avskjærings - og hellingsverdiene i den lineære regresjon mellom TLT og IEI ved tid t. Det anslås av Kalman-filteret. Prognosen feilresidual et yt - hat t er forskjellen mellom den forventede verdien av TLT i dag og Kalman filtre estimatet av TLT i dag. Qt er variansen av prognosene og dermed sqrt er standardavviket av prediksjonen. Implementeringen av strategien innebærer følgende trinn: Motta daglige OHLCV-barer for både TLT og IEI Bruk det rekursive Kalman-filteret til å estimere prisen på TLT i dag basert på gjeldende observasjoner fra IEI. Ta forskjellen mellom Kalman-estimatet av TLT og faktisk verdi, ofte kalt prognosefeilen eller gjenværende feilen. som er et mål på hvor mye spredningen av TLT og IEI beveger seg bort fra forventet verdi. Lang spredningen når bevegelsen er negativt langt fra forventet verdi og tilsvarende kort spredningen når bevegelsen er positivt langt fra forventet verdi. og korte posisjoner når serien vender tilbake til forventet verdi For å utføre denne strategien er det nødvendig å ha OHLCV-prisdata for perioden som omfattes av denne backtest. Spesielt er det nødvendig å laste ned følgende: TLT - For perioden 3. august 2009 til 1. august 2016 (lenke her) IEI For perioden 3. august 2009 til 1. august 2016 (lenke her). Disse dataene må plasseres i katalogen som er angitt av QSTrader-innstillingsfilen hvis du ønsker å kopiere resultatene. Python QSTrader Implementering Siden QSTrader håndterer stillingssporing, porteføljestyring, datainntak og ordrehåndtering, er den eneste koden vi trenger å skrive innebåret selve strategibjektet. Strategien kommuniserer med PortfolioHandler via hendelsekøen, og benytter SignalEvent-objekter til å gjøre det. I tillegg må vi importere grunnleggende abstrakte strategiklasse, AbstractStrategy. Merk at i den nåværende alfa-versjonen av QSTrader må vi også importere PriceParser-klassen. Dette brukes til å multiplisere alle priser på inngang av et stort flertall (108) og utføre heltall aritmetikk når sporingstillingene. Dette unngår flytende punktrundeproblemer som kan akkumuleres over den lange perioden av en backtest. Vi må dele alle prisene av PriceParser. PRICEMULTIPLIER for å få de riktige verdiene: Det neste trinnet er å lage KalmanPairsTradingStrategy-klassen. Arbeidet med denne klassen er å bestemme når du skal lage SignalEvent-objekter basert på mottatte BarEvent s fra de daglige OHLCV-barene i TLT og IEI fra Yahoo Finance. Det er mange forskjellige måter å organisere denne klassen på. Jeg har valgt å kode inn alle parametrene i klassen for å få klarhet i forklaringen. Ive bestemte spesielt verdien av delta10 og vt10. De representerer systemstøy og målestøyvarianter i Kalman Filter-modellen. Dette kan også implementeres som et søkeordargument i init-konstruktøren til klassen. En slik tilnærming vil tillate enkel parameteroptimalisering. Den første oppgaven er å sette tid og investerte medlemmer til å være lik None. som de vil bli oppdatert ettersom markedsdata er akseptert og handelssignaler genereres. latestprices er en to-serie av dagens priser på TLT og IEI, som brukes for enkelhets skyld gjennom klassen. Det neste settet av parametere er alle relatert til Kalman-filteret og forklares i dybden i de to foregående artiklene her og her. Det endelige settet med parametere inkluderer dager. pleide å spore hvor mange dager som har gått så vel som antall og curhedgeqty. pleide å spore de absolutte mengder ETFer for å kjøpe for både den lange og den korte siden. Jeg har satt dette til å være 2000 enheter på en egenkapital på 100.000 USD. Den neste metoden setcorrecttimeandprice er en hjelpemetode som brukes for å sikre at Kalman-filteret har all riktig prisinformasjon tilgjengelig på riktig punkt. Dette er nødvendig fordi i et hendelse-drevet backtest system som QSTrader markedsinformasjon ankommer sekvensielt. Vi kan være i en situasjon på dag K hvor vi har mottatt en pris for IEI, men ikke TFT. Derfor må vi vente til både TFT og IEI markedshendelser kommer fra backtest-løkken, gjennom hendelseskøen. I live trading er dette ikke et problem siden de kommer nesten umiddelbart sammenliknet med handelsperioden i noen dager. I en eventdrevet backtest må vi imidlertid vente på at begge prisene skal ankomme før vi beregner den nye Kalman-filteroppdateringen. Koden kontrollerer i hovedsak om den påfølgende hendelsen er for gjeldende dag. Hvis det er, blir den riktige prisen lagt til i den nyeste prislisten av TLT og IEI. Hvis det er en ny dag, tilbakestilles de siste prisene og de riktige prisene blir igjen lagt til. Denne typen husholdningsmetode vil trolig bli absorbert i QSTrader-kodebase i fremtiden, noe som reduserer nødvendigheten av å skrive boilerplate-kode, men for nå må den utgjøre en del av strategien selv. Kjernen i strategien utføres i beregningsmetoden. For det første fastsetter vi de riktige tidspunktene og prisene (som beskrevet ovenfor). Deretter sjekker vi at vi har begge priser for TLT og IEI, hvor vi kan vurdere nye handelssignaler. y er satt lik den siste prisen for IEI, mens F er observasjonsmatrisen som inneholder den siste prisen for TLT, samt en enhet plassholder for å representere avskjæringen i den lineære regresjonen. Kalman-filteret blir senere oppdatert med disse siste prisene. Endelig beregner vi prognosefeilen et og standardavviket av prognosene, sqrt. La oss løpe gjennom denne koden trinn for steg, da det ser litt komplisert ut. Den første oppgaven er å danne skalarverdien y og observasjonsmatrisen F. som inneholder prisene på henholdsvis IEI og TLT. Vi beregner varians-kovariansmatrisen R eller sett den til nullmatrisen hvis den ennå ikke er initialisert. Deretter beregner vi den nye prediksjonen av observasjons yhat, samt prognosefeilen et. Vi beregner deretter variansen av observasjonsforutsigelsene Qt så vel som standardavviket sqrtQt. Vi bruker oppdateringsreglene som er hentet her for å oppnå den bakre fordelingen av statene theta. som inneholder sikringsforhold mellom de to prisene: Til slutt genererer vi handelssignaler basert på verdiene for et og sqrt. For å gjøre dette må vi sjekke hva den investerte statusen er - enten lang, kort eller Ingen. Legg merke til hvordan vi trenger å justere den gjeldende hedge kvantiteten når vi går lang eller kort da hellingen theta0t er konstant justering i tide: Dette er all koden som er nødvendig for Strategi-objektet. Vi må også lage en backtest-fil for å inkapslere all vår handelslogikk og klassevalg. Den spesifikke versjonen er veldig lik de som brukes i eksemplarkatalogen, og erstatter egenkapitalen på 500 000 USD med 100 000 USD. Det endrer også FixedPositionSizer til NaivePositionSizer. Sistnevnte er vant til å akseptere forslagene til absolutte mengder ETF-enheter for handel som bestemt i KalmanPairsTradingStrategy-klassen. I et produksjonsmiljø ville det være nødvendig å justere dette avhengig av porteføljens risikostyringsmål. Her er den fulle koden for kalmanqstraderbacktest. py: Så lenge QSTrader er riktig installert og dataene er lastet ned fra Yahoo Finance, kan koden kjøres via følgende kommando i terminalen: Takket være mange frivillige utviklers innsats, spesielt ryankennedyio og femtotrader. the code is well-optimised for OHLCV bar data and carries out the backtesting rapidly. Strategy Results One of the latest features to be added to QSTrader is that of the tearsheet developed primarily by nwillemse. This feature is still in an early stage of development but will be demonstrated here. A tearsheet is primarily used within institutional settings as a one pager description of a trading strategy. The TearsheetStatistics class in the QSTrader codebase replicates many of the statistics found in a typical strategy performance report. The top two graphs represent the equity curve and drawdown percentage, respectively. Beneath this are the monthly and yearly performance panels. Finally the equity curve, trade-level and time-based statistics are presented: Click the image for a larger view. The equity curve begins relatively flat for the first year of the strategy but rapidly escalates during 2011. During 2012 the strategy becomes significantly more volatile remaining underwater until 2015 and reaching a maximum daily drawdown percentage of 15.79. The performance gradually increases from the maximum drawdown in late 2013 through to 2016. The strategy has a CAGR of 8.73 with a Sharpe Ratio of 0.75. It also has a long maximum drawdown duration of 777 days - over two years Note that this strategy is carried out gross of transaction costs so the true performance would likely be worse. Next Steps There is a lot of research work necessary to turn this into a profitable strategy that we would deploy in a live setting. Potential avenues of research include: Parameter Optimisation - Varying the parameters of the Kalman Filter via cross-validation grid search or some form of machine learning optimisation. However, this introduces the distinct possibility of overfitting to historical data. Asset Selection - Choosing additional, or alternative, pairs of ETFs would help to add diversification to the portfolio, but increases the complexity of the strategy as well as the number of trades (and thus transaction costs). In future articles we will consider how to carry out these procedures for various trading strategies. References 1 Chan, E. P. (2013) Algorithmic Trading: Winning Strategies and their Rationale . Wiley 2 OMahony, A. (2014) Ernie Chans EWAEWC pair trade with Kalman filter . quantopianpostsernie-chans-ewa-slash-ewc-pair-trade-with-kalman-filter Just Getting Started with Quantitative TradingKalman Filter 8211 S038P 500 and Dow Jones Linear Regression Author: Peter C. L. Lin, Ph. D. is an Industry Professor of Financial Engineering at Stevens Institute of Technology. Linear Regression Let8217s get some Kalman filter basics and start playing around with it. There is a long history about least-squares filtering. Like a linear regression model, we can fit the data with a linear function that minimizes the mean-square error. Python pandas can easily do the job: To get some visual of the regression, First observation you might have is: there are two clusters. The light grey indicate the cluster for the SPY-DIA dots in the years from 2000 to 2008 the light purple dots indicate the cluster for years from 2008 to 2015. So the regressed line parameters should not be constant. R. E. Kalman in 60s published his groundbreaking paper to accommodate the time-varying linear models. Also, the framework he proposed can handle noisy measurements (prices) which might distort the fitting result. Nowaday Kalman filter becomes a popular tool for signal processing. To start, let8217s introduce the notation. Let be a sequence of the true intercepts and slopes of the SPY-DIA regression and assume are the prior knowledge associated with and . It is what we believe the time series of and distribution should behave at time following linear transformation. So, from time to time we have We assume follows a normal distribution. If you believe the parameters should be constant over time, then we simply assume is an identity matrix and , which is mean, variance. Now, if and represent the prices at time , we plug and back to the price relationship: where represents the measurement error of the linear regression (becasue the relatinship is never perfactly linear and subjected to many room of interpretation). We also assume follows the normal distribution. Now, let8217s try if we can recreate the oridinary linear regression result. We will use pykalman module. What8217s Next In light of the increasing need for more complicated models to capture prices dynamics, intuition on advanced development is connected with simple cases. Today we set foot in Kalman filter and successfully replicate an ordinary least-squares regression result. Even with noisy price data, Kalman filter has done its first task by smoothing out the signals. Next time we shall start some fundamental pairs trading with Kalman filter. We will consider the nature of streaming financial data feed and build a workable long-short strategy on SampP 500 and Dow Jones ETFs. We will show how Kalman filter generates divergent signals, and how additional latent factors can improve the performance. DEMO IPython notebook Kalman Filter 8211 SampP 500 and Dow Jones Linear Regression Dr. Lin received his MS in Computer Science from Columbia University and his PhD in Applied Mathematics and Statistics from Johns Hopkins University. He is currently a managing director at Gamma Paradigm Capital. Previously, he was a quantitative analyst for fixed-income quantitative portfolio strategies at Ryan Labs Asset Management, a New York-based investment advisor with over 4 Billion assets under management. His research interests include algorithmic trading, interest-rate term-structure modeling, and quantitative portfolio management.
No comments:
Post a Comment