Aprenda a calcular o valor do seu portfólio em risco

Guia passo a passo para gestão de risco do seu portfólio com VaR histórico e escassez esperado

Costas Andreou Segue 17 de jul · 8 min ler

Neste artigo, vamos aprender sobre o gerenciamento de riscos e como podemos aplicá-lo em nossas carteiras de ações. Vamos fazer isso aprendendo sobre duas métricas de gerenciamento de risco, Value at Risk (VaR) e Expected Shortfall (ES), além de seguir um guia passo a passo sobre como você pode criar um modelo para calcular essas métricas especificamente para seu portfólio. .

Foto por Nathan Dumlao em Unsplash

O que é o VaR?

A melhor maneira de explicar o VaR é colocar a questão que ajuda a responder:

Qual é a perda máxima que posso esperar que minha carteira tenha com um horizonte de tempo X e uma certeza de Y%?

Em outras palavras, um VaR de 1 dia e 99% de $ 100 significa que a perda máxima de 1 dia do meu portfólio para 99% das vezes seria inferior a $ 100.

Podemos essencialmente calcular o VaR da distribuição de probabilidade das perdas da carteira.

Representação visual do portfólio retorna a distribuição de probabilidade

Como você calcula o VaR?

Existem várias metodologias diferentes que podem ser usadas para calcular o VaR. Os 3 mais comuns são:

  • Simulação Histórica
  • Monte Carlo
  • Covariância de Variância

Neste blog, cobriremos apenas a simulação histórica.

O que é a Simulação Histórica do VaR?

O Método de Simulação Histórica envolve o cálculo das variações diárias do portfólio em valor para determinar a distribuição de probabilidade dos retornos. Ele faz isso observando como seu portfólio teria se comportado historicamente.

Depois de obter os retornos ou perdas de seu portfólio, é possível calcular, dentro de um intervalo de confiança, o pior resultado possível.

Quais são as mecânicas de calcular o VaR usando a simulação histórica?

  1. Usando dados históricos, determine o valor de seu portfólio por vários dias (geralmente em torno de 500)
  2. Calcular a% de variação entre cada dia
  3. Usando sua avaliação de portfólio atual, calcule o impacto monetário da alteração percentual
  4. Classifique seus resultados da maior perda para a maioria dos lucros
  5. Dependendo do seu intervalo de confiança, o enésimo valor que corresponde a essa porcentagem – esse é o seu VaR de 1 dia.
  6. Multiplicá-lo pela raiz quadrada do número de dias que você quer que seu horizonte de tempo seja ie 5day VaR = 1day VaR * sqr (5) (Isto é porque os retornos são assumidos como independentes e identicamente distribuídos (normal com média 0)) (Nota: vou mostrar-lhe como podemos verificar isso no final da nossa implementação)

Quais são as limitações do VaR?

Como com qualquer métrica, existem vantagens e desvantagens. O VaR é tão amplamente usado porque é muito fácil de entender. No entanto, ele vem com algumas desvantagens:

  • VaR assume rabos finos ou seja, o risco de cauda não é suficientemente capturado
  • O VaR não considera os eventos do cisne negro, isto é, coisas que acontecem raramente e inesperadamente (a menos que você esteja dentro do seu set up)
  • O VaR histórico é lento para capturar condições de mercado variáveis, uma vez que assume que o desempenho passado representa o desempenho futuro

O que é o esperado déficit (ES)?

Expected Shortfall, é uma métrica de risco que tenta resolver uma das desvantagens do VaR. O VaR assume que o risco no final da distribuição é muito improvável com uma cauda fina. No entanto, não surpreendentemente, no mundo real, temos visto distribuições onde a cauda é bastante gorda:

Para resolver isso, ES, leva a média da cauda.

Calculando o VaR histórico e ES para o nosso portfólio em Python

Primeiro, precisamos definir nossas participações no portfólio.

 importar pandas como dados pd = {'Stocks': ['GOOGL', 'TSLA', 'AAPL'], 'Quantidade': [100, 50, 300]} #Definir suas participações # Criar um DataFrame de acervos 
df = pd.DataFrame (data)

Agora que temos nossas participações definidas, precisamos fornecer preços históricos para cada uma de nossas ações, o que nos permitirá avaliar nosso portfólio (se você precisar ver diferentes opções e fontes para obter dados históricos, confira meu blog anterior ). Neste exemplo, estou usando a API do Tiingo, que resultará em um dataframe do pandas:

 de tiingo import TiingoClient def SourceHistoricPrices (): 
