Material para acompanhar esta aulaBaixe a planilha encontrada aqui no Google Planilhas, que usaremos na aula. Baixe-a em CSV (Comma-Separated Values), o formato mais comum para guardar uma tabela de dados que qualquer linguagem consegue ler.Crie um ambiente de desenvolvimento Python 3 ou use um ambiente online já pronto, como o jupyter lab online, e importe o banco de dados.Scipy em PythonRenomeie o arquivo baixado para "dados-3.csv" para facilitar. Vamos usar os pacotes pandas, numpy, statsmodels, scipy e matplotlib. O módulo scipy.stats é o que traz as distribuições de probabilidade (normal, t, binomial...) e os testes estatísticos. Abaixo você vê como importar cada um:Importação dos pacotes em pythonTempo como índiceRepare que usamos decimal="," e thousands="." porque os números da planilha estão no formato brasileiro. Agora vamos usar o tempo como índice da tabela e calcular a variação diária do preço do ouro. Estou usando o ouro, mas recomendo que você teste também outras ações. Para medir a variação usamos .diff() (variação absoluta, em reais ou dólares) ou .pct_change() (variação percentual).Transformação da coluna Tempo em índiceAtenção, porque esse código não funciona como esperado nas versões atuais do pandas (3.x). A linha df['Variacao_Percentual'].fillna(0, inplace=True) não altera mais a tabela (o aviso que aparece na imagem já antecipava isso), e o primeiro dia continua vazio (NaN). Com esse NaN, o teste de normalidade da próxima seção devolve nan em vez do p-valor. Além disso, preencher o primeiro dia com zero inventa uma variação que não existiu. O mais correto é descartar o primeiro dia:df['Variacao_Percentual'] = df['Ouro'].pct_change() * 100variacao = df['Variacao_Percentual'].dropna()Os parâmetros inplace=True do set_index e do sort_index também geram aviso de descontinuação; prefira df = df.set_index('Tempo').sort_index(). Os resultados mudam muito pouco (o p-valor do teste de normalidade passa de 4,07e-07 para 4,43e-07), e as conclusões abaixo valem igual.Histograma da variação do preço do ouroVamos ver a cara dos nossos dados. A melhor forma de começar é um histograma:Criando o histograma do preço do ouroO resultado ficou:Histograma da variaçãoÀ primeira vista, o histograma lembra uma distribuição normal: tem forma de sino e é quase simétrico em torno de zero. Mas "lembrar" não basta; vamos testar.Teste de normalidadePara verificar se os dados podem vir de uma distribuição normal, usamos a função normaltest do scipy (o teste de D'Agostino e Pearson, que combina assimetria e curtose). A hipótese nula desse teste é que os dados vêm de uma distribuição normal.Teste de normalidade com ScipyO p-valor deu 4,0693e-07, ou seja, cerca de 0,00004%. Se as variações fossem normais, a chance de obter dados tão distantes da normal seria minúscula. Por isso rejeitamos a hipótese nula: as variações diárias do ouro não seguem uma distribuição normal. O motivo aparece nos números impressos acima: a assimetria é praticamente zero (0,005), mas a curtose em excesso é de 1,60, isto é, há mais dias perto de zero e mais dias extremos do que a normal prevê (caudas pesadas). O gráfico abaixo mostra isso: as barras passam da curva no centro e nas pontas.Distribuição real vs Distribuição normalO normaltest do scipy devolveu p-valor de 4e-07 para as variações diárias. Qual a conclusão correta, a 5% de significância?Gabarito: Rejeita-se a normalidade: os dados não seguem uma distribuição normal — a hipótese nula do normaltest é a normalidade. Um p-valor minúsculo é evidência CONTRA a hipótese nula, ou seja, contra a normalidade.Identificando outliersMesmo sem normalidade perfeita, a distância de 3 desvios padrões da média é uma regra prática muito usada para marcar dias anômalos, chamados de outliers. Se as variações fossem normais, só 0,27% dos dias cairiam fora desse intervalo. Você pode mudar o 3 para detectar anomalias maiores ou menores.Código para detectar OutliersOs dias detectados como outliers para o ouro foram:DiaVariação %2014-11-069.2123062014-11-28-8.1771722014-12-177.5590812015-10-027.8665082016-02-088.7100892016-05-04-10.8404772016-06-038.4374262016-10-04-8.7556682016-11-10-10.078868Com 756 dias, uma distribuição normal produziria uns 2 outliers (0,27% de 756); encontramos 9. É a mesma conclusão do teste de normalidade vista de outro ângulo: os dias extremos são bem mais comuns do que a normal prevê. Se quiser, procure nos jornais o que aconteceu em cada um desses dias.Se as variações fossem normais, cerca de 0,27% dos 756 dias ficariam a mais de 3 desvios padrões da média. Foram encontrados 9. O que isso indica?Gabarito: Que a distribuição tem caudas mais pesadas que a normal — 0,27% de 756 dá cerca de 2 dias esperados. Ver 9 dias extremos, mais de quatro vezes o esperado, combina com a curtose em excesso de 1,6 e com a rejeição da normalidade.Devemos investir em ouro?Temos dados suficientes para dizer que o ouro está subindo? Para isso, construímos um intervalo de confiança para a variação média diária. Mesmo sem normalidade, isso é válido aqui: com 756 dias, pelo teorema central do limite a média das variações tem distribuição aproximadamente normal.Construção do Intervalo de confiança com ScipyA média amostral é positiva (0,040% ao dia), mas o intervalo de 90% vai de −0,105% a 0,185% e inclui o zero. Ou seja, ainda não temos dados suficientes para afirmar que a variação média do ouro é maior que zero. Um teste t da média contra zero (stats.ttest_1samp(variacao, 0)) leva à mesma conclusão, com p-valor de 0,65.O intervalo de 90% para a variação média diária do ouro foi de −0,105% a 0,185%. O que se pode concluir?Gabarito: Que não há evidência suficiente de que a variação média seja diferente de zero — o intervalo inclui o zero, então zero é um valor plausível para a média. Isso não prova que o ouro não sobe; só mostra que 3 anos de dados não bastam para afirmar.E se quisermos ter mais certeza, quantos dias precisamos?Será que 3 anos de dados são suficientes? Quantos dias de pregão precisaríamos para estimar a variação média diária com uma margem de erro de apenas 0,1 ponto percentual, com 90% de confiança? Usamos a fórmula do tamanho amostral, n = (z · σ/E)²:Tamanho Amostral com ScipyO resultado é n = (1,6449 × 2,4183/0,1)² ≈ 1.583 dias de pregão, mais que o dobro dos 756 disponíveis. Como um ano tem cerca de 252 pregões, isso equivale a pouco mais de 6 anos de dados. E repare: mesmo com essa margem, se a média continuasse em 0,04%, o intervalo (0,04 ± 0,1) ainda incluiria o zero. Para separar uma média de 0,04% do zero, a margem precisaria ser menor que 0,04, o que exige cerca de 9.900 pregões, quase 40 anos.Para estimar a variação média com margem de 0,1 ponto percentual são necessários 1.583 pregões. Quantos seriam necessários para uma margem de 0,05?Gabarito: Cerca de 6.330 — n cresce com o quadrado de 1/E. Reduzir a margem à metade multiplica n por 4: 1.583 × 4 = 6.332.Qual deverá ser o tema da prova?
Reações
0
0 Comentários
Seja o primeiro a comentar
Nada aqui ainda.