Sunday, August 1, 2021

Internal Rate of Return (IRR) is a growth rate, and this explains why.

 

For the past four years, I have been building business cases to justify the sale and implementation of software. Often, I would include an Internal Rate of Return (IRR) calculation. Over the past few weeks, I have been researching why using IRR as a growth rate will often achieve a result much higher than Compound Average Growth Rate (CAGR) for the same project. I have concluded this is because IRR assumes the cashflows in each period measured are reinvested in subsequent projects that grow at the Internal Rate of Return.

In the past, I simply accepted the standard principles regarding IRR taught in grad school:

  • IRR is the rate at which a given set of cash flows are discounted in order to set the Net Present Value (NPV) of the investment to zero.
  • The resulting rate is compared to the organization’s Weighted Average Cost of Capital (WACC) or a higher “hurdle rate”.
  • If the IRR rate is higher than the WACC/hurdle rate the associated investment is expected to make money for the organization.

I don’t disagree with these principles. However, I couldn’t shake the feeling that IRR had a relation to the CAGR of a given project. I therefore set out to answer whether IRR assumes that the resulting cash flows from the investment are reinvested at a rate equal to IRR?

I assumed this had already been written about and began to read countless blog articles and scholarly journals on the topic. During my research, I found many conflicting opinions. For example, a detailed, well-written, often cited bog at propertymetrics.com concluded that IRR “is a discounting calculation and makes no assumptions about what to do with periodic cash flows received along the way”.  It was a convincing article, but I still had a nagging feeling and kept looking. I never found an article that argued for or against the math behind reinvestment. Just articles that either supported or denied the notion. I therefore began to tinker with the math to try and answer my question. I believe I succeeded in proving, with reasonable accuracy, that IRR does assume reinvestment of cash flows. The return rate produced by IRR is aligned with the cash flows plus reinvestment. This is shown by following the process below:

1. On a set of NPV positive cash flows, with initial investment, calculate the Internal Rate of Return.  

  •  Determining IRR is an iterative process of finding the rate that sets the cash flows to values that, when added together, result in the additive inverse of the initial investment, thus setting the NPV to zero.


2. Calculate the return on each cash flow reinvesting at IRR
  • For each cash flow, in a 5 year scenario,  run the following equation:


3. Add the beginning value (BV) to the reinvestment total to obtain an ending value (EV) and calculate CAGR with the initial investment (BV) and the updated total. 



N = The total number of periods (i.e., months or years) being measured.

 

4. Grow the initial investment at each rate. The CAGR ending value will be equal to the IRR ending value plus the initial investment. (In about 13% of cases the two totals will be off by, approximately, less than one billionth of a percent)

  

The benefit of IRR is in showing the full potential of an investment. Investments with strong returns in the early periods of the investment will result in much higher IRR results. The theory that IRR is the actual return rate is not practical, but it does show the investments full potential and is helpful when comparing projects. Moreover, since IRR can be a bit irrational, a more pragmatic tool is MIRR which allows you to set the rate at which the cash flows are reinvested.

 

Notes:

This article makes the following assumptions.

  1. The money used for the initial investment is not borrowed, and the invested asset’s value is equal to the amount of the original investment.
    1. Click here for an article on  levered vs unlevered IRR. 
  2. Cash flows that result in a positive NPV were used.
  3. Non-normal cashflows, which have multiple real roots, are not in play.

In my next post I will include the spreadsheet progressions for each of the four steps listed in the section above. 

Tuesday, November 8, 2011

Android OS and SSL root certificates

There are many articles and group posts regarding the installation of a Microsoft Windows 2008 R2 Certificate Authority root certificate on an Android tablet or phone. Very few provide a simple answer to this problem.   I have been able to load a root certificate on all my Android devices (this includes the Motorola Xoom , Asus Transformer and Cisco Cius) very simply by using this method. I hope you find this simple enough.
The Android OS  does not recognize the .cer extension, which is the extension used by a Microsoft  certificate server when downloading a root certificate. However, Android does recognize certificate chains, which download from the certificate server with a .p7b extension.  I have had no success installing root certificates from local storage, using built-in or Android Market file management tools. I have copied the .p7b (and cer and pfx) file to local storage and executed it to no avail. But, if I executed the CA cert file from a web server it will load to the local certificate store just fine. Below are the steps I took to install the root certificate onto my Android devices.

Follow these steps:

