График результатов прогнозирующей нейронной сети на фондовом рынке в Керасе - PullRequest
0 голосов
/ 19 января 2020

Недавно я попытался создать нейронную сеть, чтобы предсказать колебания цен отдельных акций на фондовом рынке, используя Keras в качестве основы для нейронной сети и Quandl в качестве базы данных для получения исторических цен акций; код для этой программы был выполнен в интегрированной среде разработки Google Colab Laboratory, и программа отображается ниже:

import tensorflow as tf
import keras
import numpy as np
import quandl
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pandas as pd

df = quandl.get("WIKI/FB", api_key = '_msxC6xspj2ddytz7-4u')

print(df)

df = df.reset_index()
df = df[['Adj. Close', 'Date']]

forecast_out = 1
df['Prediction'] = df[['Adj. Close']].shift(-(forecast_out))

X = np.array(df.drop(['Prediction'], 1))
X = X[:-forecast_out]
y = np.array(df['Prediction'])
y = y[:-forecast_out]

x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.2) 
model = keras.models.Sequential()
model.add(keras.layers.Dense(units = 64, activation = 'relu'))
model.add(keras.layers.Dense(units = 1, activation = 'linear'))

model.compile(loss='mean_absolute_error',
              optimizer='adam',
              metrics=['accuracy'])

History = model.fit(x_train, y_train, epochs=8)

prediction = model.predict(x_test)

Мой основной вопрос касается наличия механизма построения графиков для вышеупомянутых данных, позволяющего отображать один из них. модуль x_test на том же графике, что и прогноз для этого конкретного набора данных; из-за моего небольшого опыта работы с этим приложением Python я попытался отобразить набор данных в соответствии с инструкциями с помощью команд:

plt.plot(x_test)
plt.plot(prediction)

Однако это привело к следующему графику:

enter image description here

Основной целью программы является создание системы, которая обладает способностью прогнозировать любой предоставленный набор цен из определенного периода времени для конкретной акции; поэтому необходимо получать результаты, аналогичные тем, которые отображаются в последнем разделе статьи, показанном ниже:

https://towardsdatascience.com/neural-networks-to-predict-the-market-c4861b649371

График, аналогичный отображаемому позволит более прозрачный анализ эффективности программы; Мой запрос направлен на то, чтобы создать график, аналогичный тому, который показан в статье выше. Останется ли метод для создания такого графика или для наблюдения конкретных результатов, таких как этот? Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 19 января 2020

Важно отметить, что ваши данные о поездах и тестах обязательно будут находиться в отдельных частях оси X.

Например, предположим, что тренировочный набор состоит из 100 наблюдений и набора тестов. из 15 наблюдений. Набор тестов является последней частью временного ряда, который используется для прогнозирования модели (т. Е. Модель, построенная с использованием обучающего набора).

Рассмотрим пример использования LSTM для прогнозирования колебаний в * 1005. * еженедельные списки отелей .

Прогнозы обучения и проверки генерируются с использованием MinMaxScaler, чтобы позволить нейронной сети правильно интерпретировать данные. Из того, что я вижу, вы не выполнили этот шаг в своем примере. Вы должны сделать это, поскольку ваши результаты, скорее всего, будут ошибочными в противном случае - ваши данные не в общем масштабе, и поэтому модель LSTM не может интерпретировать их должным образом.

# Generate predictions
trainpred = model.predict(X_train)
valpred = model.predict(X_val)

In [30]:

trainpred

Out[30]:

array([[0.32363528],
       [0.3715328 ],
       [0.46051228],
       [0.35137814],
       [0.38220662],
       [0.41239697],
       [0.3573438 ],
       [0.43657327],
       [0.47494155],
       [0.467317  ],
       [0.49233937],
       [0.49879026],
       [0.39996487],
       [0.38200712],
       [0.3309482 ],
       [0.21176702],
       [0.22578238],
       [0.18523258],
       [0.23222469],
       [0.26659006],
       [0.2368085 ],
       [0.22137557],
       [0.28356454],
       [0.16753006],
       [0.16966385],
       [0.22060908],
       [0.1916717 ],
       [0.2181809 ],
       [0.21772115],
       [0.24777801],
       [0.3288507 ],
       [0.30944437],
       [0.33784014],
       [0.37927932],
       [0.31557906],
       [0.43595707],
       [0.3505273 ],
       [0.4064384 ],
       [0.48314226],
       [0.41506904],
       [0.48799258],
       [0.4533432 ],
       [0.45297146],
       [0.46697432],
       [0.41320056],
       [0.45331544],
       [0.48461175],
       [0.50513804],
       [0.50340337],
       [0.44235045],
       [0.48495632],
       [0.32804203],
       [0.38383847],
       [0.3502031 ],
       [0.34179717],
       [0.37928385],
       [0.3852548 ],
       [0.3978842 ],
       [0.41324353],
       [0.42388642],
       [0.43424374],
       [0.4359951 ],
       [0.49112016],
       [0.49098223],
       [0.50581044],
       [0.5686604 ],
       [0.48814237],
       [0.5679423 ],
       [0.519874  ],
       [0.42899352],
       [0.4314267 ],
       [0.3878218 ],
       [0.3585053 ],
       [0.31897143]], dtype=float32)

In [31]:

valpred

Out[31]:

array([[0.374565  ],
       [0.311441  ],
       [0.37602562],
       [0.36187553],
       [0.35613692],
       [0.399751  ],
       [0.40736055],
       [0.41798282],
       [0.36257237],
       [0.4636013 ],
       [0.47177172],
       [0.45880812],
       [0.5725181 ],
       [0.5696718 ]], dtype=float32)

Прогнозы возвращаются к нормальным значения:

# Convert predictions back to normal values
trainpred = scaler.inverse_transform(trainpred)
Y_train = scaler.inverse_transform([Y_train])
valpred = scaler.inverse_transform(valpred)
Y_val = scaler.inverse_transform([Y_val])
predictions = valpred

Затем составляются прогнозы:


In [34]:

# Train predictions
trainpredPlot = np.empty_like(df)
trainpredPlot[:, :] = np.nan
trainpredPlot[previous:len(trainpred)+previous, :] = trainpred

In [35]:

# Validation predictions
valpredPlot = np.empty_like(df)
valpredPlot[:, :] = np.nan
valpredPlot[len(trainpred)+(previous*2)+1:len(df)-1, :] = valpred

In [36]:

# Plot all predictions
inversetransform, =plt.plot(scaler.inverse_transform(df))
trainpred, =plt.plot(trainpredPlot)
valpred, =plt.plot(valpredPlot)
plt.xlabel('Number of weeks')
plt.ylabel('Cancellations')
plt.title("Predicted vs. Actual Cancellations Per Week")
plt.show()

График теперь отображается следующим образом:

hotel

В двух кратких итогах:

  1. Убедитесь, что при построении реальных данных прогнозы обучения и теста не перекрываются. Это ошибочно, так как прогнозы обучения и теста относятся к двум различным наборам прогнозов.

  2. Масштабируйте свои данные перед подачей в LSTM - иначе нейронная сеть не будет знать, как интерпретировать такие данные и любые результаты будут очень поверхностными.

...