-
Return and Variance 7
-
Lecture1.1
-
Lecture1.2
-
Lecture1.3
-
Lecture1.4
-
Lecture1.5
-
Lecture1.6
-
Lecture1.7
-
-
Solving Equations 5
-
Lecture2.1
-
Lecture2.2
-
Lecture2.3
-
Lecture2.4
-
Lecture2.5
-
-
Capital Allocation Line 6
-
Lecture3.1
-
Lecture3.2
-
Lecture3.3
-
Lecture3.4
-
Lecture3.5
-
Lecture3.6
-
-
Diversification 3
-
Lecture4.1
-
Lecture4.2
-
Lecture4.3
-
-
Investment Sets 3
-
Lecture5.1
-
Lecture5.2
-
Lecture5.3
-
-
Portfolios 7
-
Lecture6.1
-
Lecture6.2
-
Lecture6.3
-
Lecture6.4
-
Lecture6.5
-
Lecture6.6
-
Lecture6.7
-
-
Capital and Security Market Lines 3
-
Lecture7.1
-
Lecture7.2
-
Lecture7.3
-
-
Arbitrage 3
-
Lecture8.1
-
Lecture8.2
-
Lecture8.3
-
-
Dividend Discount Model 2
-
Lecture9.1
-
Lecture9.2
-
-
Fixed Income 4
-
Lecture10.1
-
Lecture10.2
-
Lecture10.3
-
Lecture10.4
-
-
Duration and Immunization 4
-
Lecture11.1
-
Lecture11.2
-
Lecture11.3
-
Lecture11.4
-
The Efficient Frontier
I am going to modify the function to also graph expected return versus standard deviation.
def investmentSet(ret1,ret2,SD1,SD2,cor):
var1 = SD1**2
var2 = SD2**2
cov = cor*SD1*SD2
returns = [(x/100)*ret1+(1-x/100)*ret2 for x in range(0,101)]
variances = [(x/100)**2*var1+(1-x/100)**2*var2+2*(x/100)*(1-x/100)*cov for x in range(0,101)]
standardDevs = [x**.5 for x in variances]
allocations = [(x/100) for x in range(0,101)]
plt.plot(allocations,standardDevs)
plt.xlabel("Amount in Asset 1")
plt.ylabel("Standard Deviation")
plt.title("Portfolio Standard Deviation vs. Allocation")
plt.show()
plt.plot(standardDevs,returns)
plt.xlabel("Standard Deviation")
plt.ylabel("Expected Return")
plt.title("The Effecient Frontier")
plt.show()
Try it out.
investmentSet(.06,.09,.2,.3,.2)
The second graph is the possibilities of standard deviation and return we can get by combining these two assets. Now, graph has a lower line and an upper part of the line, the effecient frontier is the upper part of the line. The effecient frontier returns a better return for the same standard deviation as the lower line. So, we would want to invest in portfolios only on that upper line.
Now, finally, I want to modify the function one more time to take an array of correlations so that I can plot them together.
def investmentSet(ret1,ret2,SD1,SD2,corAr):
returns = []
variances = []
standardDevs = []
allocations = []
for cor in corAr:
var1 = SD1**2
var2 = SD2**2
cov = cor*SD1*SD2
returns.append([(x/100)*ret1+(1-x/100)*ret2 for x in range(0,101)])
varAr = [(x/100)**2*var1+(1-x/100)**2*var2+2*(x/100)*(1-x/100)*cov for x in range(0,101)]
variances.append(varAr)
standardDevs.append([x**.5 for x in varAr])
allocations.append([(x/100) for x in range(0,101)])
for i in range(len(returns)):
plt.plot(allocations[i],standardDevs[i],label=str(corAr[i]))
plt.xlabel("Amount in Asset 1")
plt.ylabel("Standard Deviation")
plt.title("Portfolio Standard Deviation vs. Allocation")
plt.legend()
plt.show()
for i in range(len(returns)):
plt.plot(standardDevs[i],returns[i],label=str(corAr[i]))
plt.xlabel("Standard Deviation")
plt.ylabel("Expected Return")
plt.title("The Effecient Frontier")
plt.legend()
plt.show()
investmentSet(.06,.09,.2,.3,[1,.5,.2,0,-.2,-.5,-1])
As you can see, the more negative correlation is, the more effecient we can make our portfolios.
Source Code