Строю глубокую нейронную сеть в 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

Вопрос - ошибка в коде или просто нет сходимости или ещё что-то?