Python pandy wykładniczo ruchoma średnia


Backtesting Moving Average Crossover w Pythonie z pandami W poprzednim artykule na temat Research Backtesting Environments W Pythonie Z Pandami stworzyliśmy zorientowane obiektowo, oparte na badaniach środowisko backtesting i przetestowaliśmy je na losowej strategii prognozowania. W tym artykule wykorzystamy wprowadzone przez nas maszyny do przeprowadzania badań dotyczących rzeczywistej strategii, a mianowicie średniej ruchomej crossover w AAPL. Średnia ruchoma strategia Crossovera Technika Crossover z ruchomą średnią to niezwykle znana uproszczona strategia momentum. Często jest uważany za przykład dla handlu ilościowego w Hello World. Przedstawiona tutaj strategia jest długa. Tworzone są dwa oddzielne proste filtry ruchome o różnych okresach ważności dla poszczególnych szeregów czasowych. Sygnały do ​​zakupu zasobu występują, gdy krótsza średnia krocząca z wyprzedzeniem przekracza dłuższą średnią zrewidowania. Jeśli dłuższa średnia przekroczy później krótszą średnią, składnik aktywów zostaje odsprzedany. Strategia działa dobrze, gdy szeregi czasowe wchodzą w okres silnego trendu, a następnie powoli odwracają trend. W tym przykładzie wybrałem Apple Inc. (AAPL) jako serię czasową, z krótkim podsumowaniem 100 dni i długim podsumowaniem 400 dni. Jest to przykład udostępniany przez zipline algorytmiczną bibliotekę handlową. Dlatego jeśli chcemy wdrożyć naszą własną analizę historyczną, musimy upewnić się, że jest ona zgodna z wynikami w zipline, jako podstawowym środkiem walidacji. Wdrożenie Pamiętaj, aby postępować zgodnie z poprzednim tutorialem tutaj. który opisuje, w jaki sposób konstruowana jest hierarchia obiektu początkowego dla backtestera, w przeciwnym razie poniższy kod nie zadziała. Do tej konkretnej implementacji wykorzystałem następujące biblioteki: Implementacja macross. py wymaga backtest. py z poprzedniego samouczka. Pierwszym krokiem jest zaimportowanie niezbędnych modułów i obiektów: tak jak w poprzednim tutorialu zamierzamy dokonać podklasy abstrakcyjnej klasy bazowej strategii w celu stworzenia MovingAverageCrossStrategy. który zawiera wszystkie szczegóły dotyczące generowania sygnałów, gdy średnie ruchome AAPL krzyżują się ze sobą. Obiekt wymaga krótkiego okna i długiego okna do obsługi. Wartości zostały ustawione na wartości domyślne odpowiednio 100 dni i 400 dni, które są tymi samymi parametrami, które są używane w głównym przykładzie zipline. Średnie ruchome są tworzone za pomocą funkcji pandas rollingmean w barachClose cena zamknięcia akcji AAPL. Po skonstruowaniu indywidualnych średnich ruchomych, seria sygnałów jest generowana przez ustawienie kolumny równej 1,0, gdy krótka średnia ruchoma jest większa niż długa średnia ruchoma, lub 0,0 w przeciwnym razie. Na tej podstawie można generować zlecenia pozycji w celu przedstawienia sygnałów handlowych. MarketOnClosePortfolio jest podklasą z Portfolio. który znajduje się w backtest. py. Jest prawie identyczna z implementacją opisaną w poprzednim samouczku, z tym wyjątkiem, że transakcje są teraz przeprowadzane w trybie Close-to-Close, a nie Open-to-Open. Aby uzyskać szczegółowe informacje na temat definiowania obiektu Portfolio, zobacz poprzedni samouczek. Zostawiłem kod pod kątem kompletności i utrzymania tego samouczka w formie niezależnej: Teraz, gdy zdefiniowano klasy MovingAverageCrossStrategy i MarketOnClosePortfolio, zostanie wywołana główna funkcja, aby powiązać wszystkie funkcje. Ponadto wyniki strategii zostaną zbadane za pomocą wykresu krzywej kapitału własnego. Obiekt Pandas DataReader pobiera ceny ALCL dla cen AAPL za okres od 1 stycznia 1990 r. Do 1 stycznia 2002 r., W którym to momencie tworzone są sygnały DataFrame w celu generowania sygnałów długookresowych. Następnie portfel jest generowany z początkową bazą kapitałową 100 000 USD, a zwroty są obliczane na krzywej kapitału. Ostatnim krokiem jest użycie matplotlib do wykreślenia dwucyfrowego wykresu obu cen AAPL, nałożonego na ruchome średnie i sygnały kupna, a także krzywej kapitału z tymi samymi sygnałami kupna. Kod kreślenia jest pobierany (i modyfikowany) z przykładu wdrożenia zip. Graficzne dane wyjściowe kodu są następujące. Użyłem polecenia wklejania IPython, aby umieścić go bezpośrednio w konsoli IPython w systemie Ubuntu, aby graficzne wyjście pozostało w widoku. Różowe uptyki oznaczają kupowanie akcji, a czarne wyprzedaże oznaczają ich sprzedaż. Jak widać, strategia traci pieniądze w tym okresie, z pięcioma transakcjami w obie strony. Nie jest to zaskakujące, biorąc pod uwagę zachowanie się AAPL w tym okresie, które cechuje niewielka tendencja spadkowa, po którym nastąpił znaczny wzrost od 1998 r. Okres zwrotu sygnałów średniej ruchomej jest dość duży, co wpłynęło na zysk z ostatniej transakcji. , które w przeciwnym razie mogło uczynić strategię opłacalną. W kolejnych artykułach stworzymy bardziej wyrafinowany sposób analizowania wydajności, a także opis sposobu optymalizacji okresów ważności poszczególnych sygnałów średniej ruchomej. Rozpoczęcie handlu ilościowego Wygładzanie z wykładniczo ważonymi średnimi kroczącymi Średnia ruchoma zajmuje głośne szeregi czasowe i zastępuje każdą wartość średnią wartością okolicy o danej wartości. Ta okolica może składać się z czysto historycznych danych lub może być wyśrodkowana wokół danej wartości. Ponadto wartości w sąsiedztwie mogą być ważone przy użyciu różnych zestawów odważników. Oto przykład równie ważonej trzypunktowej średniej kroczącej, z wykorzystaniem danych historycznych, Tutaj reprezentuje wygładzony sygnał i reprezentuje głośny szereg czasowy. W przeciwieństwie do prostych średnich kroczących, ważona ruchoma średnia z wykładaniem (EWMA) koryguje wartość zgodnie z wykładniczo ważoną sumą wszystkich poprzednich wartości. To jest podstawowa idea, jest to miłe, ponieważ nie musisz martwić się o to, że masz okno z trzema punktami, zamiast okienka pięciopunktowego, lub martwić się o odpowiedniość twojego schematu ważenia. Z EWMA, poprzednie perturbacje 8220remembered, 8221 i 8220slowno zapomniane, 8221 przez termin w ostatnim równaniu, podczas gdy z oknem lub sąsiedztwem z dyskretnymi granicami, perturbacja jest zapomniana, jak tylko wyjdzie z okna. Uśrednianie EWMA w celu uwzględnienia trendów Po przeczytaniu o EWMA w książce analizy danych, z radością korzystałem z tego narzędzia na każdej aplikacji do wygładzania, którą spotkałem. Dopiero później dowiedziałem się, że funkcja EWMA jest rzeczywiście odpowiednia tylko dla danych stacjonarnych, tj. Danych bez trendów lub sezonowości. W szczególności funkcja EWMA opiera się trendom oddalonym od aktualnej średniej, która wynosi 8220 już 8221. Tak więc, jeśli masz hałaśliwą funkcję w zakresie od 0, do 1, a następnie z powrotem do 0, funkcja EWMA zwróci niskie wartości po stronie podniesienia i wysokie wartości po stronie zejścia. Jednym ze sposobów obejścia tego problemu jest wygładzenie sygnału w obu kierunkach, marsz do przodu, a następnie marsz w tył, a następnie uśrednienie dwóch. Tutaj użyjemy funkcji EWMA dostarczonej przez moduł pandy. Holt-Winters Drugie zamówienie EWMA A oto jakiś kod Pythona implementujący metodę drugiego rzędu Holt-Winters na innej hałaśliwej funkcji, jak poprzednio. Post navigation Ostatnie posty Narzędzia obliczeniowe Analogicznie, DataFrame ma metodę cov do obliczania kowariancji parami wśród serii w DataFrame, również z wyłączeniem wartości NAnull. Zakładając, że brakujące dane nie są losowe, powoduje to oszacowanie macierzy kowariancji, która jest bezstronna. Jednak w wielu zastosowaniach oszacowanie to może nie być do przyjęcia, ponieważ nie można zagwarantować, że oszacowana macierz kowariancji będzie dodatnią pół-określoną. Może to prowadzić do estymacji korelacji o wartościach bezwzględnych większych niż jeden oraz o niewymiennej macierzy kowariancji. Zobacz Estymacja macierzy kowariancji, aby uzyskać więcej szczegółów. DataFrame. cov obsługuje również opcjonalne słowo kluczowe minperiods, które określa wymaganą minimalną liczbę obserwacji dla każdej pary kolumn, aby uzyskać prawidłowy wynik. Wagi używane w oknie są określone przez słowo kluczowe wintype. Lista uznanych typów to: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (needs beta) gaussian (needs std) generalgaussian (needs power, width) slepian (needs width). Zauważ, że okno wagonu jest równoważne średniemu (). W przypadku niektórych funkcji okienkowych należy określić dodatkowe parametry: Dla. sum () z typem wintype. nie ma normalizacji dla wag dla okna. Przekazywanie niestandardowych wag o wartości 1, 1, 1 przyniesie inny wynik niż podanie masy 2, 2, 2. Na przykład. Podczas przechodzenia przez typ wintype zamiast jawnego określania wag, wagi są już znormalizowane, tak że największa waga wynosi 1. W przeciwieństwie do tego, charakter obliczania. mean () jest taki, że wagi są znormalizowane względem siebie. Ciężary 1, 1, 1 i 2, 2, 2 dają ten sam wynik. Śledzenie czasu Nowość w wersji 0.19.0. Nowością w wersji 0.19.0 jest możliwość przekazania przesunięcia (lub konwersji) do metody. rolling () i umożliwienia tworzenia okien o zmiennym rozmiarze w oparciu o okno czasu. Dla każdego punktu czasowego obejmuje to wszystkie poprzednie wartości występujące we wskazanej przedziale czasowym. Może to być szczególnie przydatne w przypadku nieregularnego wskaźnika częstotliwości czasowej. Jest to regularny indeks częstotliwości. Użycie parametru okna całkowitoliczbowego powoduje ruch wzdłuż częstotliwości okna. Określenie przesunięcia umożliwia bardziej intuicyjne określenie częstotliwości obrotu. Używając nieregularnego, ale wciąż monotonicznego indeksu, walcowanie z oknem całkowitym nie daje żadnych specjalnych obliczeń. Użycie specyfikacji czasu generuje zmienne okna dla tych rozrzedzonych danych. Ponadto teraz zezwalamy na opcjonalny parametr, który określa kolumnę (a nie domyślną wartość indeksu) w DataFrame. Świadomość czasu Przetaczanie a ponowne próbkowanie Używanie. rolling () z indeksem opartym na czasie jest podobne do resamplingu. Obaj operują i wykonują operacje redukcyjne na obiektach z pandami indeksowanych czasowo. Podczas korzystania z. rolling () z offsetem. Przesunięcie jest przesunięciem czasowym. Wyświetl okno czasu do tyłu i zagreguj wszystkie wartości w tym oknie (w tym punkt końcowy, ale nie punkt początkowy). Jest to nowa wartość w tym punkcie wyniku. Są to okna o zmiennej wielkości w przestrzeni czasowej dla każdego punktu wejścia. Otrzymasz taki sam wynik jak dane wejściowe. Podczas korzystania z. resample () z offsetem. Zbuduj nowy indeks, który jest częstotliwością offsetu. Dla każdego przedziału częstotliwości agreguj punkty z danych wejściowych w oknie do wyświetlania w czasie, które mieszczą się w tym przedziale. Wynikiem tej agregacji jest wynik dla tego punktu częstotliwości. Okna mają stały rozmiar w przestrzeni częstotliwości. Twój wynik będzie miał regularną częstotliwość między minimalnym a maksymalnym początkowym obiektem wejściowym. Podsumowując. rolling () jest oparta na czasie operacją okna, podczas gdy. resample () jest operacją okna opartą na częstotliwości. Centrowanie systemu Windows Domyślnie etykiety są ustawione na prawą krawędź okna, ale dostępne jest słowo kluczowe centrum, aby etykiety mogły być ustawione pośrodku. Binarne funkcje okienne cov () i corr () mogą obliczać statystykę ruchomego okna dla dwóch Serii lub dowolnej kombinacji DataFrameSeries lub DataFrameDataFrame. Oto zachowanie w każdym przypadku: dwie serie. obliczyć statystykę parowania. DataFrameSeries. obliczyć statystyki dla każdej kolumny DataFrame z przekazanymi Seriami, zwracając w ten sposób DataFrame. DataFrameDataFrame. domyślnie oblicz statystyki dla dopasowywania nazw kolumn, zwracając DataFrame. Jeśli argument argumentu paramiTrue zostanie przekazany, oblicza statystyki dla każdej pary kolumn, zwracając panel, którego elementami są podane daty (patrz następna sekcja). Obliczanie kowariancji i korelacji kołysania parami W analizie danych finansowych i innych dziedzinach wspólne jest obliczanie macierzy kowariancji i korelacji dla zbioru szeregów czasowych. Często interesuje się również kowariancją i macierzą korelacji ruchomych okien. Można to zrobić, przekazując par kluczowy argument słowa kluczowego, który w przypadku danych wejściowych DataFrame da panel, którego pozycje są datami, o których mowa. W przypadku pojedynczego argumentu DataFrame argument parowania można nawet pominąć: Brakujące wartości są ignorowane, a każdy wpis jest obliczany przy użyciu pełnych obserwacji parami. Proszę zapoznać się z sekcją kowariancji dla zastrzeżeń związanych z tą metodą obliczania macierzy kowariancji i korelacji. Oprócz braku parametru window funkcje te mają te same interfejsy co ich odpowiedniki. rolling. Podobnie jak powyżej, parametry, które wszyscy akceptują to: minperiods. próg niezerowych punktów danych wymagających. Domyślne minimum wymagane do obliczenia statystyki. Żadne NaN nie będą wyprowadzane, gdy minperiod pojawią się nie-puste punkty danych. centrum. boolean, czy ustawić etykiety w środku (domyślnie jest Fałsz) Dane wyjściowe metod. rolling i. expanding nie zwracają wartości NaN, jeśli w bieżącym oknie są co najmniej wartości minimalne w miniodiodach. Różni się to od kumulacji. cumprod. cummax. i cummin. które zwracają NaN na wyjściu, gdy na wejściu napotkamy NaN. Rozszerzająca się statystyka okna będzie bardziej stabilna (i mniej responsywna) niż jego odpowiednik w oknie toczenia, ponieważ powiększający się rozmiar okna zmniejsza względny wpływ pojedynczego punktu danych. Jako przykład, tutaj jest wynik mean () dla poprzedniego zestawu danych szeregów czasowych: Exponentowo ważony Windows Powiązany zestaw funkcji to wykładniczo ważone wersje kilku z powyższych statystyk. Podobny interfejs do. rolling i. expanding jest dostępny za pośrednictwem metody. ewm do odbioru obiektu EWM. Udostępniono kilka rozszerzających się metod EW (wykładniczo ważonych): Dziękujemy za wysłanie EMA. I tak, TAlib powinien być naprawdę dostępny. Trwają prace nad tym, co wygląda bardzo obiecująco (githubquantopianziplinepull100). Postaram się to wkrótce wprowadzić, aby udostępnić ją większej publiczności. Materiały na tej stronie mają jedynie charakter informacyjny i nie stanowią oferty sprzedaży, zaproszenia do kupna lub rekomendacji lub poparcia dla jakiegokolwiek zabezpieczenia lub strategii, ani nie stanowią oferty świadczenia usług doradztwa inwestycyjnego przez Quantopian. Ponadto materiał nie zawiera opinii na temat przydatności jakiegokolwiek zabezpieczenia lub konkretnej inwestycji. Quantopian nie gwarantuje dokładności ani kompletności opinii wyrażonych na stronie internetowej. Opinie mogą ulec zmianie i mogą stać się niewiarygodne z różnych powodów, w tym ze zmian warunków rynkowych lub sytuacji gospodarczej. Wszystkie inwestycje wiążą się z ryzykiem, w tym z utratą kapitału. Przed podjęciem jakichkolwiek decyzji inwestycyjnych powinieneś skonsultować się z inwestorem. To robi. Ale większość pracy nad znalezieniem najlepszej drogi jest już wykonana. Musimy to sfinalizować. Potem jest po prostu spora pasta do kopiowania, aby zawinąć całą bibliotekę TAlib. Jest wiele dobrych rzeczy w pracy, aby zaradzić pewnym niedociągnięciom. Jest to w większości kwestia zasobów. Materiały na tej stronie mają jedynie charakter informacyjny i nie stanowią oferty sprzedaży, zaproszenia do kupna lub rekomendacji lub poparcia dla jakiegokolwiek zabezpieczenia lub strategii, ani nie stanowią oferty świadczenia usług doradztwa inwestycyjnego przez Quantopian. Ponadto materiał nie zawiera opinii na temat przydatności jakiegokolwiek zabezpieczenia lub konkretnej inwestycji. Quantopian nie gwarantuje dokładności ani kompletności opinii wyrażonych na stronie internetowej. Opinie mogą ulec zmianie i mogą stać się niewiarygodne z różnych powodów, w tym ze zmian warunków rynkowych lub sytuacji gospodarczej. Wszystkie inwestycje wiążą się z ryzykiem, w tym z utratą kapitału. Przed podjęciem jakichkolwiek decyzji inwestycyjnych powinieneś skonsultować się z inwestorem.

Comments

Popular Posts