Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
2846 views
Kernel: Python 3 (system-wide)
from math import sqrt import numpy as np from cvxopt import matrix from cvxopt.blas import nrm2, dot from cvxopt.solvers import qp, socp, options import matplotlib.pyplot as plt %matplotlib inline

Covariance matrix Σ\Sigma and its Cholesky decomposition UU

Σ=UTU\Sigma = U^T U

names = ['Ant', 'Bee', 'Croc', 'Dino'] n = len(names) Cov = 0.1 * matrix( [[ 0.1138, -0.0137, 0.0218, -0.0102], [-0.0137, 0.0274, -0.0028, 0.0040], [ 0.0218, -0.0028, 0.0213, -0.0016], [-0.0102, 0.0040, -0.0016, 0.0143]]) rootCov = np.linalg.cholesky(Cov).T print("Cholesky factorization:") print(rootCov) print("\nCheck:") print(rootCov.T @ rootCov) rootCov = matrix(rootCov)
Cholesky factorization: [[ 0.10667708 -0.0128425 0.0204355 -0.00956157] [ 0. 0.05074515 -0.00034599 0.0054627 ] [ 0. 0. 0.04137959 0.00090106] [ 0. 0. 0. 0.03616522]] Check: [[ 0.01138 -0.00137 0.00218 -0.00102] [-0.00137 0.00274 -0.00028 0.0004 ] [ 0.00218 -0.00028 0.00213 -0.00016] [-0.00102 0.0004 -0.00016 0.00143]]

Sample portfolio

alphas = matrix([0.01, 0.02, 0.03, 0.04]) MM = 1000000 portf0 = MM * matrix([0.1, 0.2, 0.3, 0.4])

Portfolio variance and risk

portf0variance = (portf0.T * Cov * portf0)[0,0] portf0risk = sqrt(portf0variance) print(portf0risk)
25105.776227792678

Checking that portfoli risk equals Gw2\|G w\|_2

nrm2(rootCov * portf0)
25105.77622779268

Portfolio expected return

portf0return = (alphas.T * portf0)[0, 0] print(portf0return)
30000.0

Problem 1

Maximize the expected return for a given level of risk

netInvested = MM maximalRisk = 25000

Conic formulation: cTx mins0=h0G0xs00s1=h1G1xs1CAx=b \begin{aligned} c^{T} x &\to\ \mbox{min}\\ s_0 &= h_0 - G_0 x \\ s_0 &\succeq 0 \\ s_1 & = h_1 - G_1 x \\ s_1 &\in \mathcal{C} \\ A x &= b \end{aligned}

x=(rw1wn) x = \begin{pmatrix} r\\ w_1 \\ \vdots \\ w_n \end{pmatrix}

Optimization constraint

coeffUtil1 = matrix([0.0, -1*alphas]) print(coeffUtil1)
[ 0.00e+00] [-1.00e-02] [-2.00e-02] [-3.00e-02] [-4.00e-02]

Constraint 0 (Linear)

Risk positive, investments positive

e5 = matrix(0.0, (5,5)) e5[::6] = 1.0 G0 = matrix([[1.0], [matrix(0.0, (1,4))]]) G0 = matrix([G0, -1.0*e5]) h0 = matrix([[maximalRisk, matrix(0.0, (5,1))]]) print(G0) print(h0)
[ 1.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00] [-1.00e+00 -0.00e+00 -0.00e+00 -0.00e+00 -0.00e+00] [-0.00e+00 -1.00e+00 -0.00e+00 -0.00e+00 -0.00e+00] [-0.00e+00 -0.00e+00 -1.00e+00 -0.00e+00 -0.00e+00] [-0.00e+00 -0.00e+00 -0.00e+00 -1.00e+00 -0.00e+00] [-0.00e+00 -0.00e+00 -0.00e+00 -0.00e+00 -1.00e+00] [ 2.50e+04] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00]

Constraint 1 (Conic)

s1=(rGx)\displaystyle s1 = {r \choose G x}

z4 = matrix(0.0, (1,4)) G1 = matrix([[-1, z4.T],[z4, -1.0*rootCov]]) h1 = matrix(0.0, (5,1)) print(G1) print(h1)
[-1.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00] [ 0.00e+00 -1.07e-01 1.28e-02 -2.04e-02 9.56e-03] [ 0.00e+00 -0.00e+00 -5.07e-02 3.46e-04 -5.46e-03] [ 0.00e+00 -0.00e+00 -0.00e+00 -4.14e-02 -9.01e-04] [ 0.00e+00 -0.00e+00 -0.00e+00 -0.00e+00 -3.62e-02] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00]

Linear constraint

Fully invested portfolio: (0,eT)x=1000000\left( 0, e^T \right) x = 1000000

A = matrix([[0.0], [matrix(1.0, (1,4))]]) b = matrix(float(netInvested), (1,1)) print(A) print(b)
[ 0.00e+00 1.00e+00 1.00e+00 1.00e+00 1.00e+00] [ 1.00e+06]
solution1 = socp(coeffUtil1, G0, h0, [G1], [h1], A, b)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-7-410f236c583c> in <module> ----> 1 solution1 = socp(coeffUtil1, G0, h0, [G1], [h1], A, b) NameError: name 'coeffUtil1' is not defined
solution1
{'dual infeasibility': 3.641286043848554e-08, 'dual objective': -32811.16397701068, 'dual slack': 3.2328030328101123e-09, 'gap': 0.016443068425783254, 'iterations': 8, 'primal infeasibility': 4.127299279913593e-08, 'primal objective': -32811.16597285626, 'primal slack': 7.362141785396568e-05, 'relative gap': 5.011424598377923e-07, 'residual as dual infeasibility certificate': None, 'residual as primal infeasibility certificate': None, 'sl': <6x1 matrix, tc='d'>, 'sq': [<5x1 matrix, tc='d'>], 'status': 'optimal', 'x': <5x1 matrix, tc='d'>, 'y': <1x1 matrix, tc='d'>, 'zl': <6x1 matrix, tc='d'>, 'zq': [<5x1 matrix, tc='d'>]}
portf1 = solution1['x'][1:5] print(sum(portf1))
1000000.0000000002
portf1variance = (portf1.T * Cov * portf1)[0,0] portf1risk = sqrt(portf1variance) print(portf1risk) portf1return = (alphas.T * portf1)[0, 0] print(portf1return)
24999.999717163682 32811.165972856266
ind = np.arange(n) # the horizontal locations for the groups width = 0.35 # the width of the bars: can also be len(x) sequence plt.figure(figsize=(10,6)) p0 = plt.bar(ind, [x for x in portf0], width, color='y') p1 = plt.bar(ind+width, [x for x in portf1], width, color='r') plt.ylabel('Invested notional') plt.xticks(ind + width, names) plt.legend((p0[0], p1[0]), ('Initial', 'Max Expected Return'), loc=2) plt.show()
Image in a Jupyter notebook

Problem 2

Minimize the risk for the expected level of return

coeffUtil2 = matrix([1.0, z4.T]) print(coeffUtil2)
[ 1.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00]
minReturn = 30000 G0 = matrix([[0.0], [-1*alphas.T]]) G0 = matrix([G0, -1.0*e5]) print(G0) h0 = matrix([[-minReturn, matrix(0.0, (5,1))]]) print(h0)
[ 0.00e+00 -1.00e-02 -2.00e-02 -3.00e-02 -4.00e-02] [-1.00e+00 -0.00e+00 -0.00e+00 -0.00e+00 -0.00e+00] [-0.00e+00 -1.00e+00 -0.00e+00 -0.00e+00 -0.00e+00] [-0.00e+00 -0.00e+00 -1.00e+00 -0.00e+00 -0.00e+00] [-0.00e+00 -0.00e+00 -0.00e+00 -1.00e+00 -0.00e+00] [-0.00e+00 -0.00e+00 -0.00e+00 -0.00e+00 -1.00e+00] [-3.00e+04] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00]
solution2 = socp(coeffUtil2, G0, h0, [G1], [h1], A, b)
pcost dcost gap pres dres k/t 0: 0.0000e+00 3.0000e+04 1e+06 3e+00 3e+00 1e+00 1: 3.0629e+04 5.4084e+04 4e+05 1e+00 1e+00 1e+04 2: 2.8103e+04 3.5444e+04 9e+04 2e-01 2e-01 5e+03 3: 2.5590e+04 2.6394e+04 1e+04 3e-02 3e-02 5e+02 4: 2.4565e+04 2.4700e+04 1e+03 4e-03 4e-03 1e+02 5: 2.4585e+04 2.4608e+04 2e+02 5e-04 5e-04 2e+01 6: 2.4573e+04 2.4574e+04 6e+00 2e-05 2e-05 7e-01 7: 2.4573e+04 2.4573e+04 2e-01 7e-07 7e-07 3e-02 8: 2.4573e+04 2.4573e+04 7e-03 2e-08 2e-08 8e-04 Optimal solution found.
print(solution2['sl'])
[ 9.12e+02] [ 2.46e+04] [ 6.53e+04] [ 2.17e+05] [ 2.78e+05] [ 4.39e+05]
portf2 = solution2['x'][1:5] portf2variance = (portf2.T * Cov * portf2)[0,0] portf2risk = sqrt(portf2variance) print(portf2risk) portf2return = (alphas.T * portf2)[0, 0] print(portf2return)
24572.69096086509 30911.834843412114
ind = np.arange(n) # the horizontal locations for the groups width = 0.25 # the width of the bars: can also be len(x) sequence plt.figure(figsize=(10,6)) p0 = plt.bar(ind, [x for x in portf0], width, color='y') p1 = plt.bar(ind+width, [x for x in portf1], width, color='r') p2 = plt.bar(ind+width*2., [x for x in portf2], width, color='b') plt.ylabel('Invested notional') plt.xticks(ind + width*1.5, names) plt.legend((p0[0], p1[0], p2[0]), ('Initial', 'Max Expected Return', 'Min Risk'), loc=2) plt.show()
Image in a Jupyter notebook

Problem 3

Markowitz mean-variance optimization. The utility function is a weighted sum of expected return and risk: c=(λ,αT)c = (\lambda, -\alpha^T), where λ\lambda is a risk-aversion parameter

def meanVariance(riskAversion, netInvested, printSystem=False): # utility function coeffUtil = matrix([riskAversion, -1.0*alphas]) # investment limit plus positivity constraints G0 = matrix([matrix([[0.0],[matrix(1.0, (1,4))]]), -1.0*matrix(np.eye(5))]) h0 = matrix([[netInvested, matrix(0.0, (5,1))]]) # conic constraint z4 = matrix(0.0, (1,4)) G1 = matrix([[-1, z4.T],[z4, -1.0*rootCov]]) h1 = matrix(0.0, (5,1)) # linear constraint = full investment A = matrix([[0.0], [matrix(1.0, (1,4))]]) b = matrix(float(netInvested), (1,1)) if printSystem: print("----------------") print(f"h0:\n{h0}") print(f"G0:\n{G0}") print(f"h1:\n{h1}") print(f"G1:\n{G1}") print("----------------") # call the optimizer solution = socp(coeffUtil, G0, h0, [G1], [h1], A, b) return solution['x'][1:5]
pi = meanVariance(1.0, MM, True)
---------------- h0: [ 1.00e+06] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] G0: [ 0.00e+00 1.00e+00 1.00e+00 1.00e+00 1.00e+00] [-1.00e+00 -0.00e+00 -0.00e+00 -0.00e+00 -0.00e+00] [-0.00e+00 -1.00e+00 -0.00e+00 -0.00e+00 -0.00e+00] [-0.00e+00 -0.00e+00 -1.00e+00 -0.00e+00 -0.00e+00] [-0.00e+00 -0.00e+00 -0.00e+00 -1.00e+00 -0.00e+00] [-0.00e+00 -0.00e+00 -0.00e+00 -0.00e+00 -1.00e+00] h1: [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] [ 0.00e+00] G1: [-1.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00] [ 0.00e+00 -1.07e-01 1.28e-02 -2.04e-02 9.56e-03] [ 0.00e+00 -0.00e+00 -5.07e-02 3.46e-04 -5.46e-03] [ 0.00e+00 -0.00e+00 -0.00e+00 -4.14e-02 -9.01e-04] [ 0.00e+00 -0.00e+00 -0.00e+00 -0.00e+00 -3.62e-02] ---------------- pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: 8.5157e+03 -2.4427e+05 3e+05 2e-02 5e-01 1e+04 2: 1.6966e+03 -5.6352e+04 7e+04 5e-03 1e-01 4e+03 3: -8.7656e+03 -5.3212e+04 5e+04 4e-03 1e-01 4e+03 4: -1.5926e+01 -4.3320e+04 5e+04 4e-03 1e-01 5e+03 5: -4.9642e+03 -2.4675e+04 2e+04 2e-03 4e-02 3e+03 6: -7.5962e+03 -1.2579e+04 6e+03 5e-04 1e-02 8e+02 7: -8.2156e+03 -9.1968e+03 1e+03 1e-04 2e-03 2e+02 8: -8.5148e+03 -8.8761e+03 4e+02 4e-05 8e-04 6e+01 9: -8.4979e+03 -8.5871e+03 1e+02 9e-06 2e-04 2e+01 10: -8.5284e+03 -8.5432e+03 2e+01 1e-06 3e-05 3e+00 11: -8.5282e+03 -8.5293e+03 1e+00 1e-07 3e-06 2e-01 12: -8.5283e+03 -8.5283e+03 6e-02 5e-09 1e-07 9e-03 13: -8.5283e+03 -8.5283e+03 3e-03 2e-10 5e-09 4e-04 Optimal solution found.
print(dot(alphas,pi)) print(sqrt(dot(pi, Cov*pi)))
35504.13099203421 26975.832424259435
# Compute trade-off. N = 20 raps = [ 10**(2.0*t/(N-1)-1.0) for t in range(N) ] portfolios = [ meanVariance(lam, MM) for lam in raps ] returns = [ dot(alphas,pi) for pi in portfolios ] risks = [ sqrt(dot(pi, Cov*pi)) for pi in portfolios ]
pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: -2.2347e+04 -2.2669e+05 2e+05 2e-02 4e-01 2e+03 2: -2.3273e+04 -4.0116e+04 2e+04 1e-03 3e-02 3e+02 3: -3.1791e+04 -4.0207e+04 1e+04 8e-04 2e-02 5e+02 4: -3.5459e+04 -3.6887e+04 2e+03 1e-04 3e-03 1e+02 5: -3.5717e+04 -3.6578e+04 1e+03 8e-05 2e-03 8e+01 6: -3.6106e+04 -3.6328e+04 3e+02 2e-05 5e-04 2e+01 7: -3.6163e+04 -3.6260e+04 1e+02 9e-06 2e-04 1e+01 8: -3.6205e+04 -3.6231e+04 3e+01 3e-06 6e-05 3e+00 9: -3.6216e+04 -3.6220e+04 5e+00 4e-07 1e-05 6e-01 10: -3.6218e+04 -3.6219e+04 1e+00 9e-08 2e-06 1e-01 11: -3.6218e+04 -3.6218e+04 9e-02 8e-09 2e-07 1e-02 12: -3.6218e+04 -3.6218e+04 1e-02 1e-09 2e-08 2e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: -2.1573e+04 -2.2188e+05 2e+05 2e-02 4e-01 2e+03 2: -2.2194e+04 -4.1893e+04 2e+04 2e-03 4e-02 8e+02 3: -2.9585e+04 -4.0878e+04 1e+04 1e-03 2e-02 7e+02 4: -2.9189e+04 -3.9669e+04 1e+04 1e-03 2e-02 8e+02 5: -3.4535e+04 -3.6598e+04 2e+03 2e-04 5e-03 3e+02 6: -3.5108e+04 -3.5263e+04 2e+02 2e-05 4e-04 2e+01 7: -3.5179e+04 -3.5183e+04 5e+00 4e-07 1e-05 6e-01 8: -3.5181e+04 -3.5181e+04 3e-01 3e-08 6e-07 4e-02 9: -3.5181e+04 -3.5181e+04 7e-03 6e-10 1e-08 1e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: -2.0584e+04 -2.1714e+05 2e+05 2e-02 4e-01 2e+03 2: -2.0625e+04 -6.3033e+04 5e+04 4e-03 9e-02 2e+03 3: -2.6476e+04 -4.8834e+04 2e+04 2e-03 5e-02 9e+02 4: -2.2945e+04 -4.5906e+04 3e+04 2e-03 5e-02 1e+03 5: -3.0766e+04 -3.4993e+04 5e+03 4e-04 9e-03 3e+02 6: -3.3080e+04 -3.4042e+04 1e+03 9e-05 2e-03 1e+02 7: -3.3753e+04 -3.3912e+04 2e+02 1e-05 4e-04 2e+01 8: -3.3814e+04 -3.3875e+04 7e+01 6e-06 1e-04 8e+00 9: -3.3853e+04 -3.3864e+04 1e+01 1e-06 3e-05 1e+00 10: -3.3858e+04 -3.3860e+04 3e+00 2e-07 5e-06 3e-01 11: -3.3859e+04 -3.3860e+04 5e-01 4e-08 1e-06 6e-02 12: -3.3860e+04 -3.3860e+04 9e-02 7e-09 2e-07 1e-02 13: -3.3860e+04 -3.3860e+04 1e-02 1e-09 3e-08 2e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: -1.9324e+04 -2.1285e+05 2e+05 2e-02 4e-01 2e+03 2: -1.8790e+04 -7.9732e+04 7e+04 5e-03 1e-01 2e+03 3: -2.4973e+04 -5.1434e+04 3e+04 2e-03 5e-02 1e+03 4: -2.0623e+04 -4.7898e+04 3e+04 2e-03 6e-02 1e+03 5: -2.7990e+04 -3.3910e+04 7e+03 5e-04 1e-02 4e+02 6: -3.1514e+04 -3.2723e+04 1e+03 1e-04 3e-03 1e+02 7: -3.1808e+04 -3.2264e+04 5e+02 4e-05 1e-03 5e+01 8: -3.2154e+04 -3.2206e+04 6e+01 5e-06 1e-04 8e+00 9: -3.2175e+04 -3.2176e+04 1e+00 1e-07 3e-06 2e-01 10: -3.2175e+04 -3.2175e+04 2e-02 1e-09 3e-08 2e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: -1.7723e+04 -2.0947e+05 2e+05 2e-02 4e-01 2e+03 2: -1.6694e+04 -8.6451e+04 8e+04 6e-03 1e-01 3e+03 3: -2.3552e+04 -5.3687e+04 3e+04 3e-03 6e-02 1e+03 4: -1.8173e+04 -4.9316e+04 4e+04 3e-03 7e-02 2e+03 5: -2.5397e+04 -3.2444e+04 8e+03 6e-04 1e-02 4e+02 6: -2.9619e+04 -3.1102e+04 2e+03 1e-04 3e-03 1e+02 7: -2.9918e+04 -3.0180e+04 3e+02 3e-05 6e-04 3e+01 8: -3.0049e+04 -3.0109e+04 7e+01 6e-06 1e-04 8e+00 9: -3.0066e+04 -3.0067e+04 2e+00 1e-07 3e-06 2e-01 10: -3.0067e+04 -3.0067e+04 2e-02 2e-09 4e-08 2e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: -1.5697e+04 -2.0747e+05 2e+05 2e-02 4e-01 2e+03 2: -1.4245e+04 -8.5825e+04 8e+04 6e-03 1e-01 3e+03 3: -2.2001e+04 -5.5400e+04 4e+04 3e-03 7e-02 1e+03 4: -1.5264e+04 -4.9871e+04 4e+04 3e-03 7e-02 2e+03 5: -2.2694e+04 -3.0577e+04 9e+03 7e-04 2e-02 5e+02 6: -2.7295e+04 -2.8916e+04 2e+03 2e-04 4e-03 2e+02 7: -2.7643e+04 -2.7694e+04 6e+01 5e-06 1e-04 6e+00 8: -2.7667e+04 -2.7668e+04 9e-01 7e-08 2e-06 1e-01 9: -2.7667e+04 -2.7667e+04 4e-02 3e-09 8e-08 4e-03 10: -2.7667e+04 -2.7667e+04 1e-03 1e-10 3e-09 1e-04 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: -1.3109e+04 -2.0737e+05 2e+05 2e-02 4e-01 2e+03 2: -1.1454e+04 -7.2650e+04 7e+04 5e-03 1e-01 3e+03 3: -2.0361e+04 -5.4117e+04 4e+04 3e-03 7e-02 2e+03 4: -1.1669e+04 -4.6731e+04 4e+04 3e-03 8e-02 2e+03 5: -1.9842e+04 -2.8472e+04 1e+04 8e-04 2e-02 8e+02 6: -2.4565e+04 -2.5126e+04 6e+02 5e-05 1e-03 8e+01 7: -2.4816e+04 -2.4837e+04 2e+01 2e-06 5e-05 3e+00 8: -2.4828e+04 -2.4829e+04 4e-01 3e-08 7e-07 5e-02 9: -2.4829e+04 -2.4829e+04 1e-02 8e-10 2e-08 1e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: -9.0847e+03 -2.1267e+05 2e+05 2e-02 4e-01 5e+03 2: -1.0389e+04 -3.5014e+04 3e+04 2e-03 5e-02 2e+03 3: -1.7236e+04 -2.6673e+04 1e+04 9e-04 2e-02 8e+02 4: -2.0210e+04 -2.5111e+04 6e+03 5e-04 1e-02 5e+02 5: -1.9975e+04 -2.2561e+04 3e+03 2e-04 6e-03 3e+02 6: -2.1282e+04 -2.1506e+04 3e+02 2e-05 5e-04 4e+01 7: -2.1352e+04 -2.1360e+04 9e+00 8e-07 2e-05 1e+00 8: -2.1355e+04 -2.1355e+04 2e-01 1e-08 3e-07 2e-02 9: -2.1355e+04 -2.1355e+04 1e-02 1e-09 3e-08 2e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: -3.5431e+03 -2.2228e+05 3e+05 2e-02 5e-01 8e+03 2: -6.9137e+03 -4.8671e+04 5e+04 4e-03 9e-02 2e+03 3: -1.6191e+04 -4.1305e+04 3e+04 2e-03 6e-02 3e+03 4: -1.1671e+04 -3.0609e+04 2e+04 2e-03 4e-02 3e+03 5: -1.5594e+04 -1.8081e+04 3e+03 2e-04 6e-03 4e+02 6: -1.6705e+04 -1.7279e+04 7e+02 6e-05 1e-03 9e+01 7: -1.7009e+04 -1.7054e+04 5e+01 4e-06 1e-04 7e+00 8: -1.7023e+04 -1.7033e+04 1e+01 1e-06 2e-05 2e+00 9: -1.7030e+04 -1.7030e+04 3e-01 2e-08 6e-07 4e-02 10: -1.7030e+04 -1.7030e+04 1e-02 1e-09 2e-08 2e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: 3.9318e+03 -2.3604e+05 3e+05 2e-02 5e-01 1e+04 2: -1.4954e+03 -5.7985e+04 6e+04 5e-03 1e-01 3e+03 3: -1.1589e+04 -5.3187e+04 5e+04 4e-03 9e-02 4e+03 4: 1.1802e+02 -4.2967e+04 5e+04 4e-03 1e-01 5e+03 5: -5.7757e+03 -3.6143e+04 4e+04 3e-03 7e-02 4e+03 6: -7.0719e+03 -1.6480e+04 1e+04 9e-04 2e-02 1e+03 7: -1.1415e+04 -1.5772e+04 5e+03 4e-04 1e-02 7e+02 8: -1.1436e+04 -1.1929e+04 6e+02 5e-05 1e-03 8e+01 9: -1.1639e+04 -1.1697e+04 7e+01 6e-06 1e-04 1e+01 10: -1.1643e+04 -1.1647e+04 5e+00 4e-07 1e-05 7e-01 11: -1.1644e+04 -1.1644e+04 2e-01 1e-08 3e-07 2e-02 12: -1.1644e+04 -1.1644e+04 5e-03 4e-10 9e-09 7e-04 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 2e+00 1e+00 1: 1.3717e+04 -2.5324e+05 3e+05 2e-02 5e-01 2e+04 2: 5.2731e+03 -5.3658e+04 7e+04 5e-03 1e-01 4e+03 3: -5.6160e+03 -5.1746e+04 5e+04 4e-03 9e-02 5e+03 4: 1.1860e+03 -3.6886e+04 5e+04 4e-03 8e-02 5e+03 5: -3.0745e+03 -1.1299e+04 1e+04 8e-04 2e-02 1e+03 6: -5.0558e+03 -6.7644e+03 2e+03 2e-04 4e-03 3e+02 7: -4.9106e+03 -5.4214e+03 6e+02 5e-05 1e-03 9e+01 8: -5.0897e+03 -5.1052e+03 2e+01 2e-06 3e-05 3e+00 9: -5.0925e+03 -5.0940e+03 2e+00 1e-07 3e-06 3e-01 10: -5.0926e+03 -5.0928e+03 3e-01 2e-08 4e-07 4e-02 11: -5.0926e+03 -5.0927e+03 2e-02 2e-09 3e-08 3e-03 12: -5.0926e+03 -5.0926e+03 2e-03 1e-10 3e-09 3e-04 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 1e+00 1e+00 1: 2.6081e+04 -2.7265e+05 4e+05 3e-02 4e-01 2e+04 2: 1.3758e+04 -4.7136e+04 7e+04 6e-03 9e-02 5e+03 3: 1.7947e+03 -4.6754e+04 6e+04 5e-03 7e-02 5e+03 4: 6.3636e+03 -1.7193e+04 3e+04 2e-03 4e-02 3e+03 5: 3.3465e+03 1.9287e+03 2e+03 1e-04 2e-03 2e+02 6: 2.9456e+03 2.7883e+03 2e+02 2e-05 3e-04 3e+01 7: 2.9495e+03 2.9464e+03 4e+00 3e-07 5e-06 5e-01 8: 2.9493e+03 2.9492e+03 7e-02 6e-09 9e-08 1e-02 9: 2.9493e+03 2.9493e+03 4e-03 3e-10 6e-09 6e-04 10: 2.9493e+03 2.9493e+03 8e-05 6e-12 1e-10 1e-05 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 1e+00 1e+00 1: 4.1125e+04 -2.9270e+05 4e+05 3e-02 4e-01 3e+04 2: 2.4352e+04 -3.9692e+04 8e+04 6e-03 8e-02 6e+03 3: 1.0997e+04 -4.0126e+04 6e+04 5e-03 6e-02 6e+03 4: 1.4974e+04 4.6920e+02 2e+04 1e-03 2e-02 2e+03 5: 1.3158e+04 1.2393e+04 9e+02 8e-05 1e-03 1e+02 6: 1.2976e+04 1.2930e+04 6e+01 5e-06 6e-05 7e+00 7: 1.2973e+04 1.2972e+04 1e+00 8e-08 1e-06 1e-01 8: 1.2973e+04 1.2973e+04 3e-02 2e-09 3e-08 3e-03 9: 1.2973e+04 1.2973e+04 1e-03 8e-11 1e-09 1e-04 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 9e-01 1e+00 1: 5.8792e+04 -3.1160e+05 5e+05 3e-02 3e-01 4e+04 2: 3.7541e+04 -3.0638e+04 8e+04 6e-03 6e-02 7e+03 3: 2.2459e+04 -3.1574e+04 7e+04 5e-03 5e-02 7e+03 4: 2.6862e+04 1.6992e+04 1e+04 1e-03 1e-02 2e+03 5: 2.5717e+04 2.5172e+04 7e+02 5e-05 5e-04 9e+01 6: 2.5580e+04 2.5558e+04 3e+01 2e-06 2e-05 4e+00 7: 2.5580e+04 2.5580e+04 5e-01 4e-08 4e-07 7e-02 8: 2.5580e+04 2.5580e+04 2e-02 2e-09 2e-08 3e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 7e-01 1e+00 1: 7.8927e+04 -3.2765e+05 5e+05 4e-02 3e-01 4e+04 2: 5.3941e+04 -1.8555e+04 9e+04 7e-03 5e-02 8e+03 3: 3.6818e+04 -1.9892e+04 7e+04 5e-03 4e-02 8e+03 4: 4.2356e+04 3.5267e+04 9e+03 7e-04 6e-03 1e+03 5: 4.1643e+04 4.1157e+04 6e+02 5e-05 4e-04 8e+01 6: 4.1519e+04 4.1504e+04 2e+01 1e-06 1e-05 3e+00 7: 4.1519e+04 4.1518e+04 4e-01 3e-08 2e-07 5e-02 8: 4.1519e+04 4.1519e+04 1e-02 1e-09 8e-09 2e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 5e-01 1e+00 1: 1.0142e+05 -3.3927e+05 6e+05 4e-02 3e-01 5e+04 2: 7.4356e+04 -1.4986e+03 1e+05 7e-03 4e-02 9e+03 3: 5.4993e+04 -3.1290e+03 8e+04 6e-03 3e-02 8e+03 4: 6.2235e+04 5.7245e+04 7e+03 5e-04 3e-03 8e+02 5: 6.1834e+04 6.1425e+04 5e+02 4e-05 3e-04 7e+01 6: 6.1731e+04 6.1721e+04 1e+01 1e-06 7e-06 2e+00 7: 6.1731e+04 6.1731e+04 3e-01 2e-08 1e-07 4e-02 8: 6.1731e+04 6.1731e+04 7e-03 6e-10 4e-09 1e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 4e-01 1e+00 1: 1.2633e+05 -3.4516e+05 7e+05 4e-02 2e-01 5e+04 2: 9.9866e+04 2.3018e+04 1e+05 7e-03 4e-02 9e+03 3: 7.8373e+04 2.1508e+04 8e+04 6e-03 3e-02 8e+03 4: 8.7651e+04 8.4467e+04 4e+03 3e-04 2e-03 5e+02 5: 8.7481e+04 8.7186e+04 4e+02 3e-05 1e-04 5e+01 6: 8.7412e+04 8.7406e+04 9e+00 7e-07 3e-06 1e+00 7: 8.7412e+04 8.7412e+04 1e-01 1e-08 5e-08 2e-02 8: 8.7412e+04 8.7412e+04 3e-03 2e-10 1e-09 4e-04 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 1e+06 9e-02 3e-01 1e+00 1: 1.5403e+05 -3.4417e+05 7e+05 5e-02 2e-01 6e+04 2: 1.3196e+05 5.8089e+04 1e+05 7e-03 3e-02 1e+04 3: 1.0908e+05 5.7728e+04 7e+04 5e-03 2e-02 8e+03 4: 1.2014e+05 1.1849e+05 2e+03 2e-04 6e-04 3e+02 5: 1.2011e+05 1.1995e+05 2e+02 2e-05 6e-05 3e+01 6: 1.2008e+05 1.2008e+05 4e+00 3e-07 1e-06 6e-01 7: 1.2008e+05 1.2008e+05 5e-02 4e-09 1e-08 7e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 2e+06 9e-02 3e-01 1e+00 1: 1.8530e+05 -3.3517e+05 8e+05 5e-02 1e-01 6e+04 2: 1.7275e+05 1.0738e+05 1e+05 6e-03 2e-02 9e+03 3: 1.5019e+05 1.0978e+05 6e+04 4e-03 1e-02 7e+03 4: 1.6159e+05 1.6078e+05 1e+03 8e-05 2e-04 2e+02 5: 1.6166e+05 1.6159e+05 1e+02 7e-06 2e-05 1e+01 6: 1.6166e+05 1.6166e+05 2e+00 1e-07 4e-07 3e-01 7: 1.6166e+05 1.6166e+05 3e-02 2e-09 5e-09 4e-03 Optimal solution found. pcost dcost gap pres dres k/t 0: -2.5036e+04 -1.0400e+06 2e+06 9e-02 2e-01 1e+00 1: 2.2133e+05 -3.1691e+05 9e+05 5e-02 1e-01 7e+04 2: 2.2510e+05 1.6024e+05 1e+05 6e-03 2e-02 1e+04 3: 2.0806e+05 1.8950e+05 3e+04 2e-03 4e-03 4e+03 4: 2.1446e+05 2.1373e+05 1e+03 7e-05 2e-04 1e+02 5: 2.1459e+05 2.1452e+05 1e+02 7e-06 2e-05 1e+01 6: 2.1461e+05 2.1460e+05 2e+00 1e-07 3e-07 2e-01 7: 2.1461e+05 2.1461e+05 4e-02 3e-09 7e-09 6e-03 Optimal solution found.
print(raps)
[0.1, 0.12742749857031338, 0.16237767391887217, 0.20691380811147897, 0.26366508987303583, 0.33598182862837817, 0.42813323987193935, 0.5455594781168519, 0.6951927961775606, 0.8858667904100825, 1.1288378916846888, 1.438449888287663, 1.8329807108324356, 2.3357214690901227, 2.9763514416313175, 3.79269019073225, 4.832930238571752, 6.158482110660264, 7.847599703514611, 10.0]
# Plot trade-off curve and optimal allocations. plt.figure(figsize=(10,6)) plt.figure(1, facecolor='w') plt.plot(risks, returns) plt.xlabel('standard deviation') plt.ylabel('expected return') plt.axis([24000, 40000, 30000, 42000]) plt.show()
Image in a Jupyter notebook