Нейронная сеть PyBrain для предсказания акций не будет учиться

Я пытаюсь закодировать нейронную сеть, которая может прогнозировать некоторые данные. Поэтому я использую PyBrain для Python. Я понял, что для этой задачи подойдет SupervisedDataset. Я взял некоторые биржевые данные и поместил 5 значений из них в качестве входных данных, а шестые — в качестве цели. Затем я строю сеть прямой связи с помощью функции buildNetwork и обучаю ее с помощью функции BackpropTrainer.

В любом случае ошибок меньше не станет. Он застрял на ~ 0,6 и, кажется, колеблется там. Я пытался настроить импульс и скорость обучения, но это не помогло. Что я делаю неправильно?

from pybrain.datasets import SupervisedDataSet
DS = SupervisedDataSet(5, 1)

DS.addSample((44.055, 44.54, 44.04, 43.975, 43.49), (42.04,))
DS.addSample((44.54, 44.04, 43.975, 43.49, 42.04), (42.6,))
DS.addSample((44.04, 43.975, 43.49, 42.04, 42.6), (42.46,))
DS.addSample((43.975, 43.49, 42.04, 42.6, 42.46), (41.405,))
DS.addSample((43.49, 42.04, 42.6, 42.46, 41.405), (42.385,))
DS.addSample((42.04, 42.6, 42.46, 41.405, 42.385), (42.655,))
DS.addSample((42.6, 42.46, 41.405, 42.385, 42.655), (41.53,))
DS.addSample((42.46, 41.405, 42.385, 42.655, 41.53), (40.09,))
DS.addSample((41.405, 42.385, 42.655, 41.53, 40.09), (39.8,))
DS.addSample((42.385, 42.655, 41.53, 40.09, 39.8), (40.2,))
DS.addSample((42.655, 41.53, 40.09, 39.8, 40.2), (39.915,))
DS.addSample((41.53, 40.09, 39.8, 40.2, 39.915), (40.21,))
DS.addSample((40.09, 39.8, 40.2, 39.915, 40.21), (40.34,))
DS.addSample((39.8, 40.2, 39.915, 40.21, 40.34), (41.195,))
DS.addSample((40.2, 39.915, 40.21, 40.34, 41.195), (41.595,))
DS.addSample((39.915, 40.21, 40.34, 41.195, 41.595), (41.975,))
DS.addSample((40.21, 40.34, 41.195, 41.595, 41.975), (42.045,))
DS.addSample((40.34, 41.195, 41.595, 41.975, 42.045), (40.13,))
DS.addSample((41.195, 41.595, 41.975, 42.045, 40.13), (38.99,))
DS.addSample((41.595, 41.975, 42.045, 40.13, 38.99), (39.81,))
DS.addSample((41.975, 42.045, 40.13, 38.99, 39.81), (40.23,))
DS.addSample((42.045, 40.13, 38.99, 39.81, 40.23), (40.47,))
DS.addSample((40.13, 38.99, 39.81, 40.23, 40.47), (40.45,))
DS.addSample((38.99, 39.81, 40.23, 40.47, 40.45), (40.01,))
DS.addSample((39.81, 40.23, 40.47, 40.45, 40.01), (40.23,))
DS.addSample((40.23, 40.47, 40.45, 40.01, 40.23), (40.2,))
DS.addSample((40.47, 40.45, 40.01, 40.23, 40.2), (41.605,))
DS.addSample((40.45, 40.01, 40.23, 40.2, 41.605), (42.1,))
DS.addSample((40.01, 40.23, 40.2, 41.605, 42.1), (42.135,))
DS.addSample((40.23, 40.2, 41.605, 42.1, 42.135), (41.95,))
DS.addSample((40.2, 41.605, 42.1, 42.135, 41.95), (41.145,))
DS.addSample((41.605, 42.1, 42.135, 41.95, 41.145), (40.635,))
DS.addSample((42.1, 42.135, 41.95, 41.145, 40.635), (41.25,))
DS.addSample((42.135, 41.95, 41.145, 40.635, 41.25), (41.19,))
DS.addSample((41.95, 41.145, 40.635, 41.25, 41.19), (42.065,))
DS.addSample((41.145, 40.635, 41.25, 41.19, 42.065), (42.025,))
DS.addSample((40.635, 41.25, 41.19, 42.065, 42.025), (42.09,))
DS.addSample((41.25, 41.19, 42.065, 42.025, 42.09), (41.79,))
DS.addSample((41.19, 42.065, 42.025, 42.09, 41.79), (43.11,))


