--- title: Revisão Julho - Bibliotecas e API --- ![](https://letscode-academy.com/assets/logo_lc_png.png) ---------- <center> <font size="+3"><b> Revisão</b></font></center> <center> <font size="+2"><b> Bibliotecas e API</b></font></center> ---------- ### Exercício 1 - Stock Vamos consumir a API de dados históricos de ações para analisar a crise financeira de 2008. #### Passo 1 A primeira coisa a se fazer é conseguir a API Key. Para esse exercício, iremos utilizar https://www.alphavantage.co/ Para isso, Clique em "GET YOUR FREE API KEY" <img src="https://i.imgur.com/jMbRCmW.png" width="400"><br> Preencha os dados. Podem por a Let's Code ou sua empresa, seu email, que você é estudante, investidor. Não faz muita diferença no final. ![](https://i.imgur.com/UqQvlI5.png) O importante é anotar anotar sua API key, você irá precisar dela: ``` Welcome to Alpha Vantage! Here is your API key: XXXXXXXXXXXXX ``` ### Passo 2 É sugerido o uso da biblioteca `requests` (https://requests.readthedocs.io/en/master/) para fazer requisições HTTP a API da Alpha Vantage. **Bônus:** construa uma mini-biblioteca que simplifca sua vida usando `requests` por baixo. No entanto, existem outras alternativas mais simples para usar a API, caso não queira o desafio acima: - [pandas-datareader](https://github.com/pydata/pandas-datareader) - [alpha_vantage](https://github.com/RomelTorres/alpha_vantage) O objetivo desse exercício é fazer análise das ações de 6 bancos: * Bank of America * CitiGroup * Goldman Sachs * JPMorgan Chase * Morgan Stanley * Wells Fargo No período da crise de financeira de 2007-2008 até início de 2016. :::warning **Importante: use a API `TIME_SERIES_DAILY_ADJUSTED` e coluna adjusted_closed** para o preço de fechamento das ações. ::: >Geralmente o preço de fechamento ajustado é frequentemente utilizado para se realizar uma análise detalhada sobre retornos históricos de uma ação negociada em bolsa de valores. >[Mais sobre preço de fechamento ajustado aqui.](https://www.sunoresearch.com.br/artigos/preco-fechamento-ajustado/) ### Perguntas :::info A sugestão aqui é que você construa 1 único DataFrame com todas as ações de todos os bancos. `MultiIndex` pode ser uma opção! ::: 1. Qual é o preço máximo de fechamento das ações de cada banco ao longo do período? 2. Crie um novo DataFrame vazio chamado `return`. Esse DataFrame conterá os retornos das ações de cada banco. Retornos são normalmente definidos por: $$ r_t = \frac{p_t - p_{t-1}}{p_{t-1}} = \frac{p_t}{p_{t-1}} - 1 \\~\\ r_t = \textrm{retorno} \\ p_t = \textrm{preço de fechamento} \\ p_{t-1} = \textrm{preço de fechamento anterior} $$ :::spoiler Dica Pesquise pela função `pct_change()` do pandas ::: 3. Usando esse retorno, descubra em quais datas cada ação bancária teve os piores retornos em um único dia. Você deve notar que 4 dos bancos compartilham o mesmo dia pela pior queda. Aconteceu algo significativo nesse dia? 4. Veja o desvio padrão dos retornos. Qual ação você classificaria como a mais arriscada ao longo de todo o período? Qual você classificaria como o mais arriscado para o ano de 2015 5. Crie um distplot usando seaborn com os retornos de 2015 para o Morgan Stanley. 6. Crie um gráfico de linhas mostrando o preço de fechamento para cada banco durante todo o índice de tempo. :::spoiler Spoiler Deverá ficar parecido com esse: ![](https://i.imgur.com/FcPzZzl.png) ::: <br> 7. Crie um gráfico de médias móveis para o Bank of America no ano de 2008 >Médias móveis são comumente usadas com séries temporais para **suavizar flutuações curtas e destacar tendências de longo prazo**. >https://pt.wikipedia.org/wiki/M%C3%A9dia_m%C3%B3vel :::spoiler Dica Dica: pesquise pela função `rolling()` do pandas. ::: :::spoiler Spoiler Deverá ficar parecido com esse: ![](https://i.imgur.com/l253s0a.png) ::: <br> 8. Opcional: Usando plotly, faça um gráfico de Candle Stick do Bank Of America de 2015. >Candlestick é uma técnica de análise gráfica de mercado, criada no Japão em meados do século XVIII, nas antigas bolsas de arroz de Osaka. >https://pt.wikipedia.org/wiki/Candlestick :::spoiler Spoiler Deverá ficar parecido com esse: ![](https://i.imgur.com/xgUCjPR.png) ::: ----- ### Exercício 2 - Meu Tesouro Direto Vamos construir uma API de simulação de compra e venda de títulos do Tesouro Direto. Para os dados do tesouro, utilizar a URL: http://www.tesouro.fazenda.gov.br/tesouro-direto-precos-e-taxas-dos-titulos #### Requisitos da API - Os dados devem ser reais e obtidos [nessa fonte](http://www.tesouro.fazenda.gov.br/tesouro-direto-precos-e-taxas-dos-titulos); - O usuário deve poder consultar uma lista com os tipos de produtos disponíveis; - O usuário deve poder consultar informações sobre os três diferentes produtos para investir: - Selic - IPCA - Prefixado - O usuário deve poder consultar informações sobre os três diferentes produtos para resgatar: - Selic - IPCA - Prefixado - O usuário pode comprar produtos; - O usuário pode consultar suas compras; - O usuário pode resgatar suas compras; - *Extra:* o usuário pode vender seus títulos. #### API Schema Contrato da API que você deve desenvolver :::spoiler Informações GET /api/v1/products/ ```json [ "Tesouro IPCA+ 2026", "Tesouro IPCA+ 2035", "Tesouro IPCA+ 2045", "Tesouro IPCA+ com Juros Semestrais 2030", "Tesouro IPCA+ com Juros Semestrais 2040", "Tesouro IPCA+ com Juros Semestrais 2055", "Tesouro Prefixado 2023", "Tesouro Prefixado 2026", "Tesouro Prefixado com Juros Semestrais 2031", "Tesouro Selic 2025" ] ``` GET /api/v1/invest/selic/ ```json [ { "titulo":"Tesouro Selic 2025", "vencimento":"01\/03\/2025", "rendimento_a_a":0.03, "valor_minimo":105.92, "preco_unitario":10592.7, "atualizado_em":"2020-05-03T21:31:24.890Z" } ] ``` GET /api/v1/invest/ipca/ ```json [ { "titulo":"Tesouro IPCA+ 2026", "vencimento":"15\/08\/2026", "rendimento_a_a":3.43, "valor_minimo":53.53, "preco_unitario":2676.91, "atualizado_em":"2020-05-03T21:31:24.890Z" }, { "titulo":"Tesouro IPCA+ 2035", "vencimento":"15\/05\/2035", "rendimento_a_a":4.3, "valor_minimo":35.2, "preco_unitario":1760.38, "atualizado_em":"2020-05-03T21:31:24.890Z" }, { "titulo":"Tesouro IPCA+ 2045", "vencimento":"15\/05\/2045", "rendimento_a_a":4.3, "valor_minimo":34.7, "preco_unitario":1156.83, "atualizado_em":"2020-05-03T21:31:24.890Z" }, { "titulo":"Tesouro IPCA+ com Juros Semestrais 2030", "vencimento":"15\/08\/2030", "rendimento_a_a":3.8, "valor_minimo":39.54, "preco_unitario":3954.82, "atualizado_em":"2020-05-03T21:31:24.890Z" }, { "titulo":"Tesouro IPCA+ com Juros Semestrais 2040", "vencimento":"15\/08\/2040", "rendimento_a_a":4.29, "valor_minimo":41.0, "preco_unitario":4100.8, "atualizado_em":"2020-05-03T21:31:24.890Z" }, { "titulo":"Tesouro IPCA+ com Juros Semestrais 2055", "vencimento":"15\/05\/2055", "rendimento_a_a":4.39, "valor_minimo":43.38, "preco_unitario":4338.79, "atualizado_em":"2020-05-03T21:31:24.890Z" } ] ``` GET /api/v1/invest/prefixado/ ```json [ { "titulo":"Tesouro Prefixado 2023", "vencimento":"01\/01\/2023", "rendimento_a_a":4.87, "valor_minimo":35.24, "preco_unitario":881.07, "atualizado_em":"2020-05-03T21:31:24.890Z" }, { "titulo":"Tesouro Prefixado 2026", "vencimento":"01\/01\/2026", "rendimento_a_a":7.09, "valor_minimo":33.92, "preco_unitario":678.48, "atualizado_em":"2020-05-03T21:31:24.890Z" }, { "titulo":"Tesouro Prefixado com Juros Semestrais 2031", "vencimento":"01\/01\/2031", "rendimento_a_a":7.78, "valor_minimo":35.62, "preco_unitario":1187.57, "atualizado_em":"2020-05-03T21:31:24.890Z" } ] ``` Devemos ter o algo similar, mas utilizando os dados de resgate, para as seguites URLs: GET /api/v1/resgate/selic/ GET /api/v1/resgate/prefixado/ GET /api/v1/resgate/ipca/ ::: :::spoiler Compra POST /api/v1/comprar ```json { "produto": "Tesouro Selic 2025", "quantidade": 0.5, "usuario": "Caio Lopes" } ``` Retorno de sucesso: ```json { "produto": "Tesouro Selic 2025", "quantidade": 0.5, "total": 0.5, "valor": 5296.35 "user": "caiolopes" } ``` Obs: - produto deve ser um produto válido - `valor` deve ser calculado pela quantidade vezes preço unitário do produto - checar se o `valor` passa o valor mínimo do produto, caso contrário, devolver erro Exemplo de erro: ```json { "erro": "Produto não existe" } ``` Armazenar compras do usuário em um csv: usuario |quantidade|valor|produto -----------|:----------:|------|------| caiolopes |0.5|5296.35|Tesouro Selic 2025 ::: :::spoiler Consulta das compras GET /api/v1/compras/caiolopes ```json [ "produto":"Tesouro Selic 2025" "valor":5296.35 "quantidade":0.5 ] ``` GET /api/v1/compras/nao_existe ```json { "erro": "Usuário 'nao_existe' não existe na base." } ``` ::: :::spoiler Resgate POST /api/v1/vender ```json { "produto": "Tesouro Selic 2025", "quantidade": 0.5, "usuario": "caiolopes" } ``` Retorno de sucesso: ```json { "produto": "Tesouro Selic 2025", "quantidade_vendida": 0.5, "total": 0, "valor": 5293.8 "user": "caiolopes" } ``` Obs: o valor da venda tem ser o valor unitário de resgate desse produto vs quantidade vendida. ::: #### Utilizades Funções e módulos úteis: - [read_html](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_html.html) - [to_json](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_json.html) - [módulo `json` nativo do python](https://docs.python.org/3/library/json.html) - validem os dados de entrada e retornem mensagens de erros se não estiver correto.