Markowitz em Python
Harry Markowitz mudou o mundo dos investimentos em 1952 quando publicou o seminal Portfolio Selection no The Journal of Finance. Markowitz trouxe uma metodologia para definir um portfólio de investimento. Ele mostrou que com base na diversificação do portfólio é possível diminuir o risco do investimento, isto é, o risco de uma carteira de investimento é menor do que o menos arriscado dos ativos que a compõe. Este trabalho inaugurou uma trilha de publicações envolvendo o risco de portfólio e o aprimoramento da relação risco x retorno.
A seguir são exibidas as fórmulas de risco e retorno definidas por Markowitz.
Retorno
O retorno esperado do portfólio é dado como a média dos retornos passados dos ativos, ponderada pela respectiva participação de cada ativo na composição do portfólio. Considerando-se um portfólio com N ativos, o retorno esperado é representado por:
em que,
Risco
O risco esperado do portfólio é dado pela variância que é obtida através da covariância entre os ativos no período considerado.
Sendo,
Restrições
As restrições assumidas neste problema são somente o autofinanciamento (não há entrada nem retirada de dinheiro do investimento) e o limite de investimento por ativo.
Em essência o modelo de Markowitz se resume a estas medida de retorno, medida de risco e restrições. O problema de otimização (que origina a fronteira de Pareto) pode ser definido de várias formas. Eu escolhi apresentar aqui a formulação mono-objetivo ponderada:
Para cada valor de lambda é obtida uma única solução ótima. A imagem de cada solução ótima pelas funções objetivo gera um único ponto não dominado na fronteira de Pareto. Para construir a fronteira de Pareto é necessário resolver o problema de otimização atribuindo vários valores para lambda.
Note que se lambda = 0, o problema se resume em maximizar o retorno e se lambda = 1, o problema se resume em minimizar o risco.
Veja agora como fica a implementação deste problema em Python:
Serão considerados:
- Um universo de dez ativos.
- Um conjunto de dados com o preço de fechamento dos 60 dias anteriores.
- Uma fronteira com 400 pontos uniformemente distribuídos.
Lembre-se que em geral, trabalha-se apenas com a restrição ≤, por isso, é necessário fazer uma “adaptação” na maneira de escrever as restrições definidas por ≥.
É necessário a escolha de um método para realizar a otimização. Foi escolhido o método SLSQP que utiliza programação quadrática sequencial, que está de acordo com as funções e restrições definidas para este problema.
Referência
MARKOWITZ, H. M. Portfolio Selection/Harry Markowitz. The Journal of Finance, v. 7, 1952.
O script desse código em .ipynb (Python) e a base de dados utilizada neste exemplo estão disponibilizados neste link
Espero que este material tenha ajudado de alguma maneira.
Vamos nos conectar também pelo Instagram @maisakmelo.