Czy mamy tu jakieś wrony? GPW-ML #2 – TA-Lib

Tym razem tytuł artykułu jest bardziej przewrotny niż zwykle. Przynajmniej tak mi się wydaje. No bo o co chodzi z tymi wronami? Otóż okazuje się, że trzy czarne wrony to nazwa sytuacji, w której cena jakiejś spółki giełdowej systematycznie i stopniowo spada. Mamy też sytuację przeciwną, w której cena spółki na trzech kolejnych dniach giełdowych systematycznie i stopniowo rośnie – trzech białych żołnierzy. Nie będę nawet próbował zgadywać genezy tych wyrażeń, pozostawię je tutaj jako przykład nazewnictwa (mnemotechniki?) wzorców użytych w analizie technicznej.

Kilka artykułów temu wspomniałem jak można sobie pobrać i wczytać dane z GPW (Co tam na giełdzie słychać?). Teraz pokażę kolejne narzędzie, które może Ci się przydać, jeśli szykujesz się do dokonywania predykcji cen spółek giełdowych przy pomocy uczenia maszynowego. To narzędzie to TA-Lib.

TA-Lib

TA-Lib to biblioteka (open source) służąca do analizy technicznej. Pozwala ona łatwo automatycznie wyliczyć różne wskaźniki związane z giełdowymi danymi dniowymi. Prawdopodobnie będzie Cię szczególnie interesować Pythonowy wrapper na tę bibliotekę o takiej samej nazwie. Dzięki niemu łatwo będzie nam wyszukać czy w ciągu ostatniego roku na wykresie CD Projekt pojawiły się jakieś wrony (czy inne cuda).

Przykład

W przykładzie użyjemy danych pobranych za pomocą skryptu opisanego we wspomnianym wcześniej artykule (kod znajdziesz tutaj). TA-Lib udostępnia całą masę funkcji, które na wejściu oczekują wektorów danych (np. wektor kolejnych wartości open) i dają nam na wyjściu pojedyncze wektory zawierające tyle samo elementów. Idealna sytuacja dla ramek danych. Dokumentacja TA-Lib jest niestety dość uboga i nie udało mi się wydobyć z niej oficjalnego wyjaśnienia, co oznaczają wyliczone wartość. Empirycznie wyszło mi, że otrzymujemy wartości 0, 100 i -100. W jednym przypadku pojawiły się jeszcze -200 i 200. 0 oznacza pewnie, że dany wzorzec się nie pojawił. 100 i -100 są pewnie odpowiednikiem 1 i -1. Wartość 1 oznacza pewnie, że wzorzec wystąpił, a -1 oznacza, że wystąpił odwrotny. 200 i -200 mówią pewnie o intensywności jakiegoś wzorca (jeśli coś takiego istnieje). W przykładzie pojawiły się takie wartość w wyniku funkcji CDLHIKKAKE, która odpowiadała za Hikkake Pattern. Cóż, kwestię interpretacji pozostawię na razie samym zainteresowanym.

Lista funkcji, z których możemy korzystać, znajduje się w dokumentacji. Załóżmy więc, że interesują nas te wrony, żołnierze, gwiazdy i inne takie. Znajdziemy je w zbiorze funkcji Pattern Recognition. Możemy każdą z nich wywołać ręcznie. Jeśli interesuje nas kilka funkcji, to nie ma problemu. Jeśli jednak interesują nas wszystkie z tej listy, to powinniśmy użyć Abstract API. U mnie akurat to API nie za bardzo chciało zadziałać, musiałem więc zastosować pewną sztuczkę:

# Kod 1
#https://stackoverflow.com/a/26421920/993324
cdls = re.findall('(CDL\w*)', ' '.join(dir(talib)))
# O, H, L, C = Open, High, Low, Close
O = stock_data["open"]
H = stock_data["high"]
L = stock_data["low"]
C = stock_data["close"]
for cdl in cdls: # the string that becomes the function name
    toExec = getattr(talib, cdl)
    out    = toExec(np.array(O), np.array(H), np.array(L), np.array(C))
    stock_data[cdl] = out

Chodzi tutaj o stworzenie sobie listy funkcji i wykonywaniu każdej z niej po kolei. W ten sposób obszedłem ręczne wywoływanie każdej funkcji z osobna. Po wykonaniu tej pętli nasza ramka danych ma wymiar 247 rows × 66 columns. Czyli dodaliśmy sobie ponad 60 kolumn, które sygnalizują nam wystąpienie jakiegoś wzorca.

Czasem, gdy np. nasza ramka danych jest dość rzadka (ma dużo zer) nie za bardzo jest sens przeglądać ją naocznie. W takich sytuacjach przydają się różne moduły pomocnicze. Moim ulubionym jest aktualnie pandas_profiling. Moduł ten posiada kilka funkcji, w tym jedną, która wygeneruje nam całkiem przejrzysty raport o zawartości ramki danych. Od razu wskaże nam też które kolumny są puste (same zera):

# Kod 2
pandas_profiling.ProfileReport(stock_data)

Jako, że trochę tych wzorców zostało odnalezionych, a do wizualizacji chciałbym mieć tylko jeden punkt, postanowiłem poszukać takich wzorców, które występują tylko raz:

# Kod 3
stock_data.columns[stock_data.astype(bool).sum(axis=0) == 1]

Pojawiły mi się tutaj dwa wzorce, wybrałem wiec pierwszy z listy, czyli CDLMORNINGDOJISTAR – Morning Doji Star.

Chciałbym narysować sobie wykres – taki bardziej „giełdowy” z zaznaczonym miejscem, w którym wydarzyło się to zjawisko. Użyję tutaj tak jak poprzednio modułu plotly. Przed przystąpieniem do rysowania muszę sobie jednak wyznaczyć punkty, które chcę zaznaczyć na wykresie. Napisałem więc sobie pętlę, która tworzy odpowiednią listę:

# Kod 4
pattern_name = "CDLMORNINGDOJISTAR"
list_of_annotations = []
for index, pattern in stock_data[stock_data[pattern_name] != 0].iterrows():
    list_of_annotations.append(dict(x = index, y = pattern["high"], 
                                    text = pattern_name + " " + str(pattern[pattern_name])))

list_of_annotations

Wystarczy podstawić do zmiennej pattern_name nazwę funkcji, która nas interesuje i po wykonaniu tej pętli dostaniemy współrzędne wszystkich wystąpień wzorca. Gdy już mamy odpowiednią listę, rysujemy wykres:

# Kod 5
layout = {
    "annotations": list_of_annotations
}

stock = go.Candlestick(x = stock_data.index, 
                       open = stock_data["open"].values, 
                       high = stock_data["high"].values, 
                       low = stock_data["low"].values, 
                       close = stock_data["close"].values)
data = [stock]

fig = dict(data = data, layout = layout)
iplot(fig)

Wykres ten wygląda następująco:

Morning Doji Star
Morning Doji Star

Podsumowanie

Jak widzisz drogi czytelniku, Python i kilka dodatkowych modułów pozwala poczuć się jak profesjonalista giełdowy inwestujący według analizy technicznej. Tak jak wspominałem wcześniej, niekoniecznie musi mieć to sens. Teraz jednak dostałeś kolejne narzędzie, które pozwoli Ci już samodzielnie podjąć tę decyzję. Wiesz już jak skonstruować ramkę danych z danymi giełdowymi i wypełnić ją informacjami technicznymi. A następnym krokiem będzie już pewnie dokonywanie predykcji.

Sprawdź koniecznie cały kod i interaktywny wykres, który stworzyłem w tym artykule: tutaj.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *