Estoy intentando pronosticar los precios de las acciones utilizando la transformada rápida de Fourier, y trazar los precios históricos, "futuros" (es decir, reales) y pronosticados en el mismo gráfico para comparar visualmente la precisión del método de pronóstico. Sin embargo, no entiendo por qué los valores de previsión de salida son mucho más bajos que los últimos datos de entrada de la propia serie temporal.
import numpy as np
import pylab as pl
from numpy import fft
from pandas_datareader import data
def fourierExtrapolation(x, n_predict):
n = x.size
n_harm = 50
t = np.arange(0, n)
p = np.polyfit(t, x, 1)
x_notrend = x - p[0] * t
x_freqdom = fft.fft(x_notrend)
f = fft.fftfreq(n)
indexes = list(range(n))
indexes.sort(key=lambda i: np.absolute(f[i]))
t = np.arange(0, n + n_predict)
restored_sig = np.zeros(t.size)
for i in indexes[:1 + n_harm * 2]:
ampli = np.absolute(x_freqdom[i]) / n
phase = np.angle(x_freqdom[i])
restored_sig += ampli * np.cos(2 * np.pi * f[i] * t + phase)
return restored_sig + p[0] * t
df = data.DataReader('AAPL', 'yahoo', '2017-01-01', '2021-02-28')
hist_prices = df.loc[:'2020-11-01','Adj Close']
fut_prices = df.loc['2020-11-01':,'Adj Close']
extrapolation = fourierExtrapolation(hist_prices, len(fut_prices)-len(hist_prices))
Ahora, cuando imprimo los valores extrapolados, son muy bajos en comparación con hist_prices
y fut_prices
que se hace muy evidente al ejecutar el siguiente código:
pl.plot(fut_prices.index, extrapolation, 'r', label='extrapolation')
pl.plot(hist_prices.index, hist_prices, 'b', label='x_hist', linewidth=1)
pl.plot(fut_prices.index, fut_prices, 'g', label='x_real', linewidth=1)
pl.legend()
pl.show()
¿Qué me falta? ¿Por qué mi serie de previsiones no está en el mismo orden de magnitud que los precios de los insumos?