if info == 1: print ('[INFO] Buscando cotações de ações de portfólio')
#Set Up for Tiingo
config = {}
config ['session'] = Verdadeiro
config ['api_key'] = 'chave privada'
client = TiingoClient (config)
#Crie uma lista de marcadores para a chamada da API
Tickers = []
i = 0
para ticker nos dados:
enquanto eu <= len (data):
Tickers.append (data [ticker] [i])
i = i + 1
if info == 1: print ('[INFO] Portfólio de Participações determinado como', Tickers)
if info == 1: print ('[INFO] Pesos do portfólio determinados como', data ['Quantity'])
#Chame a API e armazene os dados
global HistData
HistData = client.get_dataframe (Tickers, metric_name = 'fechar', startDate = dateforNoOfScenarios (hoje), endDate = today)
if info == 1: print ('[INFO] Buscando os preços das ações concluídas.', len (HistData), 'days.')
return (HistData)

Uma coisa a notar aqui é que precisamos definir as datas de início e término pelas quais precisamos de dados históricos que orientarão o número de simulações históricas. Esta deve ser uma entrada definida pelo usuário. Um pequeno problema com isso, no entanto, é que o mercado de ações não está aberto todos os dias. Por isso, precisamos calcular os dias úteis envolvidos. Sem incluir um calendário de férias é muito difícil de ser preciso, mas para os nossos propósitos, uma aproximação rápida deve ser suficiente.

 ScenariosNo = 500 #Define o número de cenários que você deseja executar hoje = datetime.date.today () - datetime.timedelta (days = 1) def is_business_day (date): 
return bool (len (pd.bdate_range (data, data)))
def dataforNoOfScenarios (data):
i = 0
w = 0
enquanto eu <ScenariosNo:
if (is_business_day (hoje - datetime.timedelta (days = w)) == Verdadeiro):
i = i + 1
w = w + 1
outro:
w = w + 1
continuar
#print ('tenho que voltar muitos dias úteis', i)
#print ('tenho que voltar esses muitos dias', w)
#Lembre-se de adicionar um dia extra, pois a diferença percentual deixará o primeiro valor em branco (dias +1 = números do cenário)
return (hoje - datetime.timedelta (days = w * 1.04 + 1)) # 4% é um número arbitrário que calculei para os feriados em 500 dias.

Em seguida, precisamos avaliar nosso portfólio.

 def ValuePortfolio (): 
HistData ['PortValue'] = 0
i = 0
if info == 1: print ('[INFO] Calculando o valor do portfólio para cada dia')
enquanto eu <= len (data):
stock = data ['Ações'] [i]
quantidade = dados ['quantidade'] [i]
HistData ['PortValue'] = HistData [estoque] * quantidade + HistData ['PortValue']
i = i + 1

o que resulta em:

Então, agora, podemos ir em frente e calcular a variação percentual:

 def CalculateVaR (): 
if info == 1: print ('[INFO] Calculando as alterações diárias em%')
HistData ['Perc_Change'] = HistData ['PortValue']. Pct_change () #calcular a porcentagem de alteração

Então, a mudança de avaliação do portfólio:

 HistData ['DollarChange'] = HistData.loc [HistData.index.max ()] ['PortValue'] * HistData ['Perc_Change'] #calcular a variação monetária com base na avaliação atual 
if info == 1: print ('[INFO] Escolhendo', redondo (HistData.loc [HistData.index.max ()] ['PortValue'], 2), 'valor de', HistData.index.max () .strftime ('% Y-% m-% d'), 'como última avaliação para basear os retornos monetários')

Em seguida, determine o enésimo valor que precisamos escolher para o nosso intervalo de confiança:

 ValueLocForPercentile = round (len (HistData) * (1 - (percentil / 100))) 
if info == 1: print ('[INFO] Selecionando o', ValueLocForPercentile, 'o maior valor')

Classifique os dados e escolha o valor:

 global SortedHistData 
SortedHistData = HistData.sort_values (por = ['DollarChange'])
if info == 1: print ('[INFO] Classificando os resultados por maior perda máxima')

Finalmente, também podemos usar um histograma para ver como nossos retornos de portfólio se encaixam com a suposição que fizemos no ponto 6 acima:

A razão pela qual podemos estender 1 dia VaR ou ES pela multiplicação pela Raiz Quadrada de dias, é porque os retornos são assumidos como sendo independentemente e identicamente distribuídos (normal com média 0)

 import scipy 
import scipy.stats, matplotlib.pyplot como plt
def plotme ():
data1 = HistData ['Perc_Change']
num_bins = 50
# o histograma dos dados
n, caixas, manchas = plt.hist (data1, num_bins, normados = 1, facecolor = 'verde', alfa = 0,5)
# adicione uma linha 'melhor ajuste'
sigma = HistData ['Perc_Change']. std ()
data2 = scipy.stats.norm.pdf (escaninhos, 0, sigma)
plt.plot (bins, data2, 'r--')
plt.xlabel ('Percentage Change')
plt.ylabel ('Probabilidade / Frequência')
# Tweak espaçamento para evitar clipping de ylabel
plt.subplots_adjust (esquerda = 0,15)
plt.show ()
plotme ()

Retornando:

Portanto, validando nossa suposição.