A volatilidade é um índice numérico que visa indicar o quão variável é a variável de uma série temporal. Na área financeira, é uma medida de dispersão dos retornos de um ativo financeiro ou índice de mercado. Quanto mais o preço de uma ação varia em um dado período de tempo, maior o risco de se ganhar ou perder dinheiro negociando esta ação, e, por isso, a volatilidade é uma medida de risco.

title

O retorno é a relação entre a quantidade de dinheiro ganho (ou perdido) como resultado de um investimento e a quantidade de dinheiro investido. Existem diferentes metodologias desse tipo de cálculo, cada uma com sua finalidade. No caso de avaliar um retorno entre valores consecutivos de um ativo ou índice dentro de um determinado período de tempo, ele é definido em função dos preço entre esses dois instantes conforme a seguinte fórmula:

$r_t=log\left ( \frac{p_t}{p_{t-1}} \right )$

O estimador mais simples da volatilidade é o desvio padrão histórico. Para esse histórico, deve-se escolher um período menor de dados, geralmente formado por valores intra-diários, e um período maior, costumeiramente de um ano. Por exemplo, é comum usar dados a cada minuto (período menor) para obter a volatilidade anual (252 dias comerciais).

Uma das formas mais simples de cálculo da volatilidade é definida como o desvio padrão dos retornos ($\sigma_{r_t}$) do período menor multiplicado pela raiz do número de unidades do período maior ($n_{r_t}$):

$V = \sigma_{r_t} \cdot \sqrt{n_{r_t}}$

Neste exemplo, serão usados dados com frequência de 5 minutos para determinar a volatilidade de uma série temporal de 1 dia. Os dados são valores de irradiância coletados pela rede SONDA/INPE e disponíveis no Github (viniroger/fractal). O número de unidades do período maior será definido como o número de amostras.

Importar dados do Github

In [1]:
import pandas as pd
import numpy as np

df = pd.read_csv('https://raw.githubusercontent.com/viniroger/fractal/master/input.csv')
print(df)
               Timestamp  glo_avg
0    2012-01-01 09:00:00    5.217
1    2012-01-01 09:01:00    5.574
2    2012-01-01 09:02:00    6.338
3    2012-01-01 09:03:00    6.984
4    2012-01-01 09:04:00    8.260
..                   ...      ...
716  2012-01-01 20:56:00   33.210
717  2012-01-01 20:57:00   33.860
718  2012-01-01 20:58:00   34.970
719  2012-01-01 20:59:00   36.280
720  2012-01-01 21:00:00   39.130

[721 rows x 2 columns]

Método para cálculo da volatilidade

In [2]:
def volatility(df, var_name):
    '''
    Volatility calculus
    '''
    n = df.shape[0]
    df['rt'] = df[var_name].shift(-1)/df[var_name]
    df['rt'] = df['rt'].fillna(0)
    sd = np.std(df['rt'].values)
    vol = round(sd * np.sqrt(n),1)
    return vol

Cálculo da volatilidade

In [5]:
vol = volatility(df, 'glo_avg')
print('Volatilidade = {}%'.format(vol))
Volatilidade = 6.0%
In [ ]: