Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

O que é a formulação de Kataoka da otimização de carteiras "Safety First°?

0 votos
19 visitas
perguntada Dez 10, 2019 em Estatística por Athos Carvalho (11 pontos)  

Considere a classe de problemas de otimização de carteira conhecida como Safety First. Tomando por base a formulação proposta por Kataoka, formule explicitamente o problema, justifique a formulação e resolva o numericamente o problema.

Compartilhe

1 Resposta

0 votos
respondida Dez 10, 2019 por Athos Carvalho (11 pontos)  

O critério de Kataoka, para a classe de problemas de otimização de carteiras conhecida como safety first consiste em escolher um nível de risco aceitável e, dado esse nível de risco, escolher a carteira que possui maior retorno.

Essa formulação foi apresentada pela primeira vez em 1963, por Shinji Kataoka, em seu artigo A Stochastic Programming Model.

Para apresentar a resolução numérica do problema, utilizaremos uma matriz de covariância dada e maximizaremos uma carteira com 3 possíveis ativos, com retornos gerados pela distribuição normal multidimensional.

O código para resolver o problema é o seguinte:

import numpy as np

medias = np.array([1, 2, 3])

covariancias = np.array([
    [1, 0.5, 0.2],
    [0.5, 1.5, 0.7],
    [0.2, 0.7, 7]
])

ativos = np.zeros(shape=(50,3))

it = 0
niter = 50

while it < niter:

    teste = np.random.multivariate_normal(medias, covariancias,(1))
    ativos[it] = teste

    it += 1

media = np.mean(ativos, axis = 0)
sigma = np.std(ativos, axis = 0)

sigmaka = 1.25000

def port(pesos, ret, covs):

    rc = pesos.dot(ret)
    var_c = pesos.dot(covs)
    std_c = np.sqrt(var_c)
    res = np.vstack((rc,var_c,std_c))
    result = np.transpose(res)

    return (result)

pesos = np.array([[0, 0, 0]])
for i in range(101):
    for j in range(101):
        if 100 >= i + j:
            pesos = np.append(pesos, [[i, j, 100 - (i + j)]], axis=0)
pesos = pesos[1:]
pesos = pesos[1:] * .01

carteiras = port(pesos, media, sigma)
cartk = np.zeros(shape=(1,2))

for i in range(82):
    if carteiras[i,2] < sigmaka:
        if carteiras[i,1] > cartk[0,1]:
            cartk = carteiras[i,:]
            index = i

print(carteiras[index,:]) 
print(pesos[index,:])

Referências:

Kataoka, Shinji. "A Stochastic Programming Model." Econometrica 31, no. 1/2 (1963): 181-96. doi:10.2307/1910956.

...