Skip to main content

How to calculate the internal rate of return (IRR) and the net present value (NPV) of a stock portfolio with Google Sheets

As a long-term investor, I need to know how to evaluate the performance of my stock portfolio. A simple return on investment calculation is not a good indicator for long-term investment because it does not take into account the holding duration, and cash flows involved during that period. A return on investment of 80% after 20 years is not as impressive as it sounds after 1 year. In this post, I explain the idea of using Google Sheets to calculate the internal rate of return (IRR) and the net present value (NPV) of a stock portfolio.

Diagram of cash flows for managing a stock investment portfolio in Google Sheets

Identify cash flows

As mentioned in the introduction of time value of money, present value, future value, internal rate of return, net present value, to calculate the internal rate of return (IRR) and the net present value (NPV), it is necessary to firstly identify cash flows. Cash flow is the money that is transferred from one entity to another entity. On the recipient side, the cash flow is positive. However, on the expedition side, the cash flow is negative.

In a stock portfolio, each cash flow is essentially a transaction. It could be either:

  • A DEPOSIT transaction: money is transferred from a pocket to a broker account
  • A WITHDRAW transaction: money is transferred from a broker account to a pocket
  • A BUY transaction: money is transferred from a broker account to the market in exchange for shares of a stock
  • A SELL transaction: money is transferred from the market to a broker account in exchange for shares of a stock
  • A DIVIDEND transaction: money is transferred from a paying-dividend company to a shareholder's broker account

Note

That leads to the question of how to manage stock transactions with Google Sheets. In the post, I have detailed how to use Google Sheets as a database to keep track of a portfolio's transactions. The rest of this guide is based on that model.

Manage transactions of a stock investment portfolio with Google Sheets

Depending on the chosen side, a cash flow is positive or negative.

  • If calculating internal rate of return (IRR) and net present value (NPV) for a stock in the portfolio, cash flows are all transactions related to that stock. They are BUY, SELL, and DIVIDEND transactions.
    • From the portfolio's perspective, cash flow is negative for a BUY transaction.
    • From the portfolio's perspective, cash flow is positive for a SELL and DIVIDEND transaction.
    • Note: If a stock is currently held in the portfolio, its current market value (shares * latest price) is considered as a positive cash flow because that is the amount that will be sent to the portfolio if that stock is immediately sold out.

Diagram of cash flows for managing a stock investment portfolio in Google Sheets
  • If calculating internal rate of return (IRR) and net present value (NPV) for the whole portfolio, there are two options for identifying cash flows.
    • The first option is to consider the task as calculating internal rate of return (IRR) and net present value (NPV) for many stocks. Therefore cash flows are BUY, SELL, and DIVIDEND transactions for all stocks presented in the portfolio.
    • The second option is to view it from the pocket. Therefore cash flows are all DEPOSIT and WITHDRAW transactions.
      • From the pocket's perspective, cash flow is negative for a DEPOSIT transaction.
      • From the pocket's perspective, cash flow is positive for a WITHDRAW transaction.
    • Note: The portfolio's current value is considered as a positive cash flow because that is the amount that will be withdrawn to the pocket if the portfolio is immediately closed (sell all shares and withdraw all money).

Choose a discount rate

A discount rate is a next thing to identify. The discount rate is used to benchmark an investment. The resulted internal rate of return (IRR) is compared to the discount rate or the discount rate is used to calculate the net present value (NPV). There are many ways to choose a discount rate and the choice depends on personal preferences, for example:

  • A minimum required rate of return for an investment that one sets for herself/himself
  • An expected rate of return if investing in an alternative asset such as: saving account, real estate, buying a business, etc.
  • A reference rate of return of the market: S&P 500, CAC 40, etc.

As for myself, I set it to be 10% in the sample portfolio.

Apply XIRR and XNPV functions of Google Sheets

With the cash flows and the discount rate identified, the next step is to calculate the internal rate of return (IRR) and net present value (NPV) of a stock portfolio by applying the mathematical formulas introduced in the introduction post. However, as demonstrated by several examples in that introduction post, the task requires many repetitive calculations and investors don't generally have time to do those calculations manually. Instead, it is wiser to leverage the 4 available functions IRR, NPV, XIRR, and XNPV of the Google Sheets to calculate the internal rate of return (IRR) and net present value (NPV) for a stock portfolio.

  • The IRR and NPV functions are used if cash flows are regularly spaced. For example, an investor only makes transactions on the first day of every year. I think it is not a realistic scenario.
  • The XIRR and XNPV functions are used if cash flows are irregularly spaced. Transactions can be made on whatever day. The XIRR and XNPV functions require both date and amount for cash flows. They are the two functions that I use and explain in this series.

Note

  • For the XIRR function, cash flows can be entered in any order.
  • For the XNPV function, cash flows must be ordered ascending by time.

Interpret internal rate of return (IRR) and net present value (NPV)

Using internal rate of return (IRR) and net present value (NPV) helps me to evaluate the performance of my investment. Given my personal discount rate being 10%:

  • If the calculated internal rate of return (IRR) is less than 10% for a stock (or the whole portfolio), I can say that my investment into that stock (or the whole portfolio) does not meet my expectation. Otherwise, if it is greater than 10%, I am pleased with that performance.

  • If the calculated net present value (NPV) (with 10% discount rate) is negative for a stock (or the whole portfolio), I can say that my investment into that stock (or the whole portfolio) does not meet my expectation. Otherwise, if it is positive, I am pleased with that performance.

Conclusion