1.  Download the root certificate chain from the CA (https://CAservername/certsrv)
2.  Place the downloaded root certificate file on a Web server (I used IIS 7)
3.  From your Android device browse to the Web site. (My site had Directory Browsing enabled)
4.  Open the certificate chain file (*.p7b)
5.  Provide a name for the certificate in the local certificate store when prompted
6.  You may also be prompted to set a password to enabled the Android certificate store.

And that's it...well, you may have to force stop and restart any application that you want to recognize the cert, but other than that you should be good to go.

So, now I am now able to access my vWorkspace environment, securely over the Internet, from any of my Android devices ( or Windows, or Mac, or Ipad or Linux)...but I typically have an Android tablet on me when I am out and about and it works great.

Friday, May 15, 2009

Cloning without VirtualCenter

ESX and ESXi both have the capability to perform linked clones. In small environments it can be leveraged via scripting. William Law has written a script that automates cloning as well as linked clones. One of the problems is that the cloned VMs all have the same name and syspreping them with the same name of the VM is a problem.

To sysprep properly I made an edit to the script and created a second script to execute on the VM itself to sysprep the VM. below is a simple explanation.



I edited the Ghettoclone script so that it places the computername into the VM's vmx file during the cloning process. This is done by having the script enter a line setting machine.id equal to the VM's name. I added the following line to line 175 of the script

sed -i "s/^machine.id =.*$/machine.id = \"${CLONED_VM_NAME}\"/g" "${CLONED_VM_VMX}"

Though I haven't tested it yet you should be able to add the following to line 221 of the linked clones script to achieve the same result.

sed -i 's/machine.id = "'${GOLDEN_VM_NAME}'"/machine.id = "'${FINAL_VM_NAME}'"/' ${STORAGE_PATH}/$FINAL_VM_NAME/$FINAL_VM_NAME.vmx


A second script running from within the VM pulls the computername from the VMX file, inserts it into the Sysprep.inf file and then starts Sysprep. The VM is then renamed and added to the domain. below is the script

Dim getid
'#### Set sysprep pathsSource = "C:\sysprep"
'#### perform query for sysprep folder. Do not execute if folder does not existSet objFSO = CreateObject("Scripting.FileSystemObject")If objFSO.FolderExists(sSource) Then
set WshShell = createobject("wscript.shell")
'#### set executable statement variablesvmexec = "vmwareservice.exe -cmd machine.id.get"spexec = "c:\sysprep\sysprep.exe -mini -reseal -activated -reboot -quiet"
'### query for machine name from VM's VMX file and store it as a variable set getid = WshShell.exec("%ComSpec% /c """ & vmexec & """")compname = getid.StdOut.readall
'#### write variable value into the c:\sysprep\sysprep.infConst ForReading = 1Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")Set objFile = objFSO.OpenTextFile("C:\sysprep\sysprep.inf", ForReading)
strText = objFile.ReadAllobjFile.ClosestrNewText = Replace(strText, "ComputerName=", "ComputerName=" & compname & "")
Set objFile = objFSO.OpenTextFile("C:\sysprep\sysprep.inf", ForWriting)objFile.WriteLine strNewTextobjFile.Close
'#### launch Sysprep.exe using edited sysprep.infWshShell.exec("%ComSpec% /c """ & spexec & """")
End If


There are a few couple of caveats

1. I had to reset the local administrator's password to blank. Sysprep hangs during the process. I think there is another solution, but I haven't found it yet.

2. the second script needs to be run on the VM when it first boots. The only way that I can find to do this is to set the script as a computer startup script in AD. The script will only run if the Sysprep folder exists on the VM and the sysprep process removes the folder after it runs. So the script can be set at the domain level.

3. The template VM must be acessible by the ESX(i) host the script is being executed on. Thus it can be done via local storage, but with multiple ESX(i) hosts you need some sort of mechanism to distribute the template such as writing a bash script to copy the template. Maybe that's another post.

4. The VMs must be manually powered on after VM cloning for sysprep to run. The script can be editted to do this automatically, but I haven't determined the best place to set the command in the ghetto clones script yet.

5. and I can't recall if I said this already. but the a folder called sysprep needs to be placed on the c: drive of the template VM with the sysprep files and the sysprep vbs.

Tuesday, April 28, 2009

intro

Desktop Virtualization is building up steam and there are many options available as more and more companies are jumping into the fray. With the field growing each month, it is getting more and more cluttered. Everyone wants a piece of the Gartner projected 64 billion dollars to be spent on virtualizing desktops over the next five years. This blog will focus on some of the things I am doing in the space to solve problems for my customers. Couple few things I am working on now are regarding cost savings and reducing the cost per desktop on inital purchase, as that is a limiting factor in acceptance of the technology. The focus has been on ESX as the backend hypervisor but there is momentum toward changing that. ESXi (the free version) has been adopted at one of my customers (5400 desktop install and growing). Managing it has been a challenge, but there are now tools out there (commerical and free) that address some of the headaches. But ESX is not the end all, Microsoft will soon be comparable to ESX for most customers needs, especially on the desktop side. And Parallels Virtuozzo is making a push with Quest's vWorkspace (pretty slick technology there and Quest will broker all three hypervisors). Watch this space, it's about as dynamic as they come.