Esse código a baixo é uma parte de um projeto que fiz com base na aula #117.
Eu fiz uma modificação em como o calculo é feito, mas se mantem o calculo para o período de 33 dias como foi proposto na aula.
Gostaria de saber se alguém ou consegue me dizer se a logica que utilizei para calcular a probabilidade dos dias úteis que faltam para o vencimento está correta.
Importação de Bibliotecas
-
from pandas.tseries.offsets import BDay
: ImportaBDay
para considerar apenas dias úteis. -
from scipy.stats import norm
: Importa a função norm para cálculos estatísticos. -
import numpy as np
: Importa a biblioteca numpy para operações matemáticas. -
import pandas as pd
: Importa a biblioteca pandas para manipulação de dados.
Entrada de Dados e Preparação
-
util_days = float(input('Quantos dias uteis faltam para o vencimento? '))
: Solicita o número de dias úteis restantes até o vencimento. -
dias_que_faltam = 33 - util_days
: Calcula a diferença entre 33 e o número de dias úteis inseridos.
Cálculo de Variações e Volatilidades
-
vmm = ((1 + retorno/100) ** (1/60) - 1) * 100
: Calcula a Variação Média Mensal (VMM) com base no retorno fornecido. -
vm_33_days = ((1 + vmm/100) ** (33/20) - 1) * 100
: Calcula a variação média para o período de 33 dias. -
vol_33 = (vol252 * np.sqrt(33))
: Calcula a volatilidade para o período de 33 dias. -
vol252 = (ewma_volatility_annual / np.sqrt(252))
: Calcula a volatilidade anualizada com base na volatilidade EWMA. -
vm_util_days = ((1 + vmm/100) ** (util_days/20) - 1) * 100
: Calcula a variação média para o período de dias úteis fornecido. -
vol_util_days = (vol252 * np.sqrt(util_days))
: Calcula a volatilidade para o período de dias úteis fornecidos.
Preços e Datas
-
preco_atual = data['Adj Close'].iloc[-1]
: Obtém o preço mais recente da ação. -
preco_atual_2 = float(input('Qual o preço da analise? ').replace(',', '.'))
: Solicita um preço para análise. 15-20: O código busca a data final mais recente nos dados, o último dia do mês anterior e o preço de fechamento correspondente a essa data.
Cálculo de Retorno e Preço Esperado
-
Retorno_médio_esperado = fechamento_mes_anterior * (1 + 33/100)
: Calcula o preço esperado no período. -
retorno_atual_do_preco = ((preco_atual / fechamento_mes_anterior) - 1) * 100
: Calcula o retorno atual do preço. -
retorno_atual_do_preco_2 = ((preco_atual_2 / fechamento_dias_uteis) - 1) * 100
: Calcula o retorno do segundo preço fornecido.
Cálculo de Z-score e Probabilidade
-
z_score33 = (retorno_atual_do_preco - vm_33_days) / vol_33
: Calcula o z-score para o período de 33 dias. -
probability = norm.cdf(z_score33)
: Calcula a probabilidade associada ao z-score calculado. -
z_score2 = (retorno_atual_do_preco_2 - vm_util_days) / vol_util_days
: Calcula o z-score para o período de dias úteis. -
probability2 = norm.cdf(z_score2)
: Calcula a probabilidade associada ao segundo z-score.
O cálculo do ( z )-score é uma medida estatística que descreve a posição de um ponto de dados em relação à média e ao desvio padrão de um conjunto de dados. No contexto do código, ele é usado para avaliar o desempenho do preço de uma ação em relação ao que seria esperado com base em sua volatilidade e variação média histórica para um determinado período.
Aqui está como o ( z )-score é calculado para o segundo preço fornecido (( z_{\text{score2}} )):
Pré-requisitos para o Cálculo
-
Variação Média para o Período de Dias Úteis (
vm_util_days
): Esta é uma estimativa da variação média do preço da ação para o período de dias úteis inseridos pelo usuário. É calculada com base na Variação Média Mensal (VMM). -
Volatilidade para o Período de Dias Úteis (
vol_util_days
): Esta é uma medida da volatilidade esperada da ação para o período de dias úteis fornecidos, baseada na volatilidade anualizada. -
Retorno Atual do Segundo Preço (
retorno_atual_do_preco_2
): Este é o retorno calculado para o segundo preço fornecido, em relação ao preço de fechamento mais recente disponível até a “nova data” calculada com base emdias_que_faltam
.
Fórmula do ( z )-score
A fórmula para calcular o ( z )-score é:
No código, isso é feito pela linha:
z_score2 = (retorno_atual_do_preco_2 - vm_util_days) / vol_util_days
Interpretação
- Um ( z )-score perto de 0 indica que o retorno atual do preço está perto da variação média esperada.
- Um ( z )-score positivo indica que o retorno atual do preço é maior do que o esperado com base na variação média e volatilidade.
- Um ( z )-score negativo sugere o oposto.
Cálculo da Probabilidade Associada
O ( z )-score é então usado para calcular a probabilidade de que o retorno atual do preço seja menor ou igual ao retorno observado, assumindo uma distribuição normal. Isso é feito usando a função de distribuição cumulativa normal (CDF):
probability2 = norm.cdf(z_score2)
Esta probabilidade pode ser usada para avaliar o risco ou a probabilidade de diferentes cenários.
Variação Média para o Período de Dias Úteis (vm_util_days
)
Esta variável é uma extensão da Variação Média Mensal (vmm
) e visa estimar a variação média do preço da ação para o período de dias úteis especificado pelo usuário.
Aqui, vmmvmm é a Variação Média Mensal, e util_daysutil_days é o número de dias úteis inseridos pelo usuário. O número 20 é usado como um aproximado do número médio de dias úteis em um mês.
Volatilidade para o Período de Dias Úteis (vol_util_days
)
Esta variável representa a volatilidade esperada da ação para o período de dias úteis fornecidos. É calculada com base na volatilidade anualizada (vol252
), ajustada para o número de dias úteis.
Aqui, util_daysutil_days serve para ajustar a volatilidade anualizada para o período de tempo mais curto especificado.
Retorno Atual do Segundo Preço (retorno_atual_do_preco_2
)
Esta variável calcula o retorno percentual do segundo preço inserido pelo usuário (preco_atual_2
) em relação ao último preço de fechamento disponível até a “nova data” calculada com base em dias_que_faltam
.
Lógica
-
Variação Média (
vm_util_days
): Esta é uma projeção da variação média esperada da ação para o número de dias úteis inseridos. É como se estivesse tentando estender a variação média mensal para um período diferente. -
Volatilidade (
vol_util_days
): Da mesma forma, quer saber quão volátil a ação pode ser durante esse período específico. Isso te dá uma ideia do risco envolvido. -
Retorno Atual (
retorno_atual_do_preco_2
): Este valor é usado para comparar o desempenho atual da ação com o que seria esperado com base na sua variação média e volatilidade. Isso pode te ajudar a decidir se a ação está se saindo melhor ou pior do que o esperado.
Buscar a data final (data mais recente nos dados)
data_final_date = data.index[-1]
Encontrar o primeiro dia do mês da data final
primeiro_dia_mes_atual = data_final_date.replace(day=1)
Retroceder um dia para encontrar o último dia do mês anterior
ultimo_dia_mes_anterior = pd.Timestamp(primeiro_dia_mes_atual - pd.DateOffset(days=1))
Encontrar o valor de fechamento correspondente a essa data (se disponível)
fechamento_mes_anterior = data.loc[data.index <= ultimo_dia_mes_anterior, ‘Adj Close’].iloc[-1]
Adicionar dias que faltam à data de fechamento_mes_anterior, considerando apenas dias úteis
nova_data = ultimo_dia_mes_anterior + BDay(dias_que_faltam)
fechamento_dias_uteis = data.loc[data.index <= nova_data, ‘Adj Close’].iloc[-1]
print(fechamento_dias_uteis) 65.08000183105469
print(fechamento_mes_anterior) 67.13463592529297
print(nova_data) 2023-08-31
print(primeiro_dia_mes_atual) 2023-08-01
print(ultimo_dia_mes_anterior) 2023-07-31
(esse exemplo fiz em vale3, dia 01/09/23)
No código original, Léo utiliza o preço de fechamento do mês anterior como referência para efetuar cálculos financeiros. Esses cálculos são projetados para um período de 33 dias úteis subsequentes.
No entanto, o que fiz na minha versão do código foi otimizar esse processo. Em vez de usar o preço de fechamento do mês anterior, o código agora considera o preço de fechamento do dia imediatamente anterior ao dia em que o cálculo de probabilidade está sendo realizado.
Para utilizar esta versão do código, você simplesmente precisa inserir a quantidade de dias úteis que restam até o vencimento do ativo. Com essa informação, o algoritmo irá calcular a probabilidade de atingir um determinado preço dentro do período especificado.
PROF LeoDutra ajuda aqui rsrs