2017-06-22 8 views
0

Essayer d'optimiser ici une allocation de portefeuille qui maximise ma fonction de retour en limitant le risque en utilisant le module cvxopt. Mes codes sont les suivants:optimisation du portefeuille: comment maximiser le rendement tout en étant soumis au risque cible en utilisant cvxopt.solver.qp?

from cvxopt import matrix, solvers, spmatrix, sparse 
from cvxopt.blas import dot 
import numpy 
import pandas as pd 
import numpy as np 
from datetime import datetime 

solvers.options['show_progress'] = False 
# solves the QP, where x is the allocation of the portfolio: 
# minimize x'Px + q'x 
# subject to Gx <= h 
#   Ax == b 
# 
# Input: n  - # of assets 
#   avg_ret - nx1 matrix of average returns 
#   covs - nxn matrix of return covariance 
#   r_min - the minimum expected return that you'd 
#     like to achieve 
# Output: sol - cvxopt solution object 

dates = pd.date_range('2000-01-01', periods=6) 
industry = ['industry', 'industry', 'utility', 'utility', 'consumer'] 
symbols = ['A', 'B', 'C', 'D', 'E'] 
zipped = list(zip(industry, symbols)) 
index = pd.MultiIndex.from_tuples(zipped) 

noa = len(symbols) 

data = np.array([[10, 11, 12, 13, 14, 10], 
       [10, 11, 10, 13, 14, 9], 
       [10, 10, 12, 13, 9, 11], 
       [10, 11, 12, 13, 14, 8], 
       [10, 9, 12, 13, 14, 9]]) 

market_to_market_price = pd.DataFrame(data.T, index=dates, columns=index) 
rets = market_to_market_price/market_to_market_price.shift(1) - 1.0 
rets = rets.dropna(axis=0, how='all') 

# covariance of asset returns 
P = matrix(rets.cov().values) 


n = len(symbols) 
q = matrix(np.zeros((n, 1)), tc='d') 
G = matrix(-np.eye(n), tc='d') 
h = matrix(-np.zeros((n, 1)), tc='d') 
A = matrix(1.0, (1, n)) 
b = matrix(1.0) 
sol = solvers.qp(P, q, G, h, A, b) 

Dois-je utiliser la simulation Monte Carlo pour obtenir le risque cible tout en maximisant le retour? Quelle est la meilleure méthode pour résoudre ce problème? Je vous remercie.

Répondre

0

Je pense que vous essayez de calculer le portefeuille Sharpe. Je crois qu'il peut être montré que c'est un problème équivalent à minimiser le risque (w 'P w) avec une contrainte d'égalité sur le retour (w' * rets = 1). Ce sera plus facile à spécifier sous le programmeur quadratique qp.

+0

Je pense que le portefeuille de sharpe est l'un des portefeuilles que j'essaie de trouver. Mais si je veux utiliser mon risque de tolérance pour maximiser mon retour, comment puis-je connaître le poids? –

1

Ce n'est pas aussi simple qu'on pourrait le penser. Le problème typique d'optimisation de portefeuille est de minimiser le risque sous réserve d'un retour cible qui est un problème linéairement contraint avec un objectif quadratique ; c'est-à-dire, un programme quadratique (QP).

minimize  x^T.P.x 
subject to  sum(x_i) = 1 
       avg_ret^T.x >= r_min 
       x >= 0 (long-only) 

Qu'est-ce que vous voulez ici, pour maximiser le rendement soumis à un risque cible, est un programme quadratique quadraticaly contraint (QCQP), ressemblant à:

maximize  avg_ret^T.x 
subject to  sum(x_i) = 1 
       x^T.P.x <= risk_max 
       x >= 0 (long-only) 

Avec une contrainte quadratique convexe, optimisation se produit sur un cône plus complexe contenant un facteur de cône de second ordre. Si vous voulez continuer avec cvxopt, vous devez convertir le QCQP en un programme de cônes de second ordre (SOCP), car cvxopt n'a pas de solveur explicite pour les QCQPs. SOCP avec cvxopt a une syntaxe de matrice différente de la QP typique comme vous pouvez le voir sur le documentation. Cette blog post a un très bon déroulement sur la façon de le faire pour ce problème spécifique.