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.