Thursday 10 August 2017

Beräkna Glidande-Medelvärde Python


Vi introducerade tidigare hur man skapar glidande medelvärden med python. Denna handledning kommer att vara en fortsättning på detta ämne. Ett glidande medelvärde i statistikens sammanhang, även kallat ett rullande löpande medelvärde, är en typ av finitivt impulsrespons. I vår tidigare handledning har vi ritat värdena för arraysna x och y: Let8217s plottar x mot det glidande medlet av y som vi ska ringa yMA: För det första utjämnar let8217s längden på båda arraysna: Och för att visa detta i sammanhang: Den resulterande graf: För att förstå detta, let8217s plot två olika relationer: x vs y och x vs MAy: det glidande medelvärdet här är det gröna diagrammet som börjar vid 3: Dela detta: Gilla detta: Postnavigering Lämna ett svar Avbryt svar Mycket användbart I skulle vilja läsa den sista delen på stora dataset Hoppas det kommer snart att bli bloggare så här: Jag är på väg att skapa en Forex trading algoritm och ville försöka mitt skott vid beräkning av EMA (Exponentential Moving Average). Mina resultat verkar vara korrekta (jämfört med beräkningarna jag gjorde för hand) så jag tror att följande metod fungerar, men ville bara få en extra uppsättning ögon för att jag inte missar något. Observera att detta bara returnerar EMA för det senaste priset, det returnerar inte en rad EMA-enheter, eftersom det inte är vad jag behöver för min ansökan. Rekursion är ett bra verktyg för rätt jobb, men här används det för att uppnå enkel looping. Som sådan koden. Är svårare att läsa och motivera. är långsammare eftersom mycket av koden i ema bara behöver springa en gång. kommer att misslyckas med tillräckligt stort värde i fönstret på grund av överflödande Pythons call stack. Vänligen ange åtminstone parametrarna för varje funktion, t. ex. Det här fönstret är längden på fönstret, och den positionen räknas bakåt från slutet av data. (Faktum är att saker skulle vara tydligare om positionen var ett normalt framåtriktat index i data) Höj ett undantag när du hittar en parameter har ett ogiltigt värde. Returnera None istället kommer bara att orsaka ett mer förvirrande undantag senare. Faktum är att om jag försöker indikatorer (). Ema (closeprices, 600) får jag oändlig recursion eftersom sma returnerar None. vilket gör ema call sma om och om igen. Den föregående punkten avslöjar också att om len (data) lt fönster 2 inte är rätt validitetskontroll. Den 1 i data-window2 1: - window 1 verkar inte korrekt för mig. Jag antar att du vill ha data-window2: - window Uttalandet returnera tidigareema är på en udda plats eftersom du då har beräknat ett nytt aktuellt ämne. Detta är basfallet av rekursionen, och det är vanligt att hantera basfallet först. Mitt förslag till ema: svarat 26 nov 14 kl 18:56 Ganska grundlig granskning: Du behöver inte skriva en klass för vad du gör (och jag föreslår att du tittar på den här videon). Din klass inkapslar inte någon data och du använder den bara för att få dina funktioner i samma enhet. Jag antar att saker skulle lättare förstå om du skulle definiera klassmetod för att göra det uppenbart att du inte kommer att förlita dig på någon som helst orsak. Men ett ännu bättre alternativ skulle vara att bara definiera funktioner i en indikatormodul. svarat nov 24 14 kl 18:04 Tack för de förslag som jag faktiskt hade dem som classmethods och debatterade gå fram och tillbaka mellan även med en klass eller bara definiera funktioner i en indikatormodul (som jag nu ska göra). ndash ChrisC Nov 25 14 at 19:12 Bara tittade på videon också, bra saker. ndash ChrisC Nov 25 14 på 19:43 Ditt svar 2017 Stack Exchange, IncLets säger att jag har en lista: Jag vill skapa en funktion som beräknar det rörliga n-dagsmedlet. Så om n var 5, skulle jag vilja att min kod ska beräkna de första 1-5, lägg till den och hitta medelvärdet, vilket skulle vara 3,0, gå vidare till 2-6, beräkna medelvärdet, vilket skulle vara 4,0, sedan 3 -7, 4-8, 5-9, 6-10. Jag vill inte beräkna de första n-1 dagarna, så från och med den nionde dagen räknas de tidigare dagarna. Detta verkar skriva ut vad jag vill: Men jag vet inte hur man beräknar siffrorna i de här listorna. Några idéer frågade 14 feb 13 kl 21:05 Medan jag gillar Martijns svar på detta, som george, undrade jag om detta inte skulle bli snabbare genom att använda en löpande summering istället för att använda summan () om och om igen på mestadels samma nummer . Även idén om att ha Inga värden som standard under rampfasen är intressant. Faktum är att det kan finnas många olika scenarier som man kan tänka sig för att flytta medelvärden. Låt oss dela upp beräkning av medelvärden i tre faser: Ramp Up: Starta iterationer där den aktuella iterationen räknas lt fönsterstorlek Stabil framsteg: Vi har exakt fönsterstorlek antal element tillgängliga för att beräkna ett normalt genomsnitt: summa (xiteration counter-windowsize: iteration counter) windowsize Ramp Down: Vid slutet av ingångsdata kunde vi återvända till en annan windowsize - 1 genomsnittligt antal. Heres en funktion som accepterar godtyckliga iterables (generatorer är fina) som input för data Godtyckliga fönsterstorlekar 1 Parametrar för att koppla bort produktion av värden under faserna för Ramp UpDown Callback funktioner för dessa faser för att styra hur värden produceras. Detta kan användas för att ständigt tillhandahålla en standard (t. ex. Ingen) eller för att ge partiella medelvärden. Det verkar vara lite snabbare än Martijns-versionen - vilket är mycket elegantare. Heres testkoden: Den ursprungliga frågan kan nu lösas med detta funktionssamtal: Besvarad 18 feb 13 kl 18:15 Använd summa - och kartfunktionerna. Kartfunktionen i Python 3 är i grunden en lat version av detta: Jag är säker på att du kan gissa vad summafunktionen gör. svarat 14 feb 13 kl 21:07 Ett tillvägagångssätt som undviker att omräkna mellanliggande belopp .. gör det löpande (int (v)). sedan. repr (runsumlistk - runsumlistk-5) 5) om du myrar att bära runt siffror en strängar .. Alt utan det globala: var noga med att göra flytande matte även om du anger värden är heltal svarade 14 feb 13 kl 22:04 summanalgoritmen är snabbare. Jag har skrivit ett svar som visar din poäng. Det finns bara inget behov av en global variabel här. ndash cfi 18 feb 13 kl 18:16 rätt du är, jag försökte för svårt att aviod en explicit loop. ndash agentp 19 feb 13 kl 18:37 Det finns en annan lösning som förlänger ett itertools recept parvis (). Du kan förlänga detta till nwise (). vilket ger dig glidfönstret (och fungerar om det iterable är en generator): Medan en relativt hög uppställning kostar för korta iterabla s minskar denna kostnad i följd ju längre datauppsättningen. Detta använder summa () men koden är ganska elegant: svarat 26 november kl 14: 59Backtesting 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 verklig strategi, nämligen Moving Average Crossover på AAPL. Moving Average Crossover Strategy 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 återkänningsperioder, för en viss tidsserie. Signaler för att köpa tillgången inträffar när det kortare återkörningsgennomsnittet överstiger det längre återkommande glidmedlet. 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 den tidigare handledningen 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 pandans rollingmean-funktion 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 i 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-objektet hämtar 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 startkapitalbaserad kapital på 100 000 USD och avkastningen beräknas på aktiekurvan. Det sista steget är att använda matplotlib för att rita en tvåfigurig plot av båda AAPL-priserna, överlagrad med de glidande medelvärdena och buysell-signalerna, 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 pink upticksna representerar inköp av lageret, 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 resultatet av den slutliga handeln , 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. Bara komma igång med kvantitativ handel

No comments:

Post a Comment