Строю глубокую нейронную сеть в R при помощи пакета Keras для прогнозирования индекса Nasdaq (QQQ), код выглядит следующим образом:
Код:
require(xts)
require(keras)
# require(PerformanceAnalytics)
# require(xlsx)
#############################################################
# Data preparation
data = read.csv(file = "QQQ.csv", header = TRUE, dec = ".", sep = ";")
# prices
dates = unlist(lapply(X = data[1], FUN = as.character))
dates = as.Date(x = dates, format = "%Y-%m-%d")
prices = unlist(data["close"]) / unlist(data["factor"])
prices = na.omit(xts(x = prices, order.by = dates))
returns = na.omit(Return.calculate(prices = prices, method = "discrete"))
# plots
plot.xts(x = prices)
input_data = xts()
for(i in 1:4){
input_data = merge.xts(lag(x = prices, k = i), input_data)
}
input_data = na.omit(input_data)
train_data = input_data["2017::2018-03"]
train_targets = prices["2017::2018-03"]
train_data = as.matrix(train_data)
# train_targets = as.matrix(train_targets)
validation_data = input_data["2018-04"]
validation_targets = prices["2018-04"]
# min-max normalization
train_data = (train_data - min(train_data)) / (max(train_data) - min(train_data))
train_targets = (train_targets - min(train_targets)) / (max(train_targets) - min(train_targets))
#############################################################
# Create and train a multi-layer perceptron
validation_split = 0.05
model = keras_model_sequential() %>%
layer_dense(units = 40, input_shape = dim(train_data)[2]) %>%
layer_dense(units = 40) %>%
layer_dense(units = 1)
model %>% compile(optimizer = "sgd", loss = "mse", metrics = "mae")
history = model %>% fit(x = train_data, y = train_targets, epochs = 80, batch_size = 32, validation_split = validation_split)
plot(history)
prediction = predict(object = model, x = validation_data)
validation = cbind(validation_targets, prediction)
colnames(validation) = c("validation_targets","prediction")
Данные можно взять здесь
https://yadi.sk/i/hNYGolpr3VgE8KВ
Код:
model = keras_model_sequential()
как видно три слоя: два скрытых по 40 нейронов в каждом и в выходном 1 нейрон, по умолчанию функция активации линейная. На вход подаётся 4 лага цены, которые нормализуются при помощи метода minmax.
При линейных функциях активации оптимизация работает нормально и прогнозные значения получаются нормальной величины, сопоставимой с действительными значениями
Код:
> validation
validation_targets prediction
2018-04-02 155.51 163.6304
2018-04-03 157.26 160.0974
2018-04-04 159.74 159.2506
2018-04-05 160.65 159.6367
2018-04-06 156.63 157.2645
2018-04-09 157.73 159.6480
2018-04-10 161.21 161.1535
2018-04-11 160.28 160.2764
2018-04-12 162.21 158.3315
2018-04-13 161.37 159.9654
2018-04-16 162.60 162.2367
2018-04-17 166.10 162.0686
2018-04-18 166.44 162.9221
2018-04-19 164.91 163.0517
2018-04-20 162.30 165.1697
2018-04-23 161.89 167.6941
2018-04-24 158.46 167.2182
2018-04-25 158.65 165.5770
2018-04-26 161.99 163.3669
2018-04-27 162.09 161.7258
2018-04-30 160.94 159.7851
Если хотя бы в первом слое поставить функцию активации
softmax:
Код:
model = keras_model_sequential() %>%
layer_dense(units = 40, activation = "softmax",input_shape = dim(train_data)[2]) %>%
layer_dense(units = 40) %>%
layer_dense(units = 1)
то получается просто дичь:
Код:
validation
validation_targets prediction
2018-04-02 155.51 0.5135824
2018-04-03 157.26 0.5135846
2018-04-04 159.74 0.5135775
2018-04-05 160.65 0.5135860
2018-04-06 156.63 0.5135867
2018-04-09 157.73 0.5135838
2018-04-10 161.21 0.5135776
2018-04-11 160.28 0.5135860
2018-04-12 162.21 0.5135867
2018-04-13 161.37 0.5135854
2018-04-16 162.60 0.5135860
2018-04-17 166.10 0.5135851
2018-04-18 166.44 0.5135868
2018-04-19 164.91 0.5135872
2018-04-20 162.30 0.5135857
2018-04-23 161.89 0.5135819
2018-04-24 158.46 0.5135805
2018-04-25 158.65 0.5135809
2018-04-26 161.99 0.5135780
2018-04-27 162.09 0.5135856
2018-04-30 160.94 0.5135869
Вопрос - ошибка в коде или просто нет сходимости или ещё что-то?