GPIFã«ããããŒã¿ GPIFïŒå¹Žéç©ç«é管çéçšç¬ç«è¡æ¿æ³äººïŒã¯ãåç幎éãšåœæ°å¹Žéã®ç©ç«éã®ç®¡çã»éçšãè¡ã£ãŠããå£äœã§ãã ãã®å£äœã¯ãå®æçã«åéèååã®ãªã¹ã¯ãšãªã¿ãŒã³ãçžé¢ä¿æ°ã«ã€ããŠè©äŸ¡ããŠãããããããããšã«ç©ç«éã®éçšã®ããã®ããŒããã©ãªãªã決å®ããŠããŸãã ãã ããããã§ã®éèååãšã¯ãäŒç€Ÿããšã®æ ªåŒãªã©ã§ã¯ãªããTOPIXãæ¥çµ225ãªã©ã«ä»£è¡šããããæ ªåŒåžå Žã®æ ªäŸ¡ææ°ãæããMãšã«æ³šæããŠãã ããã
GPIFã¯ãéèååã
åœå
åµåž åœå
æ ªåŒ æµ·å€åµæš© æµ·å€æ ªåŒ ã®4ã€ã«åããŠè©äŸ¡ããããªã£ãŠãããããããã®ãªã¿ãŒã³ããªã¹ã¯ãçžé¢ä¿æ°ã®å€ã¯2016幎å
¬éã®ãã¡ãã®è³æã«ãããšãã€ãã®ããã«ãªã£ãŠããŸãã
ãªã¿ãŒã³ïŒãªã¹ã¯ãã¬ãã¢ã ãªãïŒ
åœå
åµåž åœå
æ ªåŒ æµ·å€åµæš© æµ·å€æ ªåŒ 2.3 5.9 3.6 6.3 ãªã¹ã¯
åœå
åµåž åœå
æ ªåŒ æµ·å€åµæš© æµ·å€æ ªåŒ 4.2 25.23 11.82 26.76 çžé¢ä¿æ°
åœå
åµåž åœå
æ ªåŒ æµ·å€åµæš© æµ·å€æ ªåŒ åœå
åµåž 1.000 -0.230 -0.040 -0.090 åœå
æ ªåŒ -0.230 1.000 0.060 0.660 æµ·å€åµæš© -0.040 0.060 1.000 0.550 æµ·å€æ ªåŒ -0.090 0.660 0.550 1.000 ä»åã¯ãããã®éèååã«å ããŠããå®æé éããèæ
®ããããŒããã©ãªãªãæé©åããããšæããŸãã ããã§ãå®æé éã®ãªã¿ãŒã³ã¯0.1ããªã¹ã¯ã¯0ãä»ã®éèååãšã®çžé¢ä¿æ°ã¯å
šãŠ0ãšããŸããã ããã€ãã®è³æã«ããã°ãããŒããã©ãªãªãæé©åããã«ããã£ãŠããªã¹ã¯è³ç£ãšç¡ãªã¹ã¯è³ç£ã¯åããŠèããã®ãå®ç³ã®ããã§ãã ããããªããèªåã«ã¯ãç¡ãªã¹ã¯è³ç£ããªã¹ã¯0ã®ãªã¹ã¯è³ç£ãšããŠã¿ãªããããšããäœæ
ãŸããããšãªã®ãããç解ã§ããªãã£ãã®ã§ãä»åã¯ãå®æé éããããŒããã©ãªãªã«å å
¥ããŠã¿ã次第ã§ãã ãã®ãããã«è©³ããæ¹ãããããŸãããããã²ãææãã ããâŠâŠ
CVXOPTãçšããæé©å ããŠã以äžã®ããŒã¿ãçšããŠåå玹ä»ãã2次èšç»åé¡ã解ãããã«ãPythonã§ã¹ã¯ãªãããäœæããŸããã äœæããã¹ã¯ãªããã®äžã§ã¯ãCVXOPTãšãããœã«ããŒïŒåé¡ãèªåã§è§£ããŠãããããŒã«ïŒãçšããŠããŸãã CVXOPTã®äœ¿ãæ¹ã¯ããã¡ãã®èšäºãåèã«ãªããŸãã
ãœãŒã¹ã³ãŒã import numpy import cvxopt from cvxopt import matrix import matplotlib.pyplot as plt mu = numpy.array([[2.3,5.9,3.6,6.3,0.1]]) Sigma = numpy.diag([4.2,25.23,11.82,26.76,0]) R = numpy.array([[1.000,-0.230,-0.040,-0.090,0.000], [-0.230,1.000,0.060,0.660,0.000], [-0.040,0.060,1.000,0.550,0.000], [-0.090,0.660,0.550,1.000,0.000], [0.000,0.000,0.000,0.000,1.000]]) Cov = Sigma@R@Sigma print(numpy.linalg.matrix_rank(Cov)) P = matrix(Cov) q = matrix(numpy.zeros((5,1))) Id = numpy.identity(5) G = matrix(-numpy.concatenate((Id,mu), axis=0)) A = matrix(numpy.ones((1,5))) b = matrix(100*numpy.ones((1,1))) Return_bound = numpy.linspace(0,6.7,50) Return = numpy.array([]) Risk = numpy.array([]) Allocations = numpy.array([]) for re_bound in Return_bound: h = matrix(numpy.array([0.0,0.0,0.0,0.0,0.0,-re_bound*100])) sol = cvxopt.solvers.qp(P,q,G,h,A,b) Sol = sol["x"] Allocations = numpy.append(Allocations,Sol) re = Sol.T@mu.T/100 Return = numpy.append(Return,re) ri = (Sol.T@Cov@Sol/10000)**0.5 Risk = numpy.append(Risk,ri) print(Risk) print(Return) fig = plt.figure() plt.plot(Risk,Return) plt.xlabel("äºæ³ãªã¹ã¯ïŒæšæºåå·®ïŒ") plt.ylabel("æåŸ
ãªã¿ãŒã³ [%]") plt.show() Allocations = Allocations.reshape(Return_bound.size,5) Allocations = Allocations.T fig = plt.figure() wd = 5/Return.size p1 = plt.bar(Return, Allocations[0], width = wd, color = "red", label = "åœå
åµæš©") p2 = plt.bar(Return, Allocations[1], width = wd, bottom=Allocations[0], color = "orange", label = "åœå
æ ªåŒ") p3 = plt.bar(Return, Allocations[2], width = wd, bottom=sum(Allocations[0:2,:]), color = "yellow", label = "æµ·å€åµæš©") p4 = plt.bar(Return, Allocations[3], width = wd, bottom=sum(Allocations[0:3,:]), color = "green", label = "æµ·å€æ ªåŒ") p5 = plt.bar(Return, Allocations[4], width = wd, bottom=sum(Allocations[0:4,:]), color = "blue", label = "é é") plt.legend() plt.xlabel("æåŸ
ãªã¿ãŒã³ [%]") plt.ylabel("è³ç£é
å [%]") plt.xlim([0.1,6.7]) plt.ylim([0,100]) plt.show() plt.close('all') å®è¡çµæ ãŸããæåŸ
ãªã¿ãŒã³ã«å¯ŸããŠã®æå°ãªã¹ã¯ã瀺ããå³ã瀺ããŸãã ããã€ãªã¹ã¯ã»ãã€ãªã¿ãŒã³ã®ååãã«åŸãããªã¿ãŒã³ã«å¯ŸããŠãªã¹ã¯ãå調ã«å¢å ããŠããããšãããããŸãã
...