Keras Deep Learning и финансовая отдача - PullRequest
1 голос
/ 28 марта 2019

Я испытываю Tensorflow через библиотеку Keras и, прежде чем погрузиться в предсказание неопределенности, подумал, что было бы неплохо предсказать что-то определенное. Поэтому я попытался предсказать еженедельный доход, используя ежедневные данные об уровне цен. Моя входная форма выглядит так: (1000, 5, 2), то есть 1000 матриц формы:

Stock A   Stock B
 110       100
 95        101
 90        100  
 89        99
 100       110

Для Stock A цена на day t=0 равна 100, 95 на t-1 и 100 на t-5. Таким образом, еженедельный доход для Stock A будет 110/100=10% и -10% для Stock B. Поскольку сейчас я фокусируюсь только на прогнозировании Stock As, моим значением y для этой входной матрицы будет просто скаляр 0.01. Кроме того, я хочу сделать это проблемой классификации и, таким образом, создать вектор с горячим кодированием через to_categorical с 1, если y выше 5%, 2, если он ниже -5%, и 0, если он между ними. Следовательно, мой вывод классификации для вышеупомянутой матрицы будет:

0 1 0

Чтобы упростить: я хочу, чтобы моя модель научилась вычислять доходность, то есть разделить первое значение в матрице ввода на последнее значение матрицы ввода для запаса A и игнорировать ввод для запаса B. Это даст y. Для меня это просто практическая задача, прежде чем я приступлю к более сложным задачам, и модель должна достичь нулевой потери, потому что нет никакой неопределенности. Какую модель вы предлагаете сделать это? Я попробовал следующее, и оно не сходится вообще. Вес обучения и проверки рассчитывается через compute_sample_weight('balanced', ).

Earlystop = EarlyStopping(monitor='val_loss', patience=150, mode='min', verbose=1, min_delta=0.0002, restore_best_weights=True) 
checkpoint = ModelCheckpoint('nn', monitor='val_loss', verbose=1, save_best_only=True, mode='min', save_weights_only=False)
Plateau = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=30, verbose=1)
optimizer = optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, amsgrad=True)

input_ = Input(batch_shape=(batch_size, 1, 5, 2)) 

model = LocallyConnected2D(16, kernel_size=(5, 1), padding='valid', data_format="channels_first")(input_)
model = LeakyReLU(alpha=0.01)(model)
model = Dense(128)(model)
model = LeakyReLU(alpha=0.01)(model)
model = Flatten()(model)

x1 = Dense(3, activation='softmax',  name='0')(model)
final_model = Model(inputs=input_, outputs=[x1])
final_model.compile(loss='categorical_crossentropy' , optimizer=optimizer,  metrics=['accuracy'])
history = final_model.fit(X_train, y_train, epochs=1000, batch_size=batch_size, verbose=2, shuffle=False, validation_data=[X_valid, y_valid, valid_weight],  sample_weight=train_weight, callbacks=[Earlystop, checkpoint, Plateau])

Я думал, что для этого может быть полезна свертка, и, поскольку каждое возвращение рассчитывается индивидуально, я решил использовать слой LocallyConnected. Нужно ли добавлять больше слоев для такой простой задачи?

РЕДАКТИРОВАТЬ: преобразовал мою входную матрицу в возвращения, и модель успешно сходится. Таким образом, ввод должен быть корректным, но модель не может найти функцию деления. Есть ли слои, которые подходят для этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...