Wednesday, 18 October 2017

Exponential glidande medelvärde numpy


Detta är ett Python-omslag för TA-LIB baserat på Cython istället för SWIG. Från hemsidan: TA-Lib används ofta av handelsutvecklare som behöver utföra teknisk analys av finansmarknadsdata. Innehåller 150 indikatorer som ADX, MACD, RSI, Stochastic, Bollinger Bands, etc. Candlestick-mönsterigenkänning Open-source API för CC, Java, Perl, Python och 100 Managed De ursprungliga Pythonbindningarna använder SWIG som tyvärr är svåra att installera och arent så effektiva som de kunde vara. Därför använder detta projekt Cython och Numpy för att effektivt och rent binda till TA-Lib-producerande resultat 2-4 gånger snabbare än SWIG-gränssnittet. Installera TA-Lib eller läsa dokumenten Liknande TA-Lib, ger funktionsgränssnittet ett lättviktspaket av de exponerade TA-Lib-indikatorerna. Varje funktion returnerar en utsignal och har standardvärden för sina parametrar, om inte specificeras som sökordsargument. Typiskt kommer dessa funktioner att ha en initial lookback-period (ett nödvändigt antal observationer innan en produktion genereras) inställd på NaN. Alla följande exempel använder funktion API: Beräkna ett enkelt glidande medelvärde av de stängda priserna: Beräkna bollingerband, med triple exponentiell glidande medelvärde: Beräkna momentum av de stängda priserna, med en tidsperiod på 5: Sammanfattning API Snabbstart Om du som redan är bekant med att använda funktionen API, borde du känna dig riktigt hemma med hjälp av abstrakt API. Varje funktion har samma inmatning, skickad som en ordbok för Numpy-arrays: Funktioner kan antingen importeras direkt eller instantieras med namn: Därifrån är samtalsfunktioner i stort sett samma som funktion API: Läs om mer avancerad användning av TA-Lib här . Stödda indikatorer Vi kan visa alla TA-funktioner som stöds av TA-Lib, antingen som en lista eller som en dikt sorterad efter grupp (t. ex. Överlappsstudier, Momentumindikatorer, etc): FunktionsgrupperA En enkel tidsserieanalys av SampP 500 Index I detta bloggpost väl undersöka några vanliga tekniker som används i tidsserieanalys genom att tillämpa dem på en dataset som innehåller dagliga stängningsvärden för SampP 500 börsindex från 1950 fram till idag. Målet är att utforska några av de grundläggande idéerna och koncepten från tidsserieanalysen och observera deras effekter när de tillämpas på en verklig världsdatasats. Även om det inte är möjligt att faktiskt förutse förändringar i indexet med hjälp av dessa tekniker kan de idéer som presenteras här teoretiskt användas som en del av en större strategi som innefattar många ytterligare variabler för att genomföra en regression eller maskininlärning. Tidsserieanalys är en gren av statistik som innefattar resonemang om beställda sekvenser av relaterade värden för att extrahera meningsfull statistik och andra egenskaper hos data. Den används inom ett brett spektrum av discipliner inklusive ekonometri, signalbehandling, väderprognoser och i stort sett alla andra fält som innefattar tidsseriedata. Dessa tekniker används ofta för att utveckla modeller som kan användas för att försöka förutse framtida värden för en serie, antingen ensamma eller i samverkan med andra variabler. För att komma igång kan vi ladda ner data först. Jag fick den historiska datamängden från Yahoo Finance. som innehåller en länk för att ladda ner hela saken som en. csv-fil. Nu kan vi ladda upp datasatsen och ta en titt. Jag använder flera populära Python-bibliotek för analysen, så hela koden finns i Python. Uppgifterna är i omvänd kronologisk ordning så jag sorterade efter datum och sedan ställa in indexet för dataramen till datumkolumnen. Om du tittar på data finns det flera fält, men bara fokusera på slutkursen. Låt oss pröva uppgifterna först och se hur det ser ut. Den första uppenbara sak att notera, bortsett från de två jätte dipsna vid svansänden som motsvarar marknadskrascherna 2002 och 2008, är att uppgifterna är tydligt icke-stationära. Det här är meningsfullt för marknadsdata eftersom det tenderar att gå upp på lång sikt mer än det går ner. Detta är ett problem för tidsserieanalys men som icke-stationär data är svår att motivera. Det första vi kan prova är en första skillnad i serien. Med andra ord, subtrahera det tidigare värdet t-1 från det nuvarande värdet t för att få skillnaden d (t). Uppgifterna verkar inte längre trenden över tiden och istället centreras runt 0. Det finns ett annat problem dock. Titta på variansen. Dess mycket små tidigt och ständigt ökar över tiden. Detta är ett tecken på att data inte bara är icke-stationär men också exponentiellt ökande. Storleken på de dagliga variationerna för närvarande dvärger fullständigt förändringarnas storlek år 1950. För att hantera detta, använd en loggtransformation till den ursprungliga serien. Så det ger oss det ursprungliga slutkurset med en loggtransform som används för att plana data från en exponentiell kurva till en linjär kurva. Ett sätt att visuellt se effekten som loggen transformen hade är att analysera variansen över tiden. Vi kan använda en rullande variansstatistik och jämföra både originalserien och den loggade serien. Observera att vi inte kan se några av variationerna fram till slutet av 80-talet i toppgrafen. I nedre grafen är det emellertid en annan historia, förändringar i värdet tydligt synliga i hela datasatsen. Ur denna synpunkt är det klart att vår omvandling har gjort variansen relativt konstant. Nu kan vi se de tidigare variationerna i datasatsen ganska lite bättre än tidigare. Vi behöver fortfarande ta den första skillnaden, men vi kan beräkna det från den loggade serien. Mycket bättre Vi har nu en stationär tidsseriemodell av dagliga ändringar i SampP 500 indexet. Nu kan vi skapa vissa lagvariabler y (t-1), y (t-2) etc. och undersöka deras relation till y (t). Tja titta på 1 och 2-dagars lags tillsammans med veckovisa och månatliga lags att leta efter säsongseffekter. Ett intressant visuellt sätt att utvärdera förhållandet mellan fördröjda variabler är att göra en scatterplot av den ursprungliga variabeln vs den fördröjda variabeln och se var fördelningen ligger. Vi kan göra detta med en gemensam tomt med havsbottenpaketet. Lägg märke till hur tätt packad massan är omkring 0. Det verkar också vara ganska jämnt fördelat - marginalfördelningarna på båda axlarna är ungefär normala. Detta tycks indikera att veta att indexvärdet en dag inte berättar mycket om vad det kommer att göra nästa dag. Det kommer förmodligen inte som någon överraskning att det finns mycket liten korrelation mellan värdeförändringen från en dag till nästa. Även om jag inte skrev ut dem här, visar de andra försvunna variablerna som vi skapade ovan liknande resultat. Det kan finnas ett förhållande till andra lagringssteg som vi inte har försökt, men det är opraktiskt att testa varje möjligt lagvärde manuellt. Lyckligtvis finns en klass av funktioner som systematiskt kan göra det för oss. Auto-korrelationsfunktionen beräknar korrelationen mellan en variabel och sig vid varje lag upp till en viss gräns (i detta fall 40). Den partiella autokorrelationsfunktionen beräknar korrelationen vid varje fördröjningssteg som inte redan förklaras av tidigare lagringssteg i tidigare ordning. Vi kan plotta resultaten för att se om det finns några signifikanta korrelationer. Resultaten för automatisk korrelation och partiell autokorrelation ligger väldigt nära varandra (jag förstod bara resultaten för automatisk korrelation ovan). Vad detta visar är att det inte finns någon signifikant (0,2) korrelation mellan värdet vid tid t och när som helst före t upp till 40 steg bakom. I ord ord är serien en slumpmässig promenad. En annan intressant teknik vi kan försöka är en sönderdelning. Det här är en teknik som försöker bryta ner en tidsserie i trend-, säsongs - och restfaktorer. Statsmodeller kommer med en sönderdelningsfunktion ur lådan. Eftersom vi inte ser någon riktig cykel i data, är visualiseringen inte så effektiv i det här fallet. För data där detta är ett starkt säsongsmönster men det kan vara mycket användbart. Folling-instansen, till exempel, är ett urval av statistikmodellens dokumentation som visar koldioxidutsläppsdata över tiden. Nedbrytningen är mycket mer användbar i detta fall. Det finns tre klart tydliga komponenter i tidsserierna - en trendlinje, en säsongsjustering och restvärden. Var och en av dessa skulle behöva redovisas och modelleras på lämpligt sätt. Att återgå till våra lagerdata konstaterades redan att det var en slumpmässig promenad och att våra försvunna variabler inte verkar ha stor inverkan, men vi kan fortfarande försöka montera några ARIMA-modeller och se vad vi får. Låt oss börja med en enkel rörlig genomsnittsmodell. Så vid första anblicken verkar det som om den här modellen gör det ganska bra. Men även om prognoserna ser ut som om prognoserna är väldigt nära (linjerna är nästan oskiljaktiga trots allt), kom ihåg att vi använde den odefinierade serien. Indexet fluktuerar endast en liten procentuell andel dagligen i förhållande till det totala absoluta värdet. Det vi verkligen vill ha är att förutsäga den första skillnaden eller de dagliga rörelserna. Vi kan antingen springa om modellen med hjälp av den differentierade serien eller lägga till en I-term till ARIMA-modellen (vilket resulterar i en (1, 1, 0) modell) som ska utföra samma sak. Låt oss försöka använda den olika serien. Det är lite svårt att berätta, men det ser ut att våra prognostiserade förändringar i allmänhet är mycket mindre än de faktiska förändringarna. Det kan vara värt att titta närmare på en delmängd av data för att se vad som verkligen händer. Så nu är det ganska uppenbart att prognosen är långt ifrån. Var förutspådde små lilla variationer i förhållande till vad som faktiskt händer dag-till-dag. Återigen är detta mer av mindre förväntat med en enkel rörlig genomsnittsmodell av en slumpmässig gångtidsserie. Det finns inte tillräckligt med information från de föregående dagarna för att exakt förkasta vad som händer nästa dag. En rörlig genomsnittsmodell verkar inte göra så bra. Vad sägs om en exponentiell utjämningsmodell Exponentiell utjämning sprider effekten av tidigare värden med hjälp av exponentiell viktning, så saker som hände nyligen är mer effektiva än saker som hände för länge sedan. Kanske är denna smartare form av medelvärde mer exakt. Du kan nog gissa svaret. om det var så enkelt att förutsäga aktiemarknaden var det så enkelt att alla skulle göra det. Som jag nämnde ovanpå var det inte meningen att man kunde förutse att man kan förutsäga marknaden med dessa tekniker, utan att visa vilka typer av analys man kanske skulle kunna Använd när du bryter ner tidsseriedata. Tidsserieanalys är ett mycket rikt fält med mycket mer teknisk analys än vad jag gick in här (mycket av vilken jag fortfarande lär mig). Om du är intresserad av att göra en djupare dyka, rekommenderar jag dessa anteckningar från en professor på Duke. Många av vad jag lärde mig om fältet jag hämtade upp från att läsa online-resurser som den här. Slutligen är den ursprungliga källkoden från detta inlägg värd på GitHub här. tillsammans med en mängd andra bärbara datorer. Känn dig fri att kolla in Följ mig på twitter för att få nya postuppdateringar. Genomförande av batch Normalisering i Tensorflödet Tis 29 mars 2016 Batch normalisering, som beskrivs i mars 2015 papper (BN2015 papperet) av Sergey Ioffe och Christian Szegedy, är en enkel och effektivt sätt att förbättra prestanda hos ett neuralt nätverk. I BN2015-pappret visar Ioffe och Szegedy att batchstandardisering möjliggör användningen av högre inlärningsnivåer, fungerar som reguljärare och kan påskynda träning med 14 gånger. I det här inlägget visar jag hur man genomför batch normalisering i Tensorflow. Redigera 071216. Ive har uppdaterat det här inlägget för att täcka beräkningen av populationens medelvärde och varians vid testtiden mer detaljerat. Redigera 020816. Om du letar efter återkommande satsvis normalisering (dvs från Cooijmans et al. (2016)) har jag laddat upp en fungerande Tensorflow-implementering här. Den enda knepiga delen av implementeringen, jämfört med den matematiska satsens normalisering presenterade detta inlägg, lagrar separata populationvariabler för olika tidssteg. Problemet Batch-normalisering är avsett att lösa följande problem: Förändringar i modellparametrar under inlärning ändrar fördelningarna av utgångarna för varje doldt lager. Detta innebär att senare lager måste anpassas till dessa (ofta bullriga) förändringar under träningen. Batch normalisering i korthet För att lösa detta problem prover BN2015-papperet batchnormaliseringen av ingången till aktiveringsfunktionen för varje nuron (t ex varje sigmoid eller ReLU-funktion) under träning, så att ingången till aktiveringsfunktionen över varje träningsbatch har ett medelvärde av 0 och en varians av 1. Till exempel skulle tillämpning av sats normalisering till aktiveringen (sigma (Wx b)) resultera i (sigma (BN (Wx b))) där (BN) är batch normaliserande transform. Batch normaliserings transformen För att normalisera ett värde över ett parti (dvs att partiet normaliserar värdet) subtraherar vi satsvärdet, (muB). och dela resultatet med batchstandardavvikelsen (sqrt). Observera att en liten konstant (epsilon) läggs till variansen för att undvika att dividera med noll. Sålunda är den initiala satsvis normaliserande transformen av ett givet värde, (xi). är: BN (xi) frac Eftersom den ovan angivna batch normaliserande transformen begränsar ingångarna till aktiveringsfunktionen till en föreskriven normalfördelning, kan detta begränsa lagrets representativa kraft. Därför tillåter vi nätverket att ångra batch normaliserings transformen genom att multiplicera med en ny skala parameter (gamma) och lägga till en ny shift parameter (beta). (gamma) och (beta) är lärbara parametrar. Lägga till i (gamma) och (beta) som producerar följande slutliga batch normaliserande transform: BN (xi) gamma (frac) beta Genomförande av batch normalisering i Tensorflow Vi lägger till batch normalisering till ett grundläggande helt anslutet neuralt nätverk som har två dolda lager 100 neuroner vardera och visar ett liknande resultat som i figur 1 (b) och (c) i BN2015-papperet. Observera att det här nätverket ännu inte är allmänt lämpat för användning vid testtiden. Se avsnittet Att göra förutsägelser med modellen belwo för anledningen, samt en fast version. Import, config

No comments:

Post a Comment