Friday 3 November 2017

Exponential moving average python


To jest wrapper Pythona dla TA-LIB na podstawie Cython zamiast SWIG. Ze strony głównej: TA-Lib jest szeroko wykorzystywany przez deweloperów handlu, którzy muszą przeprowadzić analizę techniczną danych z rynku finansowego. Obejmuje 150 wskaźników, takich jak ADX, MACD, RSI, Stochastic, Bollinger Bands, itp. Rozpoznawanie wzorca świecowego Open-source API dla CC, Java, Perl, Python i 100 Managed Oryginalne powiązania Pythona używają SWIG, który niestety jest trudny do zainstalowania i nie jest tak efektywne, jak tylko mogą być. Dlatego ten projekt wykorzystuje Cython i Numpy do wydajnego i czystego powiązania z TA-Lib - wytwarzając wyniki 2-4 razy szybciej niż interfejs SWIG. Zainstaluj TA-Lib lub przeczytaj dokument Podobnie jak w przypadku TA-Lib, interfejs funkcji zapewnia lekkie opakowanie z odsłoniętymi wskaźnikami TA-Lib. Każda funkcja zwraca tablicę wyjściową i ma wartości domyślne dla ich parametrów, chyba że podano jako argumenty słów kluczowych. Zazwyczaj funkcje te będą miały początkowy okres obserwacji (wymaganą liczbę obserwacji przed wygenerowaniem wyniku) ustawioną na NaN. Wszystkie poniższe przykłady wykorzystują funkcję API: Oblicz prostą średnią ruchomą cen zamknięcia: Obliczanie przedziałów rygla z potrójną wykładniczą średnią kroczącą: Obliczanie dynamiki cen zamknięcia, z przedziałem czasowym 5: Streszczenie API Szybki start Jeśli jesteś już zaznajomieni z korzystaniem z funkcji API, powinieneś czuć się jak w domu używając abstrakcyjnego API. Każda funkcja przyjmuje takie same dane wejściowe, przekazywane jako słownik tablic Numpy: funkcje mogą być importowane bezpośrednio lub tworzone przez nazwę: Stamtąd funkcje wywołujące są zasadniczo takie same jak funkcje API: Dowiedz się o bardziej zaawansowanym użyciu TA-Lib tutaj . Obsługiwane wskaźniki Możemy pokazać wszystkie funkcje pomocy technicznej obsługiwane przez TA-Lib, albo jako listę lub jako dykt sortowane według grup (np. Badania nakładania się, wskaźniki momentu itd.): Grupy funkcyjne Rozdział 2: Typy danych i referencje Języki programowania i aplikacje dane. Zdefiniujemy aplikacje do pracy z danymi i musimy mieć pojemniki, które można wykorzystać do przechowywania. Ten rozdział dotyczy definiowania kontenerów i wykorzystywania ich do pracy z danymi aplikacji. Niezależnie od tego, czy dane, których używamy, pochodzą z wpisu z klawiatury, czy też pracujemy z bazą danych, musi istnieć sposób tymczasowego zapisania jej w naszych programach, aby można było nią manipulować i używać. Kiedy już będziemy pracować z danymi, te tymczasowe pojemniki mogą zostać zniszczone, aby zrobić miejsce dla nowych konstrukcji. Zacznij od przyjrzenia się różnym typom danych oferowanych przez język Python, a następnie omówmy, jak korzystać z tych danych po ich zebraniu i zapisaniu. Porównujemy i porównujemy różne typy struktur, które mamy w naszym arsenale, oraz podajemy kilka przykładów struktur, które można wykorzystać do pracy z różnymi typami danych. Istnieje wiele zadań, które można wykonać za pomocą list, słowników i krotek, a my postaramy się je omówić. Kiedy nauczysz się definiować i wykorzystywać te struktury, dobrze powiedz o tym, co się z nimi stanie, gdy nie będą już potrzebne naszej aplikacji. Rozpocznijmy naszą podróż w poszukiwaniu typów danych i struktur w języku programowania Python. są to umiejętności, z których będziesz korzystać w każdym praktycznym programie Jython. Python Data Types Jak omówiliśmy, istnieje potrzeba przechowywania i manipulowania danymi w programach. Aby to zrobić, musimy również mieć możliwość tworzenia kontenerów używanych do przechowywania tych danych, aby program mógł z nich korzystać. Język musi wiedzieć, jak obsługiwać dane po ich zapisaniu, i możemy to zrobić, przypisując typ danych do naszych kontenerów w Javie. Jednak w Pythonie nie jest to wymagane, ponieważ tłumacz jest w stanie określić, jaki rodzaj danych przechowujemy w sposób dynamiczny. Tabela 2-1 zawiera listę poszczególnych typów danych i krótki opis cech, które je definiują. Tabela 2-1. Python Data Types Listy, słowniki, zestawy i listy krotek, słowniki, zestawy i krotki oferują podobną funkcjonalność i użyteczność, ale każda z nich ma własną niszę w języku. Przejrzyjmy kilka przykładów każdego z nich, ponieważ wszystkie one odgrywają ważną rolę w pewnych okolicznościach. W przeciwieństwie do łańcuchów, wszystkie kontenery omówione w tej sekcji (z wyjątkiem krotek) są zmiennymi obiektami, więc można nimi manipulować po ich utworzeniu. Ponieważ te pojemniki są tak ważne, dobrze przejść przez ćwiczenie na końcu tego rozdziału, co da ci szansę na wypróbowanie ich dla siebie. Być może jedną z najczęściej używanych konstrukcji w języku programowania Python jest lista. Większość innych języków programowania zapewnia podobne pojemniki do przechowywania i manipulowania danymi w aplikacji. Lista w języku Python zapewnia przewagę nad podobnymi konstrukcjami dostępnymi w statycznie napisanych językach. Dynamiczne tendencje języka Python pomagają konstruować listy, aby wykorzystać wielką cechę posiadania zdolności do zawarcia wartości różnych typów. Oznacza to, że można użyć listy do przechowywania dowolnego typu danych Pythona, a typy te można mieszać w ramach jednej listy. W innych językach ten typ konstrukcji jest często definiowany jako obiekt maszynowy, który blokuje konstrukcję do używania tylko jednego typu danych. Tworzenie i używanie list w Pythonie jest takie samo jak reszta języka. bardzo prosty i łatwy w użyciu. Po prostu przypisanie zestawu pustych nawiasów kwadratowych do zmiennej tworzy pustą listę. Możemy również użyć wbudowanej funkcji list () do utworzenia listy. Listę można budować i modyfikować podczas uruchamiania aplikacji, nie są one zadeklarowane ze statyczną długością. Można je łatwo przeglądać za pomocą pętli, a indeksy mogą być również używane do umieszczania lub usuwania poszczególnych pozycji z listy. Zacznij od pokazania przykładowych list definiujących, a następnie przejdź przez każdą z różnych ścieżek, które zapewnia język Python do pracy z listami. Listing 2-7. Definiowanie list Jak już wspomniano, w celu uzyskania wartości z listy możemy skorzystać z indeksów. Podobnie jak Array w języku Java, użycie notacji listindex pozwoli nam uzyskać dostęp do elementu. Jeśli chcemy uzyskać zakres lub zestaw wartości z listy, możemy podać indeks początkowy i końcowy indeks. Ta technika jest również znana jako krojenie. Co więcej, możemy również zwrócić zestaw wartości z listy wraz ze schematem krokowym, dostarczając również indeks kroków. Jednym kluczem do zapamiętania jest to, że podczas dostępu do listy poprzez indeksowanie, pierwszy element na liście jest zawarty w indeksie 0. Zauważ, że podczas krojenia listy zawsze zwracana jest nowa lista. Jednym ze sposobów utworzenia płytkiej kopii listy jest użycie notacji plastra bez określania górnej lub dolnej granicy. Dolna granica domyślnie przyjmuje wartość zero, a górna granica domyślna do długości listy. Zwróć uwagę, że płytka kopia tworzy nowy obiekt złożony (listę lub inny obiekt zawierający obiekty), a następnie wstawia do niego odwołania do oryginalnych obiektów. Głęboka kopia tworzy nowy obiekt złożony, a następnie wstawia do niego kopie na podstawie obiektów znalezionych w oryginale. Listing 2-8. Dostęp do listy Modyfikowanie listy jest bardzo podobne, możesz użyć indeksu w celu wstawienia lub usunięcia pozycji z określonej pozycji. Istnieje również wiele innych sposobów wstawiania lub usuwania elementów z listy. Python dostarcza każdej z tych różnych opcji, ponieważ zapewniają one różne funkcje dla twoich operacji. Możesz użyć metody append () w celu dodania elementu na końcu listy. Metoda extend () pozwala na dodanie kopii całej listy lub sekwencji na końcu listy. Na koniec metoda insert () umożliwia umieszczenie elementu lub innej listy na określonej pozycji istniejącej listy przy użyciu indeksów pozycyjnych. Jeśli inna lista zostanie wstawiona do istniejącej listy, to nie jest ona łączona z oryginalną listą, ale działa jako oddzielny element zawarty na oryginalnej liście. Poniżej znajdziesz przykłady poszczególnych metod. Podobnie mamy wiele opcji usuwania elementów z listy. Instrukcja del, jak wyjaśniono w rozdziale 1, może być użyta do usunięcia lub usunięcia całej listy lub wartości z listy przy użyciu notacji indeksu. Możesz również użyć metody pop () lub remove (), aby usunąć pojedyncze wartości z listy. Metoda pop () usunie pojedynczą wartość z końca listy, a także zwróci tę wartość w tym samym czasie. Jeśli do funkcji pop () zostanie dostarczony indeks, to usunie i zwróci wartość z tego indeksu. Metoda remove () może zostać użyta do znalezienia i usunięcia określonej wartości z listy. Innymi słowy, remove () usunie pierwszy pasujący element z listy. Jeśli więcej niż jedna wartość na liście odpowiada wartości przekazanej do funkcji remove (), pierwsza zostanie usunięta. Inną informacją na temat funkcji remove () jest to, że usunięta wartość nie jest zwracana. Spójrzmy na te przykłady modyfikacji listy. Listing 2-10. Modyfikowanie listy Teraz, gdy wiemy, jak dodawać i usuwać elementy z listy, nadszedł czas, aby nauczyć się manipulować danymi w nich. Python udostępnia wiele różnych metod, które mogą pomóc nam w zarządzaniu naszymi listami. Tabela 2-4 zawiera listę tych funkcji i ich możliwości. Tabela 2-4. Metody list Pythona Przyjrzyjmy się kilku przykładom wykorzystania tych funkcji na listach. Listing 2-11. Korzystanie z funkcji listy Przemieszczanie i wyszukiwanie list Poruszanie się po liście jest dość proste. Gdy lista jest wypełniona, często chcemy ją przetrawić i wykonać pewne działanie przeciwko każdemu elementowi w niej zawartemu. Możesz użyć dowolnego z konstruktów pętli Pythona do przechodzenia przez każdy element na liście. Chociaż dostępnych jest wiele opcji, pętla for działa wyjątkowo dobrze. Wynika to z prostej składni, z której korzysta pętla Python for. Ta sekcja pokaże Ci, jak przejść przez listę używając każdej z różnych konstrukcji pętli Pythona. Przekonasz się, że każdy z nich ma zalety i wady. Przyjrzyjmy się najpierw składni używanej do przechodzenia przez listę za pomocą pętli for. Jest to zdecydowanie jeden z najłatwiejszych sposobów przechodzenia przez każdą z wartości zawartych na liście. Pętla for przesuwa listę o jeden element na raz, pozwalając programistom wykonać pewne działanie na każdym elemencie, jeśli jest to pożądane. Listing 2-12. Przemierzanie listy za pomocą pętli Jak widać na tym prostym przykładzie, łatwo jest przejść przez listę i pracować z każdym elementem osobno. Składnia pętli for wymaga zmiennej, do której każdy element na liście zostanie przypisany dla każdego przebiegu pętli. Możliwe jest również łączenie krojenia z użyciem pętli for. W takim przypadku po prostu użyj wycinka listy, aby pobrać dokładnie te elementy, które chcemy zobaczyć. Na przykład spójrz na poniższy kod, który przechodzi przez pierwszych 5 elementów na naszej liście. Jak widać, zrobienie tego jest dość łatwe dzięki wykorzystaniu wbudowanych funkcji oferowanych przez Python. Spójrz na listę Jak widzieliśmy w poprzedniej sekcji, możemy utworzyć kopię listy za pomocą cięcia. Innym skuteczniejszym sposobem na to jest ze zrozumieniem listy. Istnieje kilka zaawansowanych funkcji list, które mogą ułatwić życie programistom. Jedna z takich funkcji jest znana jako zrozumienie listy. Chociaż koncepcja ta może być początkowo zniechęcająca, stanowi dobrą alternatywę do ręcznego tworzenia wielu oddzielnych list. Wyrażenia listowe pobierają określoną listę, a następnie iterują ją i stosują dane wyrażenie do każdego z obiektów na liście. Listing 2-14. Proste rozumienie listy Jak widać, pozwala to na szybkie zrobienie listy i zmianę jej za pomocą dostarczonego wyrażenia. Oczywiście, podobnie jak w przypadku wielu innych metod Pythona, zrozumienie listy zwraca zmienioną kopię listy. Zrozumienie listy tworzy nową listę, a oryginalna lista pozostaje nietknięta. Przyjrzyjmy się składni dla zrozumienia list. Zasadniczo składają się one z pewnego rodzaju wyrażenia, po którym następuje instrukcja for, a następnie opcjonalnie więcej instrukcji for lub if. Podstawową funkcjonalnością rozumienia list jest iteracja po elementach listy, a następnie zastosowanie niektórych wyrażeń na każdy z elementów listy. Syntaktycznie, zrozumienie listowe brzmi następująco: Iteruj przez listę i opcjonalnie wykonuj wyrażenie na każdym elemencie, następnie albo zwróć nową listę zawierającą otrzymane elementy, albo oceń każdy element z opcjonalną klauzulą. Listing 2-15. Używanie klauzuli If w zrozumieniu listy Przyjrzyjmy się kilku kolejnym przykładom. Kiedy już zobaczysz spisane rozumienia w akcji, na pewno je zrozumiesz i zobaczysz, jak przydatne mogą być. Listing 2-16. Zrozumienie listy w języku Python Zrozumienie listy może uczynić kod znacznie bardziej zwięzłym i umożliwia zastosowanie wyrażeń lub funkcji do łatwego wyświetlania elementów. Przyjrzyjmy się przykładowi napisanemu w Javie dla wykonywania tego samego rodzaju pracy, co zrozumienie list. Zrozumiałe jest, że zrozumienie list jest dużo bardziej zwięzłe. Listing 2-17. Kod Java, aby zrobić listę wiekową i dodać rok do każdego wieku Krotki są bardzo podobne do list, ale są niezmienne. Po zdefiniowaniu krotki nie można jej zmienić. Zawierają indeksy podobne do list, ale znowu nie można ich zmienić po zdefiniowaniu. Dlatego indeks w krotce może być użyty do pobrania określonej wartości, a nie do przypisania lub modyfikacji. Chociaż krotki mogą wyglądać podobnie do list, są całkiem inne, ponieważ krotki zawierają zwykle elementy heterogeniczne, natomiast listy często zawierają elementy, które są w jakiś sposób powiązane. Na przykład, powszechnym przypadkiem użycia dla krotek jest przekazanie parametrów do funkcji, metody i tak dalej. Ponieważ tuple są członem typu sekwencji, mogą używać tego samego zestawu metod, operacji dostępnych dla wszystkich typów sekwencji. Listing 2-18. Przykłady krotek Jak wspomniano wcześniej, krotki mogą być całkiem przydatne do przekazywania funkcji, metod, klas i tak dalej. Często miło jest mieć niezmienny obiekt do przekazywania wielu wartości. Jednym z takich przypadków byłoby użycie krotki do przekazywania współrzędnych w systemie informacji geograficznej lub innego rodzaju aplikacji. Są również przyjemne w użyciu w sytuacjach, w których gwarantowany jest niezmienny obiekt. Ponieważ są one niezmienne, ich rozmiar nie rośnie po zdefiniowaniu, więc krotki mogą również odgrywać ważną rolę, gdy przydzielanie pamięci jest problemem. Słowniki Słownik w języku Python jest kontenerem składnicy kluczy i wartości. Słownik jest zupełnie inny niż typowa lista w Pythonie, ponieważ nie ma automatycznie wypełnianego indeksu dla dowolnego elementu w słowniku. Podczas korzystania z listy nie musisz przejmować się przypisywaniem indeksu do żadnej wartości, która jest w nim umieszczona. Słownik umożliwia programistom przypisanie indeksu lub klucza do każdego elementu umieszczonego w konstrukcie. Dlatego każde wejście do słownika wymaga dwóch wartości, klucza i elementu. Piękno słownika polega na tym, że pozwala programistom wybrać typ danych kluczowej wartości. Dlatego, jeśli chcemy użyć ciągu znaków lub dowolnego innego przedmiotu, takiego jak wartość int lub float jako klucza, jest to całkowicie możliwe. Słowniki mają również wiele metod i operacji, które można zastosować w celu ułatwienia pracy z nimi. Tabela 2-5 zawiera listę metod i funkcji słownika. Listing 2-19. Przykłady podstawowych słowników Tabela 2-5. Słownik Metody i funkcje Zakres jest specjalną funkcją, która pozwala na iterację pomiędzy zakresami liczb lub wyszczególnienie określonego zakresu liczb. Jest to szczególnie przydatne do wykonywania iteracji matematycznych, ale może być również używane do prostych iteracji. Format korzystania z funkcji zakresu obejmuje opcjonalny numer początkowy, numer końcowy i opcjonalny numer kroku. Jeśli jest określony, numer początkowy wskazuje zakres, od którego ma się rozpocząć, podczas gdy numer końcowy określa, gdzie powinien się kończyć. Indeks początkowy jest włączony, a indeks końcowy nie. Opcjonalny numer kroku informuje o tym, ile liczb należy umieścić między każdą liczbą zawartą w wyjściowym zakresie. Numer kroku zostanie dodany do poprzedniego numeru i jeśli liczba ta przekroczy punkt końcowy, zakres zostanie zatrzymany. Listing formatu zakresu 2-24. Korzystanie z funkcji Range Jednym z najczęstszych zastosowań tej funkcji jest pętla for. Poniższy przykład pokazuje kilka sposobów użycia funkcji zakresu w kontekście pętli for. Listing 2-25. Korzystanie z funkcji zasięgu w pętli for Jak widać, można użyć zakresu, aby dokonać iteracji przez niemal dowolny zestaw liczb. być w górę lub w dół, pozytywnie lub negatywnie w kroku. Zakresy to także dobry sposób tworzenia listy liczb. W tym celu wystarczy przekazać zakres do listy (), jak pokazano w poniższym przykładzie. Listing 2-26. Utwórz listę z zakresu Jak widać, nie tylko są to zakresy przydatne do celów iteracyjnych, ale są również dobrym sposobem na tworzenie list numerycznych. Kolekcje specyficzne dla Jython Istnieje wiele obiektów kolekcji specyficznych dla Jython, które są dostępne do użycia. Większość z tych obiektów kolekcji jest używana do przekazywania danych do klas Java i tak dalej, ale dodają one dodatkową funkcjonalność do implementacji Jython, która pomoże nowym użytkownikom Python pochodzącym ze środowiska Java. Niemniej jednak wiele z tych dodatkowych obiektów kolekcji może być użyteczne w pewnych sytuacjach. W wydaniu Jython 2.2 wprowadzono integrację kolekcji Java. Umożliwia to dwukierunkową interakcję między typami kolekcji Jython i Java. Na przykład Java ArrayList może być importowana w języku Jython, a następnie używana tak, jakby była częścią języka. Przed wersją 2.2 obiekty kolekcji Java mogły działać jako obiekt Jython, ale obiekty Jython nie mogły działać jako obiekty Java. Na przykład możliwe jest użycie Java ArrayList w Jython i użycie metod takich jak add (), remove () i get (). W poniższym przykładzie zobaczysz, że użycie metody add () tablicy ArrayList spowoduje dodanie elementu do listy i zwrócenie wartości logicznej, która wskaże na sukces lub niepowodzenie dodawania. Metoda remove () działa podobnie, z tym wyjątkiem, że usuwa element zamiast go dodawać. Listing 2-27. Przykład zastosowania Java Oriented Collection w Jython Przed integracją kolekcji Java, Jython zaimplementował także obiekt jarray, który zasadniczo pozwala na zbudowanie tablicy Javy w Jythonie. Aby pracować z jarray, po prostu zdefiniuj typ sekwencji w Jython i przekaż go do obiektu jarray wraz z typem obiektu zawartego w sekwencji. The jarray jest zdecydowanie przydatny do tworzenia tablic Java, a następnie przekazywania ich do obiektów java, ale nie jest zbyt użyteczny do pracy w obiektach Jython. Co więcej, wszystkie wartości wewnątrz zgarniacza muszą być tego samego typu. Jeśli spróbujesz przekazać sekwencję zawierającą wiele typów do szuflady, otrzymasz charakter TypeError tego lub innego rodzaju. Zobacz Tabelę 2-8, aby zapoznać się z listą kodów typów używanych z zagłuszeniem. Tabela 2-8. Kody znaków znaków do użycia z Jarray Inną użyteczną cechą jarray jest to, że możemy tworzyć puste tablice, jeśli chcemy, używając metody zeros (). Metoda zeros () działa w sposób podobny do metody array (), którą już wykazaliśmy. Aby utworzyć tablicę, która jest pusta, wystarczy przekazać długość tablicy wraz z typem do metody zeros (). Przyjrzyjmy się przykładowi. Listing 2-29. Utwórz pustą tablicę logiczną 2-30. Stwórz pustą tablicę całkowitą W pewnych okolicznościach podczas pracy z obiektami Java będziesz musiał wywołać metodę Java, która wymaga tablicy Java jako argumentu. Korzystanie z obiektu jarray pozwala na prosty sposób tworzenia tablic Java w razie potrzeby. Obiekty plików służą do odczytu i zapisu danych do pliku na dysku. Obiekt pliku służy do uzyskania odniesienia do pliku na dysku i otwarcia go do odczytu, zapisu, dodania lub szeregu różnych zadań. Jeśli po prostu użyjemy funkcji open (filename, mode), możemy zwrócić obiekt pliku i przypisać go do zmiennej do przetworzenia. Jeśli plik jeszcze nie istnieje na dysku, zostanie automatycznie utworzony. Argument mode służy do określenia typu przetwarzania, które chcemy wykonać na pliku. Ten argument jest opcjonalny i jeśli zostanie pominięty, plik zostanie otwarty w trybie tylko do odczytu. Patrz Tabela 2-9. Tabela 2-9. Tryby operacji dla typów plików Istnieje wiele metod, które można wykorzystać w obiektach plików do manipulowania zawartością pliku. Możemy wywołać read (size) w pliku, aby odczytać jego zawartość. Rozmiar jest tu opcjonalnym argumentem i służy do określenia, ile treści ma odczytać z pliku. Jeśli zostanie pominięty, odczytana zostanie cała treść pliku. Do odczytu pojedynczej linii z pliku można użyć metody readline (). readlines (size) służy do zwracania listy zawierającej wszystkie linie danych zawarte w pliku. Ponownie istnieje opcjonalny parametr rozmiaru, który może być użyty do określenia liczby bajtów z pliku do odczytania. Jeśli chcemy umieścić zawartość w pliku, metoda write (string) właśnie to robi. Metoda write () zapisuje ciąg do pliku. Podczas zapisywania do pliku często ważne jest, aby dokładnie wiedzieć, w której pozycji w pliku, do którego zamierzasz pisać. Istnieje grupa metod, które pomagają nam w pozycjonowaniu w pliku przy użyciu liczb całkowitych do reprezentowania bajtów w pliku. Metodę tell () można wywołać w pliku, aby nadać obiektom bieżącą pozycję. Liczba całkowita zwrócona jest w liczbie bajtów i jest przesunięciem od początku pliku. Metoda seek (offset, from) może być użyta do zmiany pozycji w pliku. Przesunięcie to liczba w bajtach pozycji, którą chcesz przejść, a od reprezentuje miejsce w pliku, z którego chcesz obliczyć przesunięcie. Jeśli od równego 0, to przesunięcie zostanie obliczone od początku pliku. Podobnie, jeśli jest równe 1, to jest obliczane z bieżącej pozycji pliku, a 2 pochodzi z końca pliku. Wartością domyślną jest 0, jeśli z zostało pominięte. Wreszcie, ważne jest, aby efektywnie alokować zasoby w nasze programy lub będziemy ponosić koszty pamięci i wycieki. Zasoby są zwykle traktowane nieco inaczej między CPython i Jython, ponieważ odśmiecanie działa inaczej. W CPython nie jest tak ważne, aby martwić się o alokację zasobów, ponieważ są one automatycznie de-alokowane, gdy wychodzą poza zakres. JVM odnotowuje natychmiastowe usuwanie śmieci, więc ważniejsza jest odpowiednia alokacja zasobów. Metoda close () powinna zostać wywołana na pliku, gdy będziemy z nim pracować. Właściwą metodologią do użycia podczas pracy z plikiem jest otwieranie, przetwarzanie i zamykanie za każdym razem. Istnieją jednak skuteczniejsze sposoby wykonywania takich zadań. W rozdziale 7 omówimy wykorzystanie menedżerów kontekstów do wykonywania tej samej funkcjonalności w bardziej efektywny sposób. Listing 2-32. Manipulacja plikami w Iteratorach Pythona Iterator został wprowadzony do Pythona w wersji 2.2. Pozwala na iterację na kontenerach Pythona. Wszystkie iteracyjne kontenery mają wbudowaną obsługę typu iteratora. Na przykład obiekty sekwencji są iterowalne, ponieważ pozwalają na iterację każdego elementu w sekwencji. Jeśli spróbujesz zwrócić iterator na obiekt, który nie obsługuje iteracji, najprawdopodobniej otrzymasz AttributeError, który mówi ci, że iter nie został zdefiniowany jako atrybut dla tego obiektu. Ważne jest, aby pamiętać, że nazwy metod w Pythonie za pomocą podwójnych podkreśleń są specjalnymi metodami. Na przykład w Pythonie klasę można zainicjować za pomocą metody init (). podobnie jak konstruktor Java. Więcej informacji na temat klas i metod specjalnych można znaleźć w rozdziale 7. Iteratory pozwalają na łatwy dostęp do sekwencji i innych iteracyjnych kontenerów. Niektóre pojemniki, takie jak słowniki, mają wbudowane wyspecjalizowane metody iteracyjne, jak w poprzednich rozdziałach. Obiekty Iteratora są wymagane do obsługi dwóch głównych metod, które tworzą protokół iteratora. Metody te zostały zdefiniowane poniżej w Tabeli 2-10. Aby zwrócić iterator do kontenera, wystarczy przypisać container. iter () do pewnej zmiennej. Ta zmienna stanie się iteratorem dla obiektu. Dzięki temu można przekazywać iteratory, funkcje i tym podobne. Iterator sam w sobie jest zmienną, która zachowuje swój stan. Możemy używać pracy z iteratorem bez wpływu na oryginalny obiekt. Jeśli użyjesz funkcji next (), będzie ona nadal zwracać następny element na liście, dopóki wszystkie elementy nie zostaną odzyskane. Gdy to nastąpi, zostanie wydany wyjątek StopIteration. Ważne jest, aby pamiętać, że faktycznie tworzymy kopię listy, gdy zwracamy iterator i przypisujemy ją do zmiennej. Ta zmienna zwraca i usuwa element z tej kopii za każdym razem, gdy wywoływana jest metoda next (). Jeśli nadal będziemy wywoływać next () w zmiennej iteracyjnej do momentu pojawienia się błędu StopIteration, zmienna nie będzie już zawierać żadnych elementów i będzie pusta. Na przykład, jeśli stworzyliśmy iterator z listy, a następnie wywołamy na nim metodę next (), dopóki nie pobierze wszystkich wartości, iterator będzie pusty, a oryginalna lista pozostanie nietknięta. Listing 2-33. Utwórz Iterator z listy i użyj go 2-34. Iteracja nad sekwencją i listy Odnośniki i kopie Tworzenie kopii i odwoływanie się do pozycji w języku Python jest dość proste. Trzeba tylko pamiętać, że techniki używane do kopiowania zmiennych i niezmiennych obiektów różnią się nieco. Aby utworzyć kopię obiektu niezmiennego, wystarczy przypisać ją do innej zmiennej. Nowa zmienna jest dokładną kopią obiektu. Jeśli spróbujesz zrobić to samo z zmiennym obiektem, faktycznie utworzysz odniesienie do oryginalnego obiektu. Dlatego jeśli wykonasz operacje na kopii oryginału, ta sama operacja zostanie wykonana na oryginale. Dzieje się tak, ponieważ nowe przydział odwołuje się do tego samego obiektu zmiennego w pamięci, co oryginał. To trochę tak, jakby ktoś dzwonił do ciebie inną nazwą. Jedna osoba może zadzwonić do Ciebie po nazwisku, a inna może do Ciebie zadzwonić pod Twoim pseudonimem, ale oba imiona będą Cię oczywiście nawiązywać. Listing 2-35. Praca z kopiami Aby skutecznie utworzyć kopię zmiennego obiektu, masz dwie możliwości. Możesz utworzyć tak zwaną płytką kopię lub głęboką kopię oryginalnego obiektu. Różnica polega na tym, że płytka kopia obiektu utworzy nowy obiekt, a następnie zapełni go odniesieniami do elementów zawartych w oryginalnym obiekcie. W związku z tym, jeśli zmodyfikujesz dowolny z tych elementów, to każdy obiekt zostanie zmieniony, ponieważ oba odnoszą się do tych samych elementów. Głęboka kopia tworzy nowy obiekt, a następnie rekurencyjnie kopiuje zawartość oryginalnego obiektu do nowej kopii. Po wykonaniu głębokiej kopii obiektu można wykonywać operacje na dowolnym obiekcie zawartym w kopii bez wpływu na oryginał. Możesz użyć funkcji deepcopy w module kopiowania biblioteki standardowej Python, aby utworzyć taką kopię. Spójrzmy na kilka przykładów tworzenia kopii, aby lepiej zrozumieć, jak to działa. Garbage Collection Jest to jedna z głównych różnic między CPythonem a Jythonem. W CPython obiekt jest zbiorem śmieci, gdy wykracza poza zakres lub nie jest już potrzebny. Dzieje się to automatycznie i rzadko musi być śledzone przez programistę. Za kulisami CPython stosuje technikę liczenia odwołań, aby utrzymać liczbę na każdym obiekcie, która skutecznie określa, czy obiekt jest nadal w użyciu. W przeciwieństwie do CPython, Jython nie implementuje techniki liczenia odwołań dla starzenia się lub usuwania nieużywanych obiektów. Zamiast tego Jython korzysta z mechanizmów usuwania śmieci, które zapewnia platforma Java. Gdy obiekt Jython staje się nieaktualny lub nieosiągalny, JVM może lub nie może go odzyskać. Jednym z głównych aspektów JVM, który sprawił, że programiści byli tak bardzo zadowoleni na początku, było to, że nie trzeba już się martwić czyszczeniem po kodzie. W języku programowania C należy zachować świadomość tego, które obiekty są obecnie używane, aby nie były już potrzebne, program wykonałby pewne czyszczenie. Nie w świecie Java, wątek gc na JVM dba o wszystkie śmieci i porządki dla ciebie. Pomimo, że jeszcze nie rozmawialiśmy o klasach, zobaczyłeś krótki przykład ich użycia w Rozdziale 1. Dobrze jest wspomnieć, że Python zapewnia mechanizm oczyszczania obiektów. Metodę finalizatora można zdefiniować w dowolnej klasie, aby zapewnić, że moduł czyszczenia pamięci wykona określone zadania. Każdy kod czyszczenia, który musi zostać wykonany, gdy obiekt wykracza poza zakres, można umieścić w tej metodzie finalizera. Należy zauważyć, że metoda finalizera nie może być liczona jako metoda, która będzie zawsze wywoływana, gdy obiekt jest nieaktualny. Dzieje się tak, ponieważ metoda finalizatora jest wywoływana przez wątek pobierania śmieci Java i nie ma możliwości upewnienia się, kiedy i czy wywoływacz zostanie wywołany na obiekcie. Kolejną kwestią związaną z finalizacją jest to, że ponoszą oni karę wykonania. Jeśli kodujesz aplikację, która już działa słabo, może nie być dobrym pomysłem wrzucenie do niej wielu finalizatorów. Poniżej znajduje się przykład finalizatora Pythona. Jest to metoda instancji, która musi mieć nazwę del. Listing 2-37. Python Finalizer Przykład Wadą korzystania z mechanizmów odśmiecania JVM jest fakt, że nie ma gwarancji, kiedy i czy obiekt zostanie odzyskany. Dlatego podczas pracy z obiektami o dużym natężeniu ruchu najlepiej jest nie polegać na wywołaniu finalizatora. Zawsze należy upewnić się, że odpowiednie techniki kodowania są stosowane w takich przypadkach podczas pracy z obiektami takimi jak pliki i bazy danych. Nigdy nie koduj metody close () dla pliku w finalizatorze, ponieważ może to spowodować problem, jeśli finalizator nie zostanie wywołany. Najlepszą praktyką jest upewnienie się, że wszystkie obowiązkowe działania czyszczące są wykonywane przed wywołaniem finalizatora. W tym rozdziale omówiono wiele materiałów. Po zapoznaniu się z tym materiałem powinieneś lepiej poznać Python. Rozpoczęliśmy rozdział od objaśnienia podstaw przypisywania danych do konkretnych obiektów lub typów danych. Nauczyłeś się, że praca z każdym typem obiektu danych otwiera inne drzwi, ponieważ sposób pracy z każdym typem obiektu danych jest różny. Nasza podróż do obiektów danych rozpoczęła się od liczb i łańcuchów, i omówiliśmy wiele metod dostępnych dla obiektu typu string. Dowiedzieliśmy się, że łańcuchy są częścią rodziny sekwencji obiektów kolekcji Python wraz z listami i krotkami. Omówiliśmy, jak tworzyć i pracować z listami oraz różne opcje dostępne dla nas podczas korzystania z list. You discovered that list comprehensions can help create copies of a given list and manipulate their elements according to an expression or function. After discussing lists, we went on to discuss dictionaries, sets and tuples. After discussing the collection types, we learned that Jython has its own set of collection objects that differ from those in Python. We can leverage the advantage of having the Java platform at our fingertips and use Java collection types from within Jython. We finished up by discussing referencing, copies, and garbage collection. Creating different copies of objects does not always give you what youd expect, and that Jython garbage collection differs quite a bit from that of Python. The next chapter will help you to combine some of the topics youve learned about in this chapter as you will learn how to define expressions and work with control flow. Technical Analysis in Excel: Part I 8211 SMA, EMA, Bollinger Bands In this three-part series or articles 8220Technical Analysis in Excel8221 we will explore how traders can use Excel to apply technical analysis (TA) to historical market data. This will include computation of some of the most popular technical analysis indicators and implementation of a trading strategy backtesting spreadsheet (in Part III). Backtesting will involve generation of buy and sell signals based on TA indicators and computation of strategy P038L. We8217d like to point out upfront that all computations in these articles will be performed using standard Excel functions available in Excel 2017 and later. We will not be using any VBAcustom Excel macros. This is done on purpose to keep spreadsheets simple and functionality understandable by non-programmers. In the first part of this article series we will create an Excel spreadsheet where we will use formulas some common technical analysis indicators such as: Simple Moving Average, Bollinger Bands, and Exponential Moving Average. Well explain the formulas and include step-by-step instructions below. In addition, we are providing a spreadsheet we8217ve created by following steps listed in this article so that you can use it for your own market data analysis or as basis for building your own spreadsheets. Sample Excel File Excel file (download ) containing formulas for calculation of simple moving average, Bollinger Bands, and exponential moving average as described in this post. For this example weve got a CSV file with 6 months of hourly SPY data, covering Sep 3, 2017 8211 Feb 28, 2017. SPY is an ETF tracking SampP500 index. We have nearly 2000 data points in this file. The file contains OHCL price columns, volume, and timestamp column. Disclaimer: this file has been generated using IB Data Downloader . Data file: historicaldataSPY1hour20170301 (text file 8211 to download 8211 right-click and select 8220Save Linked File As8221) Simple Moving Average Basic Calculation Simple Moving Average (SMA) is simply the average price over last N number of bars. Lets calculate SMA for the close prices from our sample data file. Well be calculating a 20-day moving average based on the SPY close price (column D). Let8217s add column header SMA-20 in column G and we type in the following formula value in cell G21 (since row 21 is the first one that has enough data to calculate 20-day SMA): After hitting return to save the formula you should see value 164.57 or close to that in cell G21. In order to calculate SMA-20 for all of the remaining cells below 8211 just select cell G21, move cursor over cell and double-click the small square in the lower-right corner of that cell. You should now see values in column G calculated for the remainder of SPY prices. Generalizing SMA Calculation Now we have calculated 20-day simple moving average values in column G. Its great, but what if we want to calculate 50-day, or 200-day SMA now Updating formula values every time you want to change SMA range is pretty tedious and error-prone. Lets make our calculation more generic by adding a 8220length8221 parameter. We can start off by storing SMA range parameter in a separate cell so that we can reference it in or formula. Here are the steps we followed to implement a generic SMA calculation in our spreadsheet: Let8217s start off by creating a little table on the side where we can store some input parameter values for our indicators. In cell O1 lets type Variable Name, in cell P1 lets type Value. In cell O2 lets type name of our variable: PERIOD. In cell P2 we specify value of the PERIOD variable which well be using to specify period length for our generalized SMA calculation. Changing this variable will trigger recalculation of SMA with the current period value. Lets use value 14 for now. Lets type column header value SMA in cell H1 column H will contain values for our generic SMA indicator. In cell H2 enter this formula: Lets dissect this formula. We are now using value of our PERIOD variable from cell P2. We had to add in front of column and row numbers to freeze reference to cell P2 as we copy SMA formula to other cells in column H. Weve also replaced absolute reference to the Close column price range with the OFFSET Excel function. OFFSET returns a range of cells based on the offset in terms of number rows and columns from a given 8220reference8221 cell. First parameter is the reference cell (in our case H2 itself), second is an expression calculating the first row of the range based on the value of length parameter (P2), 3rd parameter is the column offset to the Close column (-4), negative value represents offset to the left while positive is offset to the right of the reference cell, and the last function parameter with value 1 represents the width of the range returned by OFFSET function, which in our case is just one column: D (CLOSE). Save the formula in cell in H2 and expand it to the rest of cells in column H by double-clicking the little square in lower-right corner of the cell, or dragging the formula down. Removing Formula Errors Now, you will notice that first several rows in the column have error value REF. This happens because there are not enough rows in our data set to calculate the SMA value, and the range returned by OFFSET function goes over the edge of the worksheet for some rows. There exists a number of various techniques to hide error values in excel. Some of them involve formulas which return blank or zero values if a cell value contains an error. While this is perfectly valid technique - it complicates cell formulas and makes them hard to read. Instead, well use conditional formatting to simply hide error values be changing foreground color to white. To change cells font color to white and use no error highlighting follow these instructions: Select columns H-N In Excel: Home - gt Conditional Formatting - gt Highlight Cell Rules - gt More Rules. In the New Formatting Rule dialog select Errors and in Format with select Custom format, then set Fill color to white and font color to white as well. Bollinger Bands Introduction Bollinger Bands is a simple but useful indicator providing valuable information on historical price volatility of a financial instrument, as well as current price deviation from a moving average. When price moves become more volatile 8211 the bands widen, in the periods of relative calm 8211 they come closer together. The relative position of the current price to the bands can also be used to estimate whether market is overbought or oversold. If the current price is close to or crossed upper band 8211 the price is considered in overbought territory, while price close tocrossed lower band 8211 underlying market is considered oversold. Basic Calculation Bollinger Bands indicator could be calculated using either simple moving average or exponential moving average as the basis. Bollinger Bands consists of three data series: moving average (simple or exponential) and two standard deviation (boundary) lines, one above, and one below the moving average, usually at 2 standard deviations from the moving average. Exponential moving average (covered below) gives more weight to the more recent price action, while Simple moving average provides a more stable and less jittery indicator. There are a total of 2 input parameters: 1) moving average period (number of bars), 2) number of standard deviations for the upper band lower bands. In this example well use simple moving average we already calculated in column H (see instructions in the section above). All thats remaining is to add columns for upper and lower bands. We are still using 14-day moving average period value. The first row that has enough data for 14-day SMA is row 15 (since row 1 is used for column header). The upper band will be in column I, so in cell I15 we type the following formula: In this formula we are simply adding two standard deviations of the Close prices from cells D2:D15 to the SMA value. Here the only difference from the previous formula is that we are subtracting two standard deviations from SMA. Excel formula STDEV() calculates standard deviation for a series of values. In this case we are multiplying value by 2 to get 2 standard deviations, and addingsubtracting the result from the moving average to generate the upperlower band values. To expand the formulas 8211 just roll over and double-click on a small square in the lower-right corner of the cell to replicate formula for the rest of the data range. Generalized Bollinger Band Computation Now. how about generalizing the Bollinger Band formula so that we dont have to update our formulas every time we want to calculate Bollinger bands for different number of standard deviations from MA or when we change moving average length. Lets add another parameter to our generic variables table on the right of the spreadsheet. Lets type Std devs: in cell O3, and 2.0 in P3. Next, let8217s add the following formula in I15: In this formula weve replaced 2 with P3 8211 which points to our variable in cell P3 containing number of standard deviations for the bands, and calculate offset based on the PERIOD variable in cell P2. The only difference from the formula in the previous step is that weve replaced after H15 with 8211 (minus), to subtract number of standard deviations from SMA, and we had to change offset to the price columnd. notice -6, instead of -5 in the cols parameter to the OFFSET function to refer to column D (CLOSE). Dont forget to copy new formulas in cells I15 and J15 to the rest of the respective column cells. You can now change values of PERIOD and Std devs variables in cells P2 amp P3, and have SMA and Bollinger Band values automatically recalculated. Bollinger Bands Chart in Excel Watch this video with instructions for adding a Bollinger Band chart to the spreadsheet we created above. Exponential Moving Average Exponential Moving Average (EMA) is type of moving average that is similar to a simple moving average, except that more weight is given to the latest data. The exponential moving average is also known as 8220exponentially weighted moving average8221. Computation Instructions Well use column K to calculate EMA. Lets set our PERIOD value to 1 (cell P2), so that we could enter formula at the top of our sheet and have some values we can see entering the formulas. We can set PERIOD to any value after we are done and have EMA (and SMA) automatically recalculated. In cell K2 we set the first value of the EMA series to be simply equal to the Close value (D2) in the same row, just because we need to seed EMA computation with some sensible value. Next, in cell K3 we enter a standard EMA formula which uses the industry-standard exponent function 2(1number of periods in MA). To better understand the math behind this refer to this page. In this formula we multiply rows Close price (D3) by the exponent function, using P2 to reference our number of periods variable, and add to the result the previous EMA value (K2), multiplied 1- the exponent. This is the standard EMA formula. Now expand the formula to the rest of the column by clicking a square in the lower right of cell K3. We can now change PERIOD value to any other number, make sure your conditional formatting rule is updated to hide error values displayed in cells that dont have enough data going back to calculate their values. Part I Conclusion In this first part of our 3-part series we calculated Simple Moving Average, Bollinger Bands, and Exponential Moving Average technical analysis indicators for our sample historical data set. In the next part well cover two of the most famous technical analysis indicators: MACD and RSI. Before you continue reading this article series we8217d like to bring your attention to a couple of books we hand-picked from a large number of volumes available on the subjects of technical analysis and trading with Microsoft Excel. We found that the selections we listed below provide invaluable fundamental information on using technical analysis and Excel-based trading idea generation, testing, and execution. Combining material described in these books will enable you to develop and test your own trading systems and take them to markets sooner and with more confidence. IB Data Downloader IB Data Downloader version 3.3 is now available Download historical data from Interactive Brokers. Stocks, Futures, ETFs, Indexes, Forex, Options, FOPs. Now supports options historical data download Runs on Windows, MacOS, Linux. Automatically handles IB API pacing violations, no restrictions on duration due to pacing limitations Supports historical data for expired futures contracts. IB Excel Trader IB Excel Trader version 1.6 is now available Trade Stocks, ETFs, Futures, and Forex directly from Excel. Implement custom trading rules using spreadsheet formulas or VBA. Program entry rules for single or bracket exit orders. Market, Stop, Limit, Stop-Limit, as well as complex algo orders are supported. Order Log sheet (new). Contains a detailed list of each order status change in a filterable Excel table. Use our Customization Service to extend IB Excel Trader and contract our programmers to develop your custom trading strategies. Interactive Brokers (IB) is a low cost provider of trade execution and clearing services for individuals, advisors, prop trading groups, brokers and hedge funds. IBs premier technology provides direct access to stocks, options, futures, forex, bonds and funds on over 100 markets worldwide from a single IB Universal account. Member NYSE, FINRA, SIPC. Visit interactivebrokers for more information. Recent Posts

No comments:

Post a Comment