Prognozy giełdowe za pomocą uczenia maszynowego [Wdrażanie krok po kroku]

Opublikowany: 2021-02-26

Spis treści

Wstęp

Przewidywanie i analiza rynku akcji to jedne z najbardziej skomplikowanych zadań do wykonania. Istnieje kilka przyczyn takiego stanu rzeczy, takich jak zmienność rynku i wiele innych zależnych i niezależnych czynników decydujących o wartości danej akcji na rynku. Czynniki te sprawiają, że każdemu analitykowi giełdowemu bardzo trudno jest przewidzieć wzrost i spadek z dużą dokładnością.

Jednak wraz z pojawieniem się uczenia maszynowego i jego niezawodnych algorytmów, najnowsze analizy rynku i prognozy giełdowe zaczęły uwzględniać takie techniki w zrozumieniu danych giełdowych.

Krótko mówiąc, algorytmy uczenia maszynowego są szeroko stosowane przez wiele organizacji do analizowania i przewidywania wartości zapasów. W tym artykule omówimy prostą implementację analizowania i przewidywania wartości akcji popularnego na całym świecie internetowego sklepu detalicznego przy użyciu kilku algorytmów uczenia maszynowego w Pythonie.

Stwierdzenie problemu

Zanim przejdziemy do wdrożenia programu do przewidywania wartości giełdowych, zwizualizujmy dane, na których będziemy pracować. Tutaj będziemy analizować wartość akcji Microsoft Corporation (MSFT) od National Association of Securities Dealers Automated Quotations (NASDAQ). Dane dotyczące wartości giełdowych zostaną przedstawione w postaci pliku rozdzielanego przecinkami (.csv), który można otworzyć i przeglądać za pomocą programu Excel lub arkusza kalkulacyjnego.

MSFT ma swoje akcje zarejestrowane na NASDAQ i aktualizuje ich wartości w każdy dzień roboczy giełdy. Zauważ, że rynek nie pozwala na handel w soboty i niedziele; stąd istnieje luka między tymi dwiema datami. Dla każdego dnia odnotowywana jest Wartość Otwarcia akcji, Najwyższa i Najniższa wartość tej akcji w tych samych dniach, wraz z Wartością Zamknięcia na koniec dnia.

Skorygowana wartość zamknięcia pokazuje wartość akcji po zaksięgowaniu dywidendy (zbyt techniczne!). Dodatkowo podana jest również całkowita wielkość akcji na rynku. W przypadku tych danych badanie danych i wdrożenie kilku algorytmów, które mogą wyodrębnić wzorce z historycznych danych akcji firmy Microsoft Corporation, zależy od pracy naukowca zajmującego się uczeniem maszynowym / danymi. dane.

Pamięć długotrwała

Aby opracować model uczenia maszynowego do przewidywania cen akcji Microsoft Corporation, użyjemy techniki pamięci długo-krótkotrwałej (LSTM). Służą do wprowadzania drobnych modyfikacji informacji poprzez mnożenia i dodawania. Z definicji pamięć długotrwała (LSTM) to architektura sztucznej sieci neuronowej (RNN) wykorzystywana w głębokim uczeniu.

W przeciwieństwie do standardowych sieci neuronowych ze sprzężeniem do przodu, LSTM ma połączenia zwrotne. Może przetwarzać pojedyncze punkty danych (takie jak obrazy) i całe sekwencje danych (takie jak mowa lub wideo). Aby zrozumieć koncepcję stojącą za LSTM, weźmy prosty przykład recenzji telefonu komórkowego online przez klienta.

Załóżmy, że chcemy kupić telefon komórkowy, zwykle odwołujemy się do recenzji sieci certyfikowanych użytkowników. W zależności od ich myślenia i wkładu decydujemy, czy telefon jest dobry, czy zły, a następnie go kupujemy. Czytając recenzje, szukamy słów kluczowych, takich jak „niesamowity”, „dobry aparat”, „najlepsza bateria podtrzymująca” i wielu innych terminów związanych z telefonem komórkowym.

Mamy tendencję do ignorowania popularnych angielskich słów, takich jak „it”, „gave”, „this” itp. Dlatego decydując, czy kupić telefon komórkowy, czy nie, pamiętamy tylko te słowa kluczowe zdefiniowane powyżej. Najprawdopodobniej zapominamy o pozostałych słowach.

Jest to ten sam sposób, w jaki działa Algorytm Pamięci Długotrwałej. Zapamiętuje tylko istotne informacje i wykorzystuje je do przewidywania, ignorując nieistotne dane. W ten sposób musimy zbudować model LSTM, który zasadniczo rozpoznaje tylko podstawowe dane dotyczące tego towaru i pomija jego wartości odstające.

Źródło

Chociaż powyższa struktura architektury LSTM może początkowo wydawać się intrygująca, wystarczy pamiętać, że LSTM jest zaawansowaną wersją Recurrent Neural Networks, która zachowuje pamięć do przetwarzania sekwencji danych. Może usuwać lub dodawać informacje do stanu komórki, dokładnie regulowane przez struktury zwane bramkami.

Jednostka LSTM zawiera komórkę, bramkę wejściową, bramkę wyjściową i bramkę zapominania. Komórka zapamiętuje wartości w dowolnych odstępach czasu, a trzy bramki regulują przepływ informacji do iz komórki.

Wdrażanie Programu

Przejdziemy do części, w której wykorzystamy LSTM do przewidywania wartości zapasów za pomocą uczenia maszynowego w Pythonie.

Krok 1 – Importowanie bibliotek

Jak wszyscy wiemy, pierwszym krokiem jest zaimportowanie bibliotek, które są niezbędne do wstępnego przetworzenia danych giełdowych firmy Microsoft Corporation i innych wymaganych bibliotek do budowania i wizualizacji wyników modelu LSTM. W tym celu wykorzystamy bibliotekę Keras pod frameworkiem TensorFlow. Wymagane moduły są importowane z biblioteki Keras pojedynczo.

#Importowanie bibliotek

importuj pandy jako PD

importuj NumPy jako np

%matplotlib wbudowany

importuj bibliotekę matplotlib. pyplot jako plt

importuj bibliotekę matplotlib

od sklearn. Wstępne przetwarzanie importu MinMaxScaler

od Kerasa. import warstw LSTM, Gęsty, Dropout

ze sklearn.model_selection importuj TimeSeriesSplit

ze sklearn.metrics import mean_squared_error, r2_score

importuj bibliotekę matplotlib. daty jako mandaty

od sklearn. Wstępne przetwarzanie importu MinMaxScaler

from sklearn import linear_model

od Kerasa. Modele importują sekwencyjnie

od Kerasa. Warstwy importują Gęste

importuj Keras. Backend jako K

od Kerasa. Import wywołań zwrotnych EarlyStopping

od Kerasa. Optymalizatory importują Adam

od Kerasa. Modele importują load_model

od Kerasa. Importowanie warstw LSTM

od Kerasa. utils.vis_utils importuj model plotu

Krok 2 – Uzyskanie wizualizacji danych

Korzystając z biblioteki czytników Pandas Data, prześlemy dane giełdowe lokalnego systemu jako plik wartości oddzielonych przecinkami (.csv) i przechowamy je w pandas DataFrame. Na koniec przejrzymy również dane.

#Pobierz zbiór danych

df = pd.read_csv(“MicrosoftStockData.csv”,na_values=['null'],index_col='Data',parse_dates=True,infer_datetime_format=True)

df.głowa()

Uzyskaj certyfikat AI online z najlepszych uniwersytetów na świecie — Masters, Executive Post Graduate Programs oraz Advanced Certificate Program w ML i AI, aby przyspieszyć swoją karierę.

Krok 3 – Wydrukuj kształt DataFrame i sprawdź, czy nie ma wartości Null.

W tym kolejnym ważnym kroku najpierw drukujemy kształt zbioru danych. Aby upewnić się, że w ramce danych nie ma wartości null, sprawdzamy je. Obecność wartości null w zestawie danych zwykle powoduje problemy podczas uczenia, ponieważ działają one jako wartości odstające, powodując dużą zmienność w procesie uczenia.

#Drukuj kształt ramki danych i sprawdź wartości zerowe

print("Kształt ramki danych: ", df. kształt)

print("Obecna wartość pusta: ", df.IsNull().values.any())

>> Kształt ramki danych: (7334, 6)

>>Wartość zerowa Obecna: Fałsz

Data otwarty Wysoka Niski Blisko Przym Zamknij Tom
1990-01-02 0,605903 0,616319 0,598090 0,616319 0,447268 53033600
1990-01-03 0,621528 0,626736 0,614583 0,619792 0,449788 113772800
1990-01-04 0,619792 0,638889 0,616319 0,638021 0,463017 125740800
1990-01-05 0,635417 0,638889 0,621528 0,622396 0,451678 69564800
1990-01-08 0,621528 0,631944 0,614583 0,631944 0,458607 58982400

Krok 4 – Wykreślanie rzeczywistej skorygowanej wartości zamknięcia

Ostateczna wartość wyjściowa, która ma być przewidziana przy użyciu modelu uczenia maszynowego, to skorygowana wartość zamknięcia. Wartość ta reprezentuje wartość zamknięcia akcji w danym dniu obrotu giełdowego.

#Wykreśl prawdziwą wartość zbliżoną korekty

df['Adj Zamknij'].plot()

Krok 5 – Ustawienie zmiennej docelowej i wybór funkcji

W kolejnym kroku przypisujemy kolumnę wyjściową do zmiennej docelowej. W tym przypadku jest to skorygowana względna wartość akcji Microsoft. Dodatkowo dobieramy również cechy, które działają jako zmienna niezależna do zmiennej docelowej (zmiennej zależnej). Aby uwzględnić cel szkolenia, wybieramy cztery cechy, którymi są:

  • otwarty
  • Wysoka
  • Niski
  • Tom

#Ustaw zmienną docelową

output_var = PD.DataFrame(df['Adj Zamknij'])

#Wybieranie funkcji

funkcje = ['Otwarty', 'Wysoki', 'Niski', 'Głośność']

Krok 6 – Skalowanie

Aby zmniejszyć koszt obliczeniowy danych w tabeli, przeskalujemy wartości giełdowe do wartości od 0 do 1. W ten sposób wszystkie dane w dużych liczbach zostaną zredukowane, zmniejszając w ten sposób zużycie pamięci. Ponadto możemy uzyskać większą dokładność, skalując w dół, ponieważ dane nie są rozłożone w ogromnych wartościach. Jest to wykonywane przez klasę MinMaxScaler biblioteki sci-kit-learn.

#Skalowanie

skaler = MinMaxScaler()

feature_transform = scaler.fit_transform(df[features])

feature_transform= pd.DataFrame(kolumny=features, data=feature_transform, index=df.index)

feature_transform.head()

Data otwarty Wysoka Niski Tom
1990-01-02 0,000129 0,000105 0,000129 0,064837
1990-01-03 0,000265 0,000195 0,000273 0.144673
1990-01-04 0,000249 0,000300 0,000288 0.160404
1990-01-05 0,000386 0,000300 0,000334 0,086566
1990-01-08 0,000265 0,000240 0,000273 0,072656

Jak wspomniano powyżej, widzimy, że wartości zmiennych cech są przeskalowane do mniejszych wartości w porównaniu z wartościami rzeczywistymi podanymi powyżej.

Krok 7 – Podział na zestaw treningowy i zestaw testowy.

Przed wprowadzeniem danych do modelu uczącego musimy podzielić cały zestaw danych na zestaw uczący i testowy. Model uczenia maszynowego LSTM zostanie przeszkolony na danych obecnych w zestawie uczącym i przetestowany na zestawie testowym pod kątem dokładności i propagacji wstecznej.

W tym celu użyjemy klasy TimeSeriesSplit z biblioteki sci-kit-learn. Ustawiamy liczbę podziałów na 10, co oznacza, że ​​10% danych zostanie użytych jako zestaw testowy, a 90% danych zostanie wykorzystanych do uczenia modelu LSTM. Zaletą korzystania z tego podziału szeregów czasowych jest to, że próbki danych z podziału szeregów czasowych są obserwowane w stałych odstępach czasu.

#Podział na zestaw treningowy i zestaw testowy

timesplit=TimeSeriesSplit(n_split=10)

dla train_index, test_index w timesplit.split(feature_transform):

X_train, X_test = feature_transform[:len(train_index)], feature_transform[len(train_index): (len(train_index)+len(test_index))]

y_train, y_test = output_var[:len(train_index)].values.ravel(), output_var[len(train_index): (len(train_index)+len(test_index))].values.ravel()

Krok 8 – Przetwarzanie danych dla LSTM

Gdy zestawy uczące i testowe są gotowe, możemy wprowadzić dane do modelu LSTM po jego zbudowaniu. Wcześniej musimy przekonwertować dane zestawu uczącego i testowego na typ danych, który zaakceptuje model LSTM. Najpierw konwertujemy dane treningowe i dane testowe na tablice NumPy, a następnie przekształcamy je do formatu (Liczba próbek, 1, Liczba funkcji), ponieważ LSTM wymaga, aby dane były wprowadzane w formie 3D. Jak wiemy, liczba próbek w zbiorze uczącym wynosi 90% z 7334, czyli 6667, a liczba cech to 4, zbiór uczący jest przekształcony do (6667, 1, 4). Podobnie zmienia się również zestaw testowy.

#Przetwarzaj dane dla LSTM

trainX =np.array(X_train)

testX =np.tablica(X_test)

X_train = trainX.reshape(X_train.shape[0], 1, X_train.shape[1])

X_test = testX.reshape(X_test.shape[0], 1, X_test.shape[1])

Krok 9 – Budowanie modelu LSTM

Wreszcie dochodzimy do etapu, w którym budujemy Model LSTM. Tutaj tworzymy model Sequential Keras z jedną warstwą LSTM. Warstwa LSTM ma 32 jednostki, a za nią znajduje się jedna warstwa gęsta z 1 neuronem.

Do kompilacji modelu używamy Adam Optimizer i Mean Squared Error jako funkcji straty. Te dwa są najbardziej preferowaną kombinacją dla modelu LSTM. Dodatkowo model jest również kreślony i wyświetlany poniżej.

#Budowanie modelu LSTM

lstm = sekwencyjny()

lstm.add(LSTM(32, input_shape=(1, trainX.shape[1]), aktywacja='relu', return_sequences=False))

lstm.add (gęsty (1))

lstm.compile(loss='mean_squared_error', Optimizer='adam')

plot_model(lstm, show_shapes=True, show_layer_names=True)

Krok 10 – Trening modelki

Na koniec trenujemy model LSTM zaprojektowany powyżej na danych uczących dla 100 epok z wielkością partii 8 za pomocą funkcji dopasowania.

#Szkolenie modelowe

historia = lstm.fit (X_train, y_train, epoki = 100, rozmiar_partii = 8, verbose = 1, shuffle = False)

Epoka 1/100

834/834 [==============================] – 3s 2ms/krok – utrata: 67,1211

Epoka 2/100

834/834 [==============================] – 1s 2ms/krok – utrata: 70.4911

Epoka 3/100

834/834 [==============================] – 1s 2ms/krok – utrata: 48.8155

Epoka 4/100

834/834 [==============================] – 1s 2ms/krok – utrata: 21.5447

Epoka 5/100

834/834 [==============================] – 1s 2ms/krok – utrata: 6.1709

Epoka 6/100

834/834 [==============================] – 1s 2ms/krok – utrata: 1.8726

Epoka 7/100

834/834 [==============================] – 1s 2ms/krok – strata: 0,9380

Epoka 8/100

834/834 [==============================] – 2s 2ms/krok – utrata: 0,6566

Epoka 9/100

834/834 [==============================] – 1s 2ms/krok – utrata: 0,5369

Epoka 10/100

834/834 [==============================] – 2s 2ms/krok – utrata: 0,4761

.

.

.

.

Epoka 95/100

834/834 [==============================] – 1s 2ms/krok – utrata: 0,4542

Epoka 96/100

834/834 [==============================] – 2s 2ms/krok – utrata: 0,4553

Epoka 97/100

834/834 [==============================] – 1s 2ms/krok – utrata: 0,4565

Epoka 98/100

834/834 [==============================] – 1s 2ms/krok – utrata: 0,4576

Epoka 99/100

834/834 [==============================] – 1s 2ms/krok – utrata: 0,4588

Epoka 100/100

834/834 [==============================] – 1s 2ms/krok – utrata: 0,4599

