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

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.
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.
Create personal stock portfolio tracker with Google Sheets and Google Data Studio

Create personal stock portfolio tracker with Google Sheets and Google Data Studio

I have been investing in the stock market for a while. I was looking for a software tool that could help me better manage my portfolio, but, could not find one that satisfied my needs. One day, I discovered that the Google Sheets application has a built-in function called GOOGLEFINANCE which fetches current or historical prices of stocks into spreadsheets. So I thought it is totally possible to build my own personal portfolio tracker with Google Sheets. I can register my transactions in a sheet and use the pivot table, built-in functions such as GOOGLEFINANCE, and Apps Script to automate the computation for daily evolutions of my portfolio as well as the current position for each stock in my portfolio. I then drew some sort of charts within the spreadsheet to have some visual ideas of my portfolio. However, I quickly found it inconvenient to have the charts overlapped the table and to switch back and forth among sheets in the spreadsheet. That's when I came to know the existen
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?
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.
How to use WEEKDAY function to get last Friday in Google Sheets

How to use WEEKDAY function to get last Friday in Google Sheets

As I manage my stock investment portfolio in Google Sheets, I need to see its evolution over time, for example, in the last year. However, the computation for daily evolution is resource-consuming and might cause performance issues for the spreadsheet. As an alternative, I compute only the weekly evolution of the investment portfolio for the last year. For each week, I compute only the portfolio's value at the end of the Friday. For that, I need a Google Sheets formula to return the last Friday for a given date. This post explains how I do that with the WEEKDAY formula in Google Sheets.
GOOGLEFINANCE Best Practices

GOOGLEFINANCE Best Practices

Anyone using Google Sheets to manage stock portfolio investment must know how to use the GOOGLEFINANCE function to fetch historical prices of stocks. As I have used it extensively to manage my stock portfolio investment in Google Sheets , I have learned several best practices for using the GOOGLEFINANCE function that I would like to share in this post.
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.
Manage Stock Transactions With Google Sheets

Manage Stock Transactions With Google Sheets

The first task of building a stock portfolio tracker is to design a solution to register transactions. A transaction is an event when change happens to a stock portfolio, for instance, selling shares of a company, depositing money, or receiving dividends. Transactions are essential inputs to a stock portfolio tracker and it is important to keep track of transactions to make good decisions in investment. In this post, I will explain step by step how to keep track of stock transactions with Google Sheets.