Форум программистов, компьютерный форум, киберфорум
Konst2016
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Предсказания на временных рядах на списках биржи.LSTM сеть

Запись от Konst2016 размещена 16.11.2021 в 07:02
Показов 987 Комментарии 0
Метки ai, lstm, python, ии

Добрый день!Хочу показать как я пытался работать с временными(с многими параметрами) рядами, предсказывая
на 1 день цену открытия акции, учитытывая для прошлого
14 дней с параметрами ['Open'(Цена открытия), 'High'(Набольшая цена), 'Low'(Низкая цена), 'Close'(Цена при закрытии), 'Adj Close'(Выровненая цена при закрытии)].Список с Yahoo Генерал Электрик.
Использовал LSTM сеть, результаты предсказания - очень
неправильные, многие правильно думают что такие вещи
не предскажешь, хотя тренды видимо может описывать(но это уже другой код).
Python Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
"""
  Обучал на ценах на акции за 4 года, за 5 год взял новый файл, и сеть 
  неправильно предсказала 15 день, цена открытия, тогда как обучалась
  по окну - 14 дней назад и один вперед.
 
"""
import pandas as pd
from sklearn.preprocessing import StandardScaler
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense, Dropout
import pickle
from matplotlib import pyplot as plt
import seaborn as sns
 
fpickle = 'learned.pkl'
 
 
def build_model_lstm(trainX, trainY):
    model = Sequential()
 
    model.add(
        LSTM(64,
             activation='relu',
             input_shape=(trainX.shape[1], trainX.shape[2]),
             return_sequences=True))
    model.add(LSTM(32, activation='relu', return_sequences=False))
    model.add(Dropout(0.2))
    model.add(Dense(trainY.shape[1]))
 
    model.compile(optimizer='adam', loss='mse')
    model.summary()
 
    return model
 
 
"""
  Загружаем из pickle веса в модель(из функции build_model_lstm()) как обученную,
  если указан параметр-имя файла fdump, если нет выдаем модель для compile/fit.
"""
 
 
def make_lstm(trainX, trainY, fdump=None):
    model = build_model_lstm(trainX, trainY)
    if fdump:
        params = {}
        with open(fdump, 'rb') as f:
            params = pickle.load(f)
        len_layers = len(model.layers)
 
        for i in range(len_layers):
            model.layers[i].set_weights(params[i])
 
    return model
 
 
# для google colab
# from google.colab import drive
# drive.mount('/content/gdrive')
# fold_csv = '/content/gdrive/MyDrive/Colab Notebooks/data/GE.csv'
# /для google colab
 
# для компа
"""
  c https://finance.yahoo.com/quote/GE/history/ - Генерал Электрик
  4 года установил период торговли акциями, скачал
"""
fold_csv = './data/GE.csv'
"""
  с того же, но год, за 2021.Для окончательного предсказания
"""
fold_csv_ask = './data/GE_ask.csv'
# /для компа
"""
   Сохранить только веса модели в pickle файл.Это карта
   key:int-номер слоя => value - значение матрицы весов.
"""
def save_model(model):
    len_layers = len(model.layers)
    weights = {}
    for i in range(len_layers):
        weights[i] = model.layers[i].get_weights()
 
    with open(fpickle, 'wb') as f:
        pickle.dump(weights, f)
        print(f'saved learned to {fpickle}')
 
 
df = pd.read_csv(fold_csv)  #df.shape -> (251, 7)
print(df.head())  #7 columns, including the Date.
"""
->
         Date        Open        High         Low       Close   Adj Close    Volume
0  2016-01-04  235.000000  236.615387  232.692307  236.230774  213.058151   8174595
1  2016-01-05  236.000000  237.230774  234.230774  236.461533  213.266235   7172906
2  2016-01-06  232.846161  236.307693  231.153839  232.692307  209.866776   8144851
3  2016-01-07  228.076920  230.461533  221.923080  222.846161  200.986450  11994762
4  2016-01-08  224.615387  225.384613  218.000000  218.846161  197.378815   9684493
"""
 
train_dates = pd.to_datetime(df['Date'])
# type(train_dates[0]) -> <class 'pandas._libs.tslibs.timestamps.Timestamp'>
 
#Variables for training
cols = list(df)[1:6]
#Date and volume columns are not used in training.
print(cols)  #['Open', 'High', 'Low', 'Close', 'Adj Close']
 
df_for_training = df[cols].astype(float)  # len(df_for_training) -> 251
 
#LSTM uses sigmoid and tanh that are sensitive to magnitude so values need to be normalized
# normalize the dataset
scaler = StandardScaler()
scaler = scaler.fit(df_for_training)
df_for_training_scaled = scaler.transform(df_for_training)
"""
  В дне 5 параметров биржи торгов (цена открытия, самая высокая, самая низкая, цена закрытия, приближенное к цене закрытия).
  Фреймы составляют 14 таких дней (по 5 параметров), 1 параметр-цена открытия нас интересует на конце сети.Принцип окна по прошлому+1день(1
  параметр) как цена открытия в будущем.
  Чтобы обучить LSTM на наших данных, нам нужно преобразовать наши данные в форму, принятую LSTM.
  Нам нужно преобразовать наши данные в трехмерный формат. Первое измерение-это количество записей или строк в наборе данных,
  которое в нашем случае равно 251. Второе измерение-это количество временных шагов, равное 14,
  а последнее измерение – количество индикаторов, 5.
  Usman Malic делает так(одновариантная LSTM - раз индекс 0):
  features_set = []
  labels = []
  for i in range(60, 1260):
      features_set.append(apple_training_scaled[i-60:i, 0])
      labels.append(apple_training_scaled[i, 0])
  Говорит что на 60 днях назад бывают лучшее результаты(но у него и набор больше -1_260 рядов).    
"""
 
 
def pass_window_throught_df():
 
    #As required for LSTM networks, we require to reshape an input data into n_samples x timesteps x n_features.
    #In this example, the n_features is 5. We will make timesteps = 14 (past days data used for training).
 
    #Empty lists to be populated using formatted training data
    trainX = []
    trainY = []
 
    n_future = 1  # Number of days we want to look into the future based on the past days.
    n_past = 14  # Number of past days we want to use to predict the future.
 
    #Reformat input data into a shape: (n_samples x timesteps x n_features)
    #In my example, my df_for_training_scaled has a shape (12823, 5)
    #12823 refers to the number of data points and 5 refers to the columns (multi-variables).
    for i in range(n_past,
                   len(df_for_training_scaled) - n_future +
                   1):  # len(df_for_training_scaled) -> 251
        trainX.append(df_for_training_scaled[
            i - n_past:i,
            0:df_for_training.shape[1]])  # df_for_training.shape[1] -> 5
        # акцентируется на 1-ом параметре(0-м)-цена открытия.Первый индекс - вертикально срезает окно(фрейм).
        # 2-ой индекс горизонтально вытаскивает количество индикаторов с их позиций.
        trainY.append(df_for_training_scaled[i + n_future - 1:i + n_future, 0])
 
    trainX, trainY = np.array(trainX), np.array(trainY)
 
    print('trainX shape == {}.'.format(
        trainX.shape))  # trainX shape == (237, 14, 5).
    print('trainY shape == {}.'.format(
        trainY.shape))  # trainY shape == (237, 1).
 
    return trainX, trainY
 
 
def learn():
    trainX, trainY = pass_window_throught_df()
    model = make_lstm(trainX, trainY)
 
    model.compile(optimizer='adam', loss='mse', metrics=['accuracy'])
    model.summary()
 
    # fit the model
    history = model.fit(trainX,
                        trainY,
                        epochs=5,
                        batch_size=16,
                        validation_split=0.20,
                        verbose=1)
    plt.plot(history.history['loss'], label='Training loss')
    plt.plot(history.history['val_loss'], label='Validation loss')
    plt.legend()
    plt.show()
    save_model(model)
 
 
# learn()
df_test = pd.read_csv(fold_csv_ask)  #df.shape -> (251, 7)
print(df_test.head())  #7 columns, including the Date.
 
 
#Variables for training
cols = list(df)[1:6]
#Date and volume columns are not used in training.
print(cols)  #['Open', 'High', 'Low', 'Close', 'Adj Close']
 
df_for_testing = df[cols].astype(float)  # len(df_for_training) -> 251
 
