Keras LSTM previu séries temporais esmagadas e deslocadas

Estou tentando ter alguma experiência prática com Keras durante as férias e pensei em começar com o exemplo de previsão de séries temporais em dados de ações. Então, o que estou tentando fazer são as últimas 48 horas de mudanças de preço médio (percentual desde a anterior), prever qual é o preço médio da próxima hora.

No entanto, ao verificar com relação ao conjunto de testes (ou mesmo ao conjunto de treinamento), a amplitude da série prevista está muito distante e, às vezes, é alterada para ser sempre positiva ou sempre negativa, ou seja, afastada da alteração de 0%, que eu acho que seria correto para esse tipo de coisa.

Eu vim com o seguinte exemplo mínimo para mostrar o problema:

df = pandas.DataFrame.from_csv('test-data-01.csv', header=0)
df['pct'] = df.value.pct_change(periods=1)

seq_len=48
vals = df.pct.values[1:] # First pct change is NaN, skip it
sequences = []
for i in range(0, len(vals) - seq_len):
    sx = vals[i:i+seq_len].reshape(seq_len, 1)
    sy = vals[i+seq_len]
    sequences.append((sx, sy))

row = -24
trainSeqs = sequences[:row]
testSeqs = sequences[row:]

trainX = np.array([i[0] for i in trainSeqs])
trainy = np.array([i[1] for i in trainSeqs])

model = Sequential()
model.add(LSTM(25, batch_input_shape=(1, seq_len, 1)))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')
model.fit(trainX, trainy, epochs=1, batch_size=1, verbose=1, shuffle=True)

pred = []
for s in trainSeqs:
    pred.append(model.predict(s[0].reshape(1, seq_len, 1)))
pred = np.array(pred).flatten()

plot(pred)
plot([i[1] for i in trainSeqs])
axis([2500, 2550,-0.03, 0.03])

Como você pode ver, eu crio sequências de treinamento e teste, selecionando as últimas 48 horas e a próxima etapa em uma tupla, e depois avançando 1 hora, repetindo o procedimento. O modelo é uma camada 1 LSTM e 1 densa muito simples.

Eu esperaria que o enredo dos pontos previstos individuais se sobrepusesse muito bem ao enredo das sequências de treinamento (depois de tudo isso é o mesmo conjunto em que foram treinados), e o tipo de correspondência para as sequências de teste. No entanto, recebo o seguinte resultado emdados de treinamento:

Laranja: dados verdadeirosAzul: dados previstos

Alguma ideia do que está acontecendo? Eu entendi mal alguma coisa?

Atualizar: para mostrar melhor o que quero dizer com deslocados e esmagados, também plotei os valores previstos, deslocando-os de volta para corresponder aos dados reais e multiplicados para corresponder à amplitude.

plot(pred*12-0.03)
plot([i[1] for i in trainSeqs])
axis([2500, 2550,-0.03, 0.03])

Como você pode ver, a previsão se encaixa perfeitamente nos dados reais, são apenas esmagados e deslocados de alguma forma, e não consigo entender o porquê.

questionAnswers(2)

yourAnswerToTheQuestion