Na koniec widzimy, że wartość straty zmniejszyła się wykładniczo w czasie podczas procesu uczenia trwającego 100 epok i osiągnęła wartość 0,4599

Krok 11 – Przewidywanie LSTM

Gdy nasz model jest gotowy, nadszedł czas, aby użyć modelu wytrenowanego przy użyciu sieci LSTM na zestawie testowym i przewidzieć sąsiednią wartość zamknięcia akcji Microsoft. Odbywa się to za pomocą prostej funkcji przewidywania na zbudowanym modelu lstm.

#Przewidywanie LSTM

y_pred= lstm.predict(X_test)

Krok 12 – Prawda a przewidywana wartość zamknięcia korekty – LSTM

Wreszcie, ponieważ przewidzieliśmy wartości zestawu testowego, możemy wykreślić wykres, aby porównać zarówno prawdziwe wartości funkcji Adj Close, jak i przewidywaną wartość funkcji Adj Close za pomocą modelu uczenia maszynowego LSTM.

#Prawda a przewidywana wartość zamknięcia korekty – LSTM

plt.plot(y_test, label='Prawdziwa wartość')

plt.plot(y_pred, label='Wartość LSTM')

plt.title("Przewidywanie przez LSTM")

plt.xlabel('Skala czasu')

plt.ylabel('Skalowane USD')

plt.legenda()

plt.pokaż()

Powyższy wykres pokazuje, że pewien wzorzec jest wykrywany przez bardzo podstawowy pojedynczy model sieci LSTM zbudowany powyżej. Dostrajając kilka parametrów i dodając do modelu więcej warstw LSTM, możemy uzyskać dokładniejsze odwzorowanie wartości akcji dowolnej firmy.

Wniosek

Jeśli chcesz dowiedzieć się więcej o przykładach sztucznej inteligencji, uczeniu maszynowym, sprawdź program Executive PG IIIT-B i upGrad w uczeniu maszynowym i sztucznej inteligencji , który jest przeznaczony dla pracujących profesjonalistów i oferuje ponad 450 godzin rygorystycznych szkoleń, ponad 30 studiów przypadków i zadania, status absolwentów IIIT-B, ponad 5 praktycznych praktycznych projektów zwieńczenia i pomoc w pracy z najlepszymi firmami.

Czy potrafisz przewidzieć rynek akcji za pomocą uczenia maszynowego?

Dziś dysponujemy szeregiem wskaźników, które pomagają przewidywać trendy rynkowe. Jednak nie musimy szukać dalej niż komputer o dużej mocy, aby znaleźć najdokładniejsze wskaźniki dla rynku akcji. Giełda jest systemem otwartym i może być postrzegana jako złożona sieć. Sieć składa się z relacji między akcjami, firmami, inwestorami i wielkością obrotu. Korzystając z algorytmu eksploracji danych, takiego jak maszyna wektorów nośnych, można zastosować wzór matematyczny, aby wyodrębnić relacje między tymi zmiennymi. Rynek akcji jest teraz poza ludzkimi przewidywaniami.

Który algorytm jest najlepszy do prognozowania na giełdzie?

Aby uzyskać najlepsze wyniki, należy użyć regresji liniowej. Regresja liniowa to podejście statystyczne, które służy do określenia związku między dwiema różnymi zmiennymi. W tym przykładzie zmiennymi są cena i czas. W prognozach giełdowych cena jest zmienną niezależną, a czas jest zmienną zależną. Jeśli można określić liniową zależność między tymi dwiema zmiennymi, możliwe jest dokładne przewidzenie wartości zapasów w dowolnym momencie w przyszłości.

Czy prognozy giełdowe są problemem klasyfikacji czy regresji?

Zanim odpowiemy, musimy zrozumieć, co oznaczają prognozy giełdowe. Czy jest to problem klasyfikacji binarnej, czy problem regresji? Załóżmy, że chcemy przewidzieć przyszłość akcji, gdzie przyszłość oznacza następny dzień, tydzień, miesiąc lub rok. Jeśli przeszłe wyniki akcji w pewnym momencie są danymi wejściowymi, a przyszłe są danymi wyjściowymi, to jest to problem regresji. Jeśli przeszłe wyniki akcji i przyszłość akcji są niezależne, to jest to problem klasyfikacji.