Я рассчитал веса, матрично изменяющие один параметр tau0, и мне нужно вычислить лучший портфель, изменяющий этот параметр tau0 с минимальным разбросом. У меня есть следующий код:
Исчисление весов
def PesosTauMatrices (tau0,alfa,meanReturns,covMatrix):
#calculando A, B y C
invcov=np.linalg.inv(covMatrix)
vector_e=np.array(np.repeat(1,len(meanReturns),axis=0))
z=st.norm.ppf(alfa)
A=np.dot(np.dot(invcov,vector_e),np.transpose(vector_e))
b1=np.dot(np.dot(invcov,meanReturns),np.transpose(vector_e))
b2=np.dot(np.dot(invcov,vector_e),np.transpose(meanReturns))
B=((2*tau0)+1)*(b1+b2)
c1=np.dot(np.dot(invcov,meanReturns),np.transpose(meanReturns))
C=((((2*tau0)+1)**2)*c1)-(z**2)
#Calculando lambdas como soluciones a la cuadratica
lambda1=(-B+np.sqrt((B**2)-(4*A*C)))/(2*A)
#lambda2=(-B-np.sqrt((B**2)-(4*A*C)))/(2*A)
#Calculando numerador para los pesos
numerador1=(np.dot(invcov,meanReturns))*((2*tau0)+1)
numerador2=lambda1*(np.dot(invcov,vector_e))
numeradort=numerador1+numerador2
#Calculando denominador para los pesos
denominadort=(b1*((2*tau0)+1))+(A*lambda1)
#Calculando pesos
W=numeradort/denominadort
return W
Это целевая функция
def ind_rp_varp(tau0,alfa,meanReturns,covMatrix):
weights=PesosTauMatrices(tau0,alfa,meanReturns, covMatrix)
p_ret, p_vol = calcPortfolioPerf(weights, meanReturns, covMatrix)
z=st.norm.ppf(alfa)
return (p_ret/(p_ret+(p_vol*z)))
Это функция доходности и волатильности портфеля ios
def calcPortfolioPerf(weights, meanReturns, covMatrix):
#Calculate return and variance
portReturn = np.sum( meanReturns*weights )
portStdDev = np.sqrt(np.dot(np.transpose(weights),(np.dot(covMatrix,weights))))
return portReturn, portStdDev
Спасибо за помощь