Este repositório GitHub contém meu projeto final para o Nanodegree de engenheiro de aprendizado de máquina da Udacity.
Este é um preditor de preço de ações. Ele usa o algoritmo DeepAR da Amazon para criar um modelo e prever preços futuros de ações. Este repositório contém um Jupiter Notebook usado para coletar os dados, treinar um modelo e avaliá-lo. Este notebook também contém um aplicativo da web que pode ser implantado para prever preços de ações em até 30 dias de negociação no futuro.
Para executar este Web App você deve primeiro criar e implementar um modelo. Existem alguns requisitos antes de você começar.
Você deve se inscrever no RapidAPI. Crie uma conta e assine a API Yahoo Finance. Você precisará de seu RAPIDAPI-HOST
e RAPIDAPI-KEY
no Jupiter Notebook para treinar seu modelo.
Você também deve ter uma conta Amazon Web Services (AWS). Crie uma conta e navegue até o Amazon SageMaker no Console AWS. Crie uma instância de notebook. Na página Criar uma instância de notebook, clique em Repositórios Git e selecione Clonar um repositório Git público apenas para esta instância de notebook . No URL do repositório Git, digite https://github.com/scliff108/Udacity-ML-Capstone-Project.git
. Por fim, crie a instância do notebook.
Depois que a instância do Notebook estiver configurada, abra o notebook stock-forecasting-deepar
. Certifique-se de inserir seu RAPIDAPI-HOST
e RAPIDAPI-KEY
na função load_historical_data
sob o título Carregar e explorar os dados .
Depois disso, você pode executar todas as células do Notebook. Após cerca de 15 minutos, você deverá ter um modelo gerado e avaliado.
Agora que você treinou um modelo, precisará criar uma função Lambda para enviar dados ao endpoint SageMaker e retornar o resultado. Copie e cole o código abaixo em uma função Lambda na AWS. Você precisará inserir seu bucket S3 e seu nome de endpoint do Predictor no código fornecido.
import boto3
import os
import sys
import json
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = ''# YOUR BUCKET HERE
key = 'lambda-deepar-stock-forecasting/test/test.json'
obj = s3.Object(bucket, key)
file_content = obj.get()['Body'].read().decode('utf-8')
instances = file_content.splitlines()
instances = [json.loads(i) for i in instances]
for i in instances:
for _ in range(30):
i['dynamic_feat'][0].append(i['dynamic_feat'][0][-1])
configuration = {'num_samples': 30,
'output_types': ['mean'],
}
request_data = {'instances': instances,
'configuration': configuration
}
payload = json.dumps(request_data).encode('utf-8')
runtime = boto3.Session().client('sagemaker-runtime')
response = runtime.invoke_endpoint(EndpointName = '', # YOUR ENDPOINT NAME HERE
ContentType = 'application/json',
Body = payload
)
result = response['Body'].read().decode('utf-8')
return {
'statusCode': 200,
'body': result
}
Infelizmente, o Lambda só pode lidar com uma determinada quantidade de dados, então temos que fornecer menos dados ao preditor DeepAR do que temos no S3. Para fazer isso, abra o notebook lambda-data
. Novamente, insira suas informações do RapidAPI e execute todas as células. Isso fará upload de dados pequenos o suficiente para serem manipulados pelo Lambda.
Finalmente, podemos configurar o API Gateway para acionar a função Lambda que criamos e obter previsões de preços de ações. Para fazer isso, crie um novo método POST e certifique-se de que a Função Lambda esteja selecionada. Em seguida, insira o nome da sua função Lambda na caixa de texto e clique em salvar. Por fim, clique no menu suspenso Ações para implantar API.
Você precisará do URL de invocação para implantar seu aplicativo Web.
Agora que você tem uma API disponível, pode começar a usá-la em um aplicativo web. Criei um arquivo HTML e JavaScript muito simples para interagir com a API. Baixe a pasta do site deste repositório GitHub, adicione seu URL de API pública onde indicado no arquivo e abra-o. Ao clicar no botão Obter dados , você deverá ver as 20 ações em acordeão. Clique na ação para ver os preços previstos.
Seu aplicativo da web ficará assim para começar.
Depois de clicar no botão Obter dados , seu aplicativo da web ficará assim.
Depois de clicar em um estoque, seu aplicativo da web ficará assim.