Usando aprendizado de máquina para prever preços de gasolina no varejo

Para os comerciantes de inflação, um dos principais riscos são os preços da energia. O que torna isso mais interessante do que seu risco de hedge típico é que seu risco real é o que o BLS acha que os preços da gasolina fizeram, não os preços futuros observáveis. Portanto, todos os bons comerciantes de TIPS têm um modelo de previsão dos preços da gasolina no varejo.

Então é isso que estamos tentando prever. Se o spread entre os futuros da RBOB e os preços de varejo fosse constante, isso seria trivial. Como você pode ver, não é:

Isso varia de 40c a 120c, e embora haja um padrão sazonal para a propagação, o ruído é bastante grande.

Para resolver esse problema, criei uma rede neural recorrente Long Short-Term Memory (LSTM).

(Gostaria de agradecer ao Dr. Jason Brownlee e seu site https://machinelearningmastery.com. Eu não poderia ter feito isso sem seus tutoriais. Muito do código usado aqui foi adaptado de https://machinelearningmastery.com / multivariate-time-series-forecasting-lstms-keras /)

Para fazer isso, usarei Keras (https://keras.io/) usando um back-end do Tensorflow.

Etapa 1 – Prepare a máquina

Em meu ambiente virtural Python 3.6 eu instalo: numpy, pandas, scipy, sklearn, tensorflow e Keras. Se você quiser visualizar a rede, você precisa instalar no venv pydot e graphviz, bem como instalar o graphviz na máquina (via apt-get)

Etapa 2 – Preparar os dados

Os dados brutos são um arquivo csv que possui três colunas: a data, o preço XB2 e o preço médio da gasolina no varejo. Esses são todos os dados que irei usar. Como eu conheço o formato da data, é fácil criar o dataframe

O que cria:

Como desejo que a rede aprenda (espero) qualquer sazonalidade nos dados, crio mais duas colunas numéricas, uma para o mês e outra para a data.

O que agora me dá o dataframe de 4 colunas de

Quero aproveitar as vantagens da rede LSTM, então vou passar os dados dos 12 dias anteriores para prever os preços atuais do gás no varejo. Em outras palavras, terei 48 entradas em meu modelo para tentar prever minha única saída. As 48 entradas serão variáveis ​​t-12 até a variável t-1 para todos os dados para prever o varejo no tempo t.

Usando a função do Dr. Jason Brownlee series_to_supervised , criamos nossa matriz.

Agora temos uma matriz semelhante a esta (apenas um trecho):

O próximo passo é normalizar tudo entre 0 e 1. O MinMaxScaler do sklearn parece ser a ferramenta certa para o trabalho:

Agora é hora de dividir nossos dados em conjuntos de dados de treinamento e teste. Temos 5 anos de dados, então terei o trem do modelo nos primeiros dois anos e testarei nos últimos três. Em seguida, transformamos os conjuntos de dados nas formas 3D que Keras espera.

Se olharmos para a forma de nossos dados, podemos ver que:

Portanto, temos 730 dias de 48 observações e resultados em nosso conjunto de treinamento e 1363 dias no conjunto de teste. Agora precisamos criar nosso modelo. Isso se baseia na previsão de série temporal multivariada do Dr. Brownlee com LSTMs no modelo Keras.

Vamos definir o LSTM com 50 neurônios na primeira camada oculta e 1 neurônio na camada de saída para prever a poluição. A forma de entrada será um intervalo de tempo com 48 recursos.

Usaremos a função de perda do erro médio absoluto (MAE) e a versão eficiente de Adam da descida do gradiente estocástico.

O modelo será adequado para 50 períodos de treinamento com um tamanho de lote de 91.

Finalmente, acompanhamos a perda de treinamento e teste durante o treinamento, definindo o argumento validação_data na função fit (). No final da execução, tanto o treinamento quanto a perda do teste são plotados.

Ou em linguagem sofisticada de aprendizado de máquina.

Executando o modelo, obtemos o seguinte gráfico de perdas

O RMSE total deste modelo é 5,45, que é cerca de meio centavo. Nada mal para um modelo básico e pouco ajustado. Para mostrar a previsão, basicamente desescalonamos os resultados do modelo (lembre-se de que o modelo prevê 0,1)

Como podemos ver, ele faz um trabalho muito bom:

Se representarmos um gráfico em comparação com o outro, vemos muito pouco viés e algum espaço para melhorias (especialmente no canto inferior esquerdo)

Como mencionei, este é um modelo básico. Existem muitas maneiras de torná-lo melhor, mas nada ruim para começar.