-
Present Values 3
-
Lecture1.1
-
Lecture1.2
-
Lecture1.3
-
-
NPV vs. IRR 4
-
Lecture2.1
-
Lecture2.2
-
Lecture2.3
-
Lecture2.4
-
-
Other Profit Measures 4
-
Lecture3.1
-
Lecture3.2
-
Lecture3.3
-
Lecture3.4
-
-
Depreciation 4
-
Lecture4.1
-
Lecture4.2
-
Lecture4.3
-
Lecture4.4
-
-
Cash Flow Challenges 9
-
Lecture5.1
-
Lecture5.2
-
Lecture5.3
-
Lecture5.4
-
Lecture5.5
-
Lecture5.6
-
Lecture5.7
-
Lecture5.8
-
Lecture5.9
-
-
Capital Asset Pricing Model 3
-
Lecture6.1
-
Lecture6.2
-
Lecture6.3
-
-
Risky Debt 3
-
Lecture7.1
-
Lecture7.2
-
Lecture7.3
-
-
Unlevering Equity 3
-
Lecture8.1
-
Lecture8.2
-
Lecture8.3
-
-
Weighted Average Cost of Capital 4
-
Lecture9.1
-
Lecture9.2
-
Lecture9.3
-
Lecture9.4
-
-
Debt Effect Analysis 2
-
Lecture10.1
-
Lecture10.2
-
-
WACC Challenge 2
-
Lecture11.1
-
Lecture11.2
-
-
Relative Valuation 4
-
Lecture12.1
-
Lecture12.2
-
Lecture12.3
-
Lecture12.4
-
-
Forward Contract Valuation 3
-
Lecture13.1
-
Lecture13.2
-
Lecture13.3
-
Testing NPV vs. IRR
Generally, the NPV rule says take the project if the NPV>0. The IRR rule will sometimes be take the project if the required rate of return is less than the IRR; however, this generally will only apply to some cash flows (specifically ones where the payment is at time 0 and the rest of the cashflows are positive in the future). Let’s see how these rules play out.
Test 1
flows = [Cashflow(-1500,0.0,.05),Cashflow(1000,1.0,.05),Cashflow(1000,2.0,.05)]
cutoff = findIRR(flows)[0]
r=0
decision1 ="Yes"
decision2 ="Yes"
for _ in range(50):
value = NPV2(r,flows)
if value>0:
decision1 ="Yes"
else:
decision1 ="No"
if r < cutoff:
decision2 ="Yes"
else:
decision2 ="No"
r+=.01
print(value,decision1,decision2)
We are going to run through the different values for r, and print 3 things. The NPV of the cash flows, followed by whether the NPV rule would say to take it, and whether the IRR rule would say to take it.
After running this you will notice the NPV rule agrees with the IRR rule every time. What would happen if we reverse the cashflows? Now you would get money in the beginning and pay it back later.
Test 2
flows = [Cashflow(1500,0.0,.05),Cashflow(-1000,1.0,.05),Cashflow(-1000,2.0,.05)]
cutoff = findIRR(flows)[0]
r=0
decision1 ="Yes"
decision2 ="Yes"
for _ in range(50):
value = NPV2(r,flows)
if value>0:
decision1 ="Yes"
else:
decision1 ="No"
if r < cutoff:
decision2 ="Yes"
else:
decision2 ="No"
r+=.01
print(value,decision1,decision2)
When you run this you will see that the NPV decision flips for everything, but we expected that since we are getting the other side of the deal from before. The IRR rule, however does not change. The cutoff level is still the same, but now with lower r our cashflows are actually worth less! When the cashflows are reversed like this, you can modify the IRR rule to be the opposite, we want the rate of return to be higher than r. Let’s plot NPV just to see exactly how this works.
import matplotlib.pyplot as plt
flows = [Cashflow(-1500,0,.05),Cashflow(1000,1,.05),Cashflow(1000,2,.05)]
r = 0
rates=[]
values=[]
for _ in range(50):
rates+=[r]
values+=[NPV2(r,flows)]
r+=.01
plt.plot(rates,values)
flows = [Cashflow(1500,0,.05),Cashflow(-1000,1,.05),Cashflow(-1000,2,.05)]
r = 0
rates=[]
values=[]
for _ in range(50):
rates+=[r]
values+=[NPV2(r,flows)]
r+=.01
plt.plot(rates,values)
plt.xlabel("r")
plt.ylabel("NPV")
plt.legend(["Cash Flows 1","Negative Cash Flows 1"])
plt.show()
You’ll notice that the plots are exact reflections of each other, this is because they represent both sides of the deal. The positive value to one side of cash flows is equal to the negative value of the opposite cash flows.
Something to note when working with IRRs is that if the signs of cash flows change more than once there will be more than one IRR generally. This is because the NPV function will be a polynomial and have multiple roots. Here is a quick plot of the NPV for these types of cashflows.
flows = [Cashflow(-1200,0,.05),Cashflow(2000,3,.05),Cashflow(2000,6,.05),Cashflow(-3000,10,.05)]
r = 0
rates=[]
values=[]
for _ in range(50):
rates+=[r]
values+=[NPV2(r,flows)]
r+=.01
plt.axhline(0, color='black')
plt.plot(rates,values)
plt.xlabel("r")
plt.ylabel("NPV")
plt.title("Cash Flows with Mixed Signs")
plt.show()
You’ll notice these cash flows have two different IRRs, which makes it tough to say which we would use. In this case NPV will be the better measure.
Choosing Projects
When we choose projects, we also favor NPV over IRR. We do this because NPV shows us total profits it we make where IRR just shows us the rate. We could have a project with a fantastic IRR but it returns only $100 versus a project that has an NPV with $10,000 dollars and lower IRR.
Source Code