from pybrain.tools.shortcuts import buildNetwork
FNN = buildNetwork(DS.indim, 15, DS.outdim, bias=True)

from pybrain.supervised.trainers import BackpropTrainer
TRAINER = BackpropTrainer(FNN, dataset=DS, learningrate = 0.005, \
    momentum=0.1, verbose=True)

for i in range(1000):
    TRAINER.train()

Редактировать: некоторые из комментариев сомневались, что эти данные подходят для нейронной сети в целом. Поэтому я сделал ту же сеть в MATLAB, и она отлично работала. После 11 эпох обучения ошибка была менее 0,002.

та же сеть и данные в MATLAB

Кроме того, я пытался использовать SupervisedDataset из PyBrain, но это тоже не сработало. У меня сейчас нет идей.


person Gizmo    schedule 15.09.2014    source источник
comment
Хотя у меня нет окончательного ответа на ваш вопрос, я хотел бы отметить, что вы не обязательно делаете что-то неправильное. Ваши данные могут не просто содержать информацию для прогнозирования — если бы вы могли использовать FFNN для прогнозирования вашего конкретного фондового рынка, чтобы получить прибыль, кто-то другой уже сделал бы это. Если вы сомневаетесь в своем коде, мой совет: сначала протестируйте свою сеть на более простых данных, а затем двигайтесь дальше.   -  person loopbackbee    schedule 15.09.2014
comment
Кроме того, вы не указываете какие пять значений, которые вы используете в качестве обучающих данных. Предполагая, что это 5 последовательных значений перед тем, которое вы хотите предсказать, обратите внимание, что необычно подавать необработанные данные NN. Большинство работ, о которых я знаю, работают с обработанными данными и статистикой более высокого уровня.   -  person loopbackbee    schedule 15.09.2014
comment
Спасибо. Это только для целей обучения. На самом деле я просто пытаюсь получить лучший результат для моего прогноза, чем использование значения за день до этого. Я попытаюсь протестировать сеть с более простыми данными.   -  person Gizmo    schedule 15.09.2014
comment
Вы также можете изменить количество предыдущих дней, которые вы используете в качестве входных данных. Я не уверен, что NN - правильный инструмент для прогнозирования временных рядов с абсолютными значениями. Возможно, вы захотите попробовать и другие цели. Может быть, просто плюс и минус, чтобы предсказать, будет ли акция расти или падать.   -  person Max Linke    schedule 15.09.2014
comment
Но разве сеть не должна хотя бы подстраиваться под заданные образцы? Несмотря на то, что сеть полезна для других данных, она должна быть в состоянии изучить эти образцы и минимизировать ошибку, или я ошибаюсь? Ошибка действительно не улучшится.   -  person Gizmo    schedule 15.09.2014
comment
Вот книга, объясняющая, почему ваша ошибка, вероятно, останется высокой: amazon .com/Random-Walk-Down-Wall-Street/dp/0393330338   -  person John Zwinck    schedule 15.09.2014
comment
Если вы настаиваете на использовании данных об акциях, вы можете использовать акции (например, шесть из одного сектора), которые исторически имеют тенденцию расти и падать одновременно. Но люди уже несколько десятилетий пытаются заставить базовые нейронные сети предсказывать цены на акции, я помню, читал об этом в начале 90-х. Если бы это работало, это было бы широко распространено, что означало бы, что оно перестало бы работать. Даже нейронные сети в человеческом мозгу не могут делать это последовательно, и они намного больше, чем ваша программная нейронная сеть.   -  person rossdavidh    schedule 15.09.2014


Ответы (1)


Я нашел решение. Оказалось, что данные о запасах нужно было сначала нормализовать. Итак, я написал эту функцию:

def normalization(data, new_max, new_min):
    old_max = 0
    old_min = 0

    # Finde altes Max- und Minimum
    for i in range(len(data)):
        if old_max < data[i]:
            old_max = data[i]
        elif old_min > data[i]:
            old_min = data[i]

    old_range = (old_max - old_min)

    for i in range(len(data)):
        if old_range == 0:
            data[i] = new_min
        else:
            new_range = (new_max - new_min)
            data[i] = (((data[i] - old_min) * new_range) / old_range) + new_min

Я масштабировал данные от 0 до 1 и вуаля — сеть наконец научилась.

person Gizmo    schedule 16.09.2014
comment
Вам это все еще нужно? - person Gizmo; 04.01.2015