scaler_test = StandardScaler()
scaler_test_fitted = scaler_test.fit(df_for_testing)
scaler_test_fitted_trasformed=scaler_test.transform(df_for_testing)
my_mean=scaler_test.mean_
my_scale=scaler_test.scale_
np_for_testing_scaled = scaler.transform(df_for_testing)
trainX, trainY = pass_window_throught_df()
model = make_lstm(trainX, trainY)
n_days_past=14
X=np_for_testing_scaled[0 : n_days_past, : ]
prediction = model.predict(np.array([X]))
"""
  Вообще чтобы вернуть из стандартизированного состояния, надо
  X=X_startart_d * std + mean,
  где X - восстановленные данные,
  X_startart_d - ранее стандартизированные данные,
  std - параметр отклонения после стандартизации,
  mean - параметр среднее после стандартизации.
  Но здесь для предсказанного воспользуемся средним.
"""
prediction=prediction[0][0] * np.mean(my_scale) + np.mean(my_mean)
print('answer open price', prediction) # answer open price -> 148.73902044297697
print('real open price', df_test.iloc[15][1] ) # real open price -> 96.239998
"""
  Проверим разницу (в валюте насколько ошиблась сеть при предсказании на 15 день цены открытия по 14 дням прошлым (Январь))
"""
delta=prediction - df_test.iloc[15][1] 
print('delta', delta) #delta -> 52.499022442976965 Это большая ошибка, хотя вроде сеть может показывать тренды.
Как обучалась (mse loss):
Нажмите на изображение для увеличения
Название: gr_learn.png
Просмотров: 218
Размер:	12.7 Кб
ID:	7232
Метки ai, lstm, python, ии
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Новые блоги и статьи
Коммуникация в реальном времени с SignalR в C# на примере создания чата
UnmanagedCoder 17.04.2025
Современный веб стремительно эволюционирует от статичных страниц к динамичным приложениям, где пользователи ожидают мгновенной реакции на свои действия. Представим, что вы отправляете сообщение. . .
Реализация CQRS с MediatR на C# .NET
stackOverflow 17.04.2025
Современная разработка программного обеспечения постоянно ищет пути повышения эффективности организации кода. Архитектурные паттерны появляются, эволюционируют, и те, что проявляют свою. . .
Verilog и интеллектуальная собственность - "глазами" обученной LM модели.
Hrethgir 17.04.2025
В сети встречаются участники, заявляющие что код на Verilog ни о чём не говорит. Но вот патентная практика на самом деле показывает обратное ими утверждаемому. То-есть код на Verilog включают в. . .
Свап-файл дополнительно к разделу (если вдруг не хватает или не создан)
jigi33 17.04.2025
ПОДКЛЮЧЕНИЕ ДОПОЛНИТЕЛЬНОГО SWAP ПРОСТРАНСТВА, Т. О. , РАСШИРЕНИЕ ЕГО РАЗМЕРА В Linux можно использовать как раздел подкачки (swap), так и файл подкачки (swap-файл). Чтобы создать swap-файл вместо. . .
Указатели в Swift: Небезопасные, буферные, необработанные и управляемые указатели
mobDevWorks 16.04.2025
Указатели относятся к наиболее сложным и мощным инструментам языка Swift. В своей сути указатель — это переменная, которая хранит адрес участка памяти, где расположены данные, а не сами данные. . . .
Жизненный цикл HTTP-запросов в ASP.NET Core MVC
UnmanagedCoder 16.04.2025
Разработка веб-приложений на ASP. NET MVC часто выглядит как простой процесс: получили запрос, обработали его в контроллере, отрендерили представление и отправили ответ пользователю. Однако за этой. . .
Введение в Django: Создаём приложение портфолио
py-thonny 16.04.2025
Django – один из самых мощных веб-фреймворков на Python, который позволяет быстро создавать сложные веб-приложения. В отличие от других фреймворков, Django предоставляет богатый набор встроенных. . .
Итераторы в C++: Продвинутые техники использования
bytestream 16.04.2025
Итераторы - одна из самых гибких и выразительных концепций в C++, позволяющих абстрагировать обход элементов контейнера от его внутренней реализации. За прошедшие годы они эволюционировали от простых. . .
Обработка естественного языка в Python с помощью spaCy
py-thonny 16.04.2025
Обработка естественного языка (Natural Language Processing, NLP) — одна из самых быстрорастущих областей искусственного интеллекта, которая позволяет компьютерам понимать, интерпретировать и. . .
Работа с железом в PHP Laravel с Pinout
Jason-Webb 16.04.2025
Граница между программным и аппаратным миром стремительно размывается. Современные веб-приложения уже не ограничиваются цифровым пространством — они активно взаимодействуют с физическими. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер