---
title: Revisão Julho - Bibliotecas e API
---

----------
<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.

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:

:::
<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:

:::
<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:

:::
-----
### 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.