Código em python que calcula a probabilidade do preço usando zscore. Aula #117 acervo das opções

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

  1. from pandas.tseries.offsets import BDay: Importa BDay para considerar apenas dias úteis.
  2. from scipy.stats import norm: Importa a função norm para cálculos estatísticos.
  3. import numpy as np: Importa a biblioteca numpy para operações matemáticas.
  4. import pandas as pd: Importa a biblioteca pandas para manipulação de dados.

Entrada de Dados e Preparação

  1. util_days = float(input('Quantos dias uteis faltam para o vencimento? ')): Solicita o número de dias úteis restantes até o vencimento.
  2. 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

  1. vmm = ((1 + retorno/100) ** (1/60) - 1) * 100: Calcula a Variação Média Mensal (VMM) com base no retorno fornecido.
  2. vm_33_days = ((1 + vmm/100) ** (33/20) - 1) * 100: Calcula a variação média para o período de 33 dias.
  3. vol_33 = (vol252 * np.sqrt(33)): Calcula a volatilidade para o período de 33 dias.
  4. vol252 = (ewma_volatility_annual / np.sqrt(252)): Calcula a volatilidade anualizada com base na volatilidade EWMA.
  5. 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.
  6. vol_util_days = (vol252 * np.sqrt(util_days)): Calcula a volatilidade para o período de dias úteis fornecidos.

Preços e Datas

  1. preco_atual = data['Adj Close'].iloc[-1]: Obtém o preço mais recente da ação.
  2. 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

  1. Retorno_médio_esperado = fechamento_mes_anterior * (1 + 33/100): Calcula o preço esperado no período.
  2. retorno_atual_do_preco = ((preco_atual / fechamento_mes_anterior) - 1) * 100: Calcula o retorno atual do preço.
  3. 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

  1. z_score33 = (retorno_atual_do_preco - vm_33_days) / vol_33: Calcula o z-score para o período de 33 dias.
  2. probability = norm.cdf(z_score33): Calcula a probabilidade associada ao z-score calculado.
  3. z_score2 = (retorno_atual_do_preco_2 - vm_util_days) / vol_util_days: Calcula o z-score para o período de dias úteis.
  4. 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

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

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

  3. 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 em dias_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

  1. 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.
  2. 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.
  3. 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

4 curtidas

Muito bom @Allissondavid ! Muito obrigado pela contribuição.

Acredito que não fará muita diferença usar o fechamento do dia imediatamente anterior.

Parabéns!

1 curtida