Tuesday, 28 November 2017

Exponential rörliga genomsnittet pandor


Exponentiell rörlig medelvärde Exponentiell rörlig genomsnitts Det exponentiella rörliga genomsnittet skiljer sig från ett enkelt rörligt medelvärde, både med beräkningsmetod och i sättet att priserna vägs. Det exponentiala rörliga medelvärdet (förkortat initialerna EMA) är effektivt ett vägt rörligt medelvärde. Med EMA är viktningen sådan att de senaste dagarnas priser ges större vikt än äldre priser. Teorin bakom detta är att de senaste priserna anses vara viktigare än äldre priser, särskilt som ett långsiktigt enkelt medelvärde (till exempel en 200 dag) placerar lika stor vikt på prisdata som är över 6 månader gamla och kunde troas Av så lite out-of-date. Beräkningen av EMA är lite mer komplex än Simple Moving Average, men har fördelen att en stor registrering av data som täcker varje slutkurs under de senaste 200 dagarna (eller hur många dagar som övervägs) behöver inte hållas . Allt du behöver är EMA för föregående dag och dagens slutkurs för att beräkna det nya exponentiala rörande genomsnittet. Beräkning av exponent Initialt, för EMA, måste en exponent beräknas. Börja med att ta det antal dagar EMA som du vill beräkna och lägg till ett till antalet dagar som du överväger (till exempel för ett 200 dagars glidande medelvärde, lägg till en för att få 201 som en del av beräkningen). Tja, ring detta Days1. Sedan, för att få Exponent, ta bara nummer 2 och dela upp det av Days1. Till exempel Exponent för ett 200 dagars glidande medelvärde skulle vara: 2 201. Vilket är lika med 0,01 Fullberäkning om exponentiell rörlig genomsnittsnivå När vi har fått exponenten är allt vi behöver nu två ytterligare bitar av information för att vi ska kunna utföra fullständig beräkning . Den första är Yesterdays Exponential Moving Average. Tja, antar vi redan vet det som vi skulle ha beräknat det igår. Men om du inte redan är medveten om dagens EMA kan du börja med att beräkna det enkla rörliga genomsnittet för igår och använda det här i stället för EMA för den första beräkningen (dvs. beräkningen av dagen) av EMA. Då imorgon kan du använda EMA du beräknat idag, och så vidare. Den andra informationen vi behöver är dagens slutkurs. Låt oss anta att vi vill beräkna dagens 200 dagars exponentialrörande medelvärde för en aktie eller aktie som har en tidigare dag EMA på 120 pence (eller cent) och en löpande dags stängningskurs på 136 pence. Den fullständiga beräkningen är alltid enligt följande: Dagens exponentiella rörelsemedel (nuvarande dagens slutpris x Exponent) (tidigare dagar EMA x (1-Exponent)) Så, med hjälp av våra exempel ovanstående siffror är dagens 200-dagars EMA: (136 x 0,01 ) (120 x (1-0,01)) Vilket motsvarar en EMA för idag 120.16.Backtesting a Moving Average Crossover i Python med pandas I den tidigare artikeln om Research Backtesting Environments I Python With Pandas skapade vi en objektorienterad forskningsbaserad backtesting Miljö och testade den på en slumpmässig prognosstrategi. I den här artikeln kommer vi att använda sig av den maskin som vi introducerade för att utföra forskning om en faktisk strategi, nämligen Moving Average Crossover på AAPL. Flyttande genomsnittlig Crossover-strategi Den Moving Average Crossover-tekniken är en extremt välkänd förenklad momentumstrategi. Det anses ofta Hello World-exemplet för kvantitativ handel. Strategin som beskrivs här är långsiktig. Två separata enkla glidande medelfilter skapas, med varierande återkopplingsperioder, för en viss tidsserie. Signaler för att köpa tillgången inträffar när det kortare återgåande glidande genomsnittet överstiger det längre återkommande glidande medlet. Om det längre genomsnittet därefter överstiger det kortare genomsnittet säljs tillgången tillbaka. Strategin fungerar bra när en tidsserie går in i en period med stark trend och sedan sakta tillbaka trenden. För det här exemplet har jag valt Apple, Inc. (AAPL) som tidsserier, med en kort lookback på 100 dagar och en lång återgång på 400 dagar. Detta är exemplet från zipline algoritmiska handelsbiblioteket. Således om vi vill implementera vår egen backtester måste vi se till att den matchar resultaten i zipline, som ett grundläggande sätt att validera. Genomförande Se till att du följer den tidigare handledningen här. Som beskriver hur den ursprungliga objekthierarkin för backtesteren är konstruerad, annars fungerar inte koden nedan. För det här genomförandet har jag använt följande bibliotek: Implementeringen av macross. py kräver backtest. py från föregående handledning. Det första steget är att importera de nödvändiga modulerna och objekten: Som i föregående handledning kommer vi att subklassera abstraktionsklassen Strategi för att producera MovingAverageCrossStrategy. Som innehåller alla detaljer om hur man genererar signalerna när de rörliga medelvärdena av AAPL passerar över varandra. Objektet kräver en shortwindow och en longwindow att fungera för. Värdena har ställts till standardvärden på 100 dagar respektive 400 dagar, vilka är samma parametrar som används i huvudexemplet för zipline. De glidande medelvärdena skapas genom att använda pandas rollingmean-funktionen på staplarna. Slutkursen för AAPL-aktien. När de individuella rörliga medeltalen har konstruerats genereras signalen Serie genom att kolumnen är lika med 1,0 när det korta glidande medlet är större än det långa glidande medlet eller 0,0 annars. Från detta kan positioneringsorder genereras för att representera handelssignaler. MarketOnClosePortfolio är subclassed från Portfolio. Som finns i backtest. py. Det är nästan identiskt med det genomförande som beskrivs i föregående handledning, med det undantaget att handeln nu utförs på nära håll, snarare än en öppen till öppen basis. Mer information om hur Portfolio-objektet definieras finns i föregående handledning. Ive lämnade koden för fullständighet och för att hålla denna handledning fristående: Nu när klasserna MovingAverageCrossStrategy och MarketOnClosePortfolio har definierats kommer en huvudfunktion att kallas för att knyta all funktionalitet tillsammans. Dessutom kommer strategins resultat att undersökas via en kurva av aktiekurvan. Pandas DataReader-objekt laddar ner OHLCV-priser på AAPL-lager för perioden 1 januari 1990 till 1 januari 2002, vid vilken tidpunkt signalerna DataFrame skapas för att generera de långsiktiga signalerna. Därefter genereras portföljen med en startkapital på 100 000 USD och avkastningen beräknas på aktiekurvan. Det slutgiltiga steget är att använda matplotlib för att rita en tvåfigurig plot av båda AAPL-priserna, överlagrad med glidande medelvärden och buysellsignaler, samt egenkapitalkurvan med samma buysell-signaler. Plottingskoden tas (och modifieras) från zipline implementeringsexemplet. Kodens grafiska utgång är enligt följande. Jag använde kommandot IPython-klistra för att sätta detta direkt i IPython-konsolen i Ubuntu, så att den grafiska produktionen förblev i sikte. De rosa uptickarna representerar att köpa beståndet, medan de svarta downtickarna representerar att sälja tillbaka: Såsom kan ses, förlorar strategin pengar under perioden, med fem rundturer. Detta är inte förvånande med tanke på AAPL: s beteende under perioden, vilket var en liten nedåtgående trend följt av en signifikant uppgång som började 1998. Utsläppsperioden för de rörliga genomsnittssignalerna är ganska stor och detta påverkade slutproduktens vinst , Vilket annars kan ha gjort strategin lönsam. I efterföljande artiklar kommer vi att skapa ett mer sofistikerat sätt att analysera prestanda, samt beskriva hur man optimerar utkikningsperioderna för de individuella rörliga genomsnittssignalerna. Just Getting Started med kvantitativa TradingComputational Tools Analogt har DataFrame en metod för att beräkna parvisa covariances bland serierna i DataFrame, även exklusive NAnull-värden. Om man antar att de saknade data saknas slumpmässigt resulterar detta i en uppskattning av kovariansmatrisen som är opartisk. För många tillämpningar kan dock denna uppskattning inte vara acceptabel eftersom den uppskattade kovariansmatrisen inte är garanterad att vara positiv halvt bestämd. Detta kan leda till beräknade korrelationer med absoluta värden som är större än en, och eller en icke-inverterbar kovariansmatris. Se Beräkning av kovariansmatriser för mer information. DataFrame. cov stöder också ett valfritt sökord med minperioder som anger det önskade minimala antalet observationer för varje kolumnpar för att få ett giltigt resultat. De vikter som används i fönstret anges av wintypsordet. Listan över erkända typer är: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (behöver beta) gaussian (behöver std) generalgaussian (behöver kraft, bredd) slepian (behöver bredd). Observera att rutan är lika med medelvärdet (). För vissa fönsterfunktioner måste ytterligare parametrar anges: För. sum () med en vinstyp. Det finns ingen normalisering gjord till vikterna för fönstret. Passande anpassade vikter av 1, 1, 1 ger ett annat resultat än passande vikter av 2, 2, 2. till exempel. När man passerar en vinstyp istället för att uttryckligen specificera vikterna, är vikterna redan normaliserade så att den största vikten är 1. I motsats är naturen av. mean () beräkningen sådan att vikterna normaliseras i förhållande till varandra. Vikter av 1, 1, 1 och 2, 2, 2 ger samma resultat. Time-aware Rolling Nytt i version 0.19.0. Nytt i version 0.19.0 är förmågan att överföra en förskjutning (eller konvertibel) till en. rolling () - metod och få den att producera fönster med variabel storlek baserat på det löpande tidsfönstret. För varje tidpunkt inkluderar detta alla föregående värden som uppträder inom det angivna tidsintervallet. Detta kan vara särskilt användbart för ett icke-regelbundet tidsfrekvensindex. Detta är ett vanligt frekvensindex. Med hjälp av ett heltal fönster arbetar parametern att rulla längs fönstervakten. Att ange en förskjutning medger en mer intuitiv specifikation av rullfrekvensen. Genom att använda ett icke-regelbundet men fortfarande monotoniskt index, ger det inte någon särskild beräkning att rulla med ett heltal. Genom att använda tidsspecifikationen skapas variabla fönster för denna sparsamma data. Dessutom tillåter vi nu en valfri parameter för att ange en kolumn (snarare än indexets standard) i en DataFrame. Time-aware Rolling vs Resampling Användning. rolling () med ett tidsbaserat index är ganska likt resampling. De opererar och utför reduktiva operationer på tid indexerade pandasobjekt. När du använder. rolling () med en förskjutning. Förskjutningen är ett tids-delta. Ta ett fönster i bakåt-i-tiden och summera alla värden i det fönstret (inklusive slutpunkten, men inte startpunkten). Detta är det nya värdet på den tiden i resultatet. Dessa är fönster med variabel storlek i tidrymden för varje punkt i ingången. Du får samma resultat som ingången. När du använder. resample () med en förskjutning. Konstruera ett nytt index som är offsetens frekvens. För varje frekvensfack pekar aggregat från inmatningen i ett bakåtblickande fönster som faller i facket. Resultatet av denna aggregering är utgången för den frekvenspunkten. Fönstren är fast storlek i frekvensutrymmet. Ditt resultat kommer att ha formen av en vanlig frekvens mellan min och max för det ursprungliga inmatningsobjektet. För att sammanfatta. Rullande () är en tidsbaserad fönsteroperation, medan. resample () är en frekvensbaserad fönsteroperation. Centrering av Windows Som standard är etiketterna inställda i den högra kanten av fönstret, men ett centralsökord är tillgängligt så att etiketterna kan ställas in i mitten. Binära fönsterfunktioner cov () och corr () kan beräkna flyttningsfönsterstatistik om två serier eller någon kombination av DataFrameSeries eller DataFrameDataFrame. Här är beteendet i varje fall: två serier. Beräkna statistiken för parningen. DataFrameSeries. Beräkna statistiken för varje kolumn i DataFrame med den överförda serien och returnerar därmed en DataFrame. DataFrameDataFrame. Beräkna statistiken för att matcha kolumnnamn som standard, och returnera en DataFrame. Om sökordsargumentet pairwiseTrue passeras beräknar du statistiken för varje par kolumner och returnerar en panel vars objekt är aktuella datum (se nästa avsnitt). Rullande parvisa kovarianer och korrelationer I finansiell dataanalys och andra områden är it8217s vanliga för att beräkna kovarians - och korrelationsmatriser för en samling av tidsserier. Ofta är man också intresserad av kovarians - och korrelationsmatriser i rörfönstret. Detta kan göras genom att passera det parvisa sökordsargumentet, vilket i fallet med DataFrame-ingångar kommer att ge en panel vars föremål är aktuella datum. I fallet med ett enda DataFrame-argument kan det parvisa argumentet utelämnas: Missande värden ignoreras och varje post beräknas med de parvisa fullständiga observationerna. Vänligen se kovariansavsnittet för försiktighetsåtgärder i samband med denna metod för beräkning av kovarians - och korrelationsmatriser. Förutom att inte ha en fönsterparameter, har dessa funktioner samma gränssnitt som deras. rolling motsvarigheter. Precis som ovan är parametrarna alla accepterar: minperiod. Tröskeln för icke-nollpunktpunkter som krävs. Standardvärden som krävs för att beräkna statistik. Inga NaNs kommer att matas ut när minperioder med icke-null-datapunkter har visats. Centrum. Booleska, om du vill ställa in etiketterna i mitten (standard är False). Utgången från. rolling och. expanding-metoderna returnerar inte en NaN om det finns minst minvärden icke-null-värden i det aktuella fönstret. Detta skiljer sig från cumsum. cumprod. cummax. Och cummin. Som returnerar NaN i utgången där en NaN uppträder i ingången. En expanderande fönsterstatistik kommer att vara stabilare (och mindre mottaglig) än dess rullande fönster motsvarighet, eftersom den ökande fönsterstorleken minskar den relativa effekten av en enskild datapunkt. Som exempel är här den genomsnittliga () - utmatningen för den tidigare tidsserien dataset: Exponentiellt viktad Windows En relaterad uppsättning funktioner är exponentiellt viktade versioner av flera av ovanstående statistik. Ett liknande gränssnitt för. rolling och. expanding nås via. ewm-metoden för att ta emot ett EWM-objekt. Ett antal expanderande EW (exponentiellt viktade) metoder tillhandahålls: Tack för att du skickade EMA. Och ja, TAlib borde verkligen vara tillgänglig. Det finns lite arbete på detta som faktiskt ser väldigt lovande ut (githubquantopianziplinepull100). Jag kommer att försöka dra in det här snart för att göra det tillgängligt för en större publik. Materialet på denna webbplats är endast avsedd för informationsändamål och utgör inte ett erbjudande att sälja, en uppmaning att köpa, eller en rekommendation eller godkännande för någon säkerhet eller strategi. Det utgör inte heller ett erbjudande att tillhandahålla investeringsrådgivning av Quantopian. Dessutom ger materialet ingen åsikt med avseende på lämpligheten av någon säkerhet eller specifik investering. Quantopian ger inga garantier om riktigheten eller fullständigheten av synpunkterna på webbplatsen. Synpunkterna kan komma att ändras och kan ha blivit opålitliga av olika skäl, inklusive förändringar i marknadsförhållanden eller ekonomiska förhållanden. Alla investeringar innebär risk, inklusive förlust av huvudstol. Du bör rådgöra med en investerare professionell innan du fattar några investeringsbeslut. Det gör det. Men det mesta av arbetet med att räkna ut det bästa sättet är redan gjort. Vi behöver bara slutföra det. Därefter är det bara en massa copyamppaste att pakka hela TAlib-biblioteket. Det finns många bra saker i arbetena för att ta itu med vissa kortkomlingar. Det är en fråga om resurser för det mesta. Materialet på denna webbplats är endast avsedd för informationsändamål och utgör inte ett erbjudande att sälja, en uppmaning att köpa, eller en rekommendation eller godkännande för någon säkerhet eller strategi. Det utgör inte heller ett erbjudande att tillhandahålla investeringsrådgivning av Quantopian. Dessutom ger materialet ingen åsikt med avseende på lämpligheten av någon säkerhet eller specifik investering. Quantopian ger inga garantier om riktigheten eller fullständigheten av synpunkterna på webbplatsen. Synpunkterna kan komma att ändras och kan ha blivit opålitliga av olika skäl, inklusive förändringar i marknadsförhållanden eller ekonomiska förhållanden. Alla investeringar innebär risk, inklusive förlust av huvudstol. Du bör rådgöra med en investerare professionell innan du fattar några investeringsbeslut.

No comments:

Post a Comment