In this post, I have explained the idea of using Google Sheets functions to calculate internal rate of return (IRR) and net present value (NPV) for a stock portfolio at three levels: for a stock, for a group of stocks, and for the whole portfolio. The process consists mainly of three steps:

In the next posts, I will explain how to apply this idea with some ready-to-use examples and demos.

Series: how to calculate internal rate of return (IRR) and net present value (NPV) for a stock portfolio in Google Sheets

Disclaimer

The post is only for informational purposes and not for trading purposes or financial advice.

Feedback

If you have any feedback, question, or request please:

Support this blog

If you value my work, please support me with as little as a cup of coffee! I appreciate it. Thank you!

Share with your friends

If you read it this far, I hope you have enjoyed the content of this post. If you like it, share it with your friends!

Comments

Popular posts

How to convert column index into letters with Google Sheets

How to convert column index into letters with Google Sheets

In Google Sheets, rows are indexed numerically, starting from 1, but columns are indexed alphabetically, starting from A. Hence, it is pretty straightforward to work with rows and trickier to work with columns as we need to convert between column index and corresponding letters. For example, what are the letters of column 999th in Google Sheets? In this post, we will look at how to convert a column index into its corresponding letters by using the built-in functions of Google Sheets. What are letters of the column 999th in a spreadsheet? Unfortunately, Google Sheets does not provide a ready-to-use function that takes a column index as an input and returns corresponding letters as output. However, there is a little trick of combining other available built-in functions to do the task. In Google Sheets, there is the ADDRESS function that returns the cell reference, according to the specified row index (first parameter) and column index (second parameter) in the input. For example,
Create a dividend income tracker with Google Sheets by simply using pivot tables

Create a dividend income tracker with Google Sheets by simply using pivot tables

As my investment strategy is to buy stocks that pay regular and stable dividends during a long-term period, I need to monitor my dividends income by stocks, by months, and by years, so that I can answer quickly and exactly the following questions: How much dividend did I receive on a given month and a given year? How much dividend did I receive for a given stock in a given year? Have a given stock's annual dividend per share kept increasing gradually over years? Have a given stock's annual dividend yield been stable over years? In this post, I explain how to create a dividend tracker for a stock investment portfolio with Google Sheets by simply using pivot tables.
Use SPARKLINE to create 52-week range price indicator chart for stocks in Google Sheets

Use SPARKLINE to create 52-week range price indicator chart for stocks in Google Sheets

The 52-week range price indicator chart shows the relative position of the current price compared to the 52-week low and the 52-week high price. It visualizes whether the current price is closer to the 52-week low or the 52-week high price. In this post, I explain how to create a 52-week range price indicator chart for stocks by using the SPARKLINE function and the GOOGLEFINANCE function in Google Sheets.
How to convert column index into letters with Google Apps Script

How to convert column index into letters with Google Apps Script

Although Google Sheets does not provide a ready-to-use function that takes a column index as an input and returns corresponding letters as output, we can still do the task by leveraging other built-in functions ADDRESS , REGEXEXTRACT , INDEX , SPLIT as shown in the post . However, in form of a formula, that solution is not applicable for scripting with Google Apps Script. In this post, we look at how to write a utility function with Google Apps Script that converts column index into corresponding letters.
Compute daily evolution of a stock investment portfolio by using only built-in functions of Google Sheets

Compute daily evolution of a stock investment portfolio by using only built-in functions of Google Sheets

To effectively track a stock investment portfolio, it is necessary to know its evolution in the past. As I use Google Sheets to track my stock investment portfolio, I have researched and successfully implemented several solutions. In this post, I am happy to share in detail how to compute the daily evolution of a stock investment portfolio by simply using only the available built-in functions in Google Sheets.
Slice array in Google Sheets

Slice array in Google Sheets

Many functions in Google Sheets return an array as the result. However, I find that there is a lack of built-in support functions in Google Sheets when working with an array. For example, the GOOGLEFINANCE function can return the historical prices of a stock as a table of two columns and the first-row being headers Date and Close. How can I ignore the headers or remove the headers from the results?
Create dividend income tracker with Google Data Studio

Create dividend income tracker with Google Data Studio

With transactions registered, it is easy to create a dividend income tracker with Google Sheets. However, a dividend income tracker in Google Sheets is not interactive. Instead of having different pivot tables and switching forth and back among them, I can create an interactive dividend income tracker with a single-page report on Google Data Studio. In this post, I explain how to create a dividend income tracker with Google Data Studio.
Compute cost basis of stocks with FIFO method in Google Sheets

Compute cost basis of stocks with FIFO method in Google Sheets

After selling a portion of my holdings in a stock, the cost basis for the remain shares of that stock in my portfolio is not simply the sum of all transactions. When selling, I need to decide which shares I want to sell. One of the most common accounting methods is FIFO (first in, first out), meaning that the shares I bought earliest will be the shares I sell first. As you might already know, I use Google Sheets extensively to manage my stock portfolio investment, but, at the moment of writing this post, I find that Google Sheets does not provide a built-in formula for FIFO. Luckily, with lots of effort, I succeeded in building my own FIFO solution in Google Sheets, and I want to share it on this blog. In this post, I explain how to implement FIFO method in Google Sheets to compute cost basis in stocks investing.
How to copy data in Google Sheets as HTML table

How to copy data in Google Sheets as HTML table

I often need to extract some sample data in Google Sheets and present it in my blog as an HTML table. However, when copying a selected range in Google Sheets and paste it outside the Google Sheets, I only get plain text. In this post, I explain how to copy data in Google Sheets as an HTML table by writing a small Apps Script program.