What is CACR and why not use AAGR?
Often when you see financial advisors have statements with awesome returns. These returns might be what is called Annual Average Growth Rates (AAGR). Why should you be skeptical with AAGR?
Simple example will show you.
- You start by investing 10.000$.
- First year you get 100% in return, resulting in 20.000$.
- The year after you have a fall of 50%, which makes your value back to 10.000$
Using AAGR, your investor will tell you you have (100% – 50%)/2 = 25% AAGR or calls it average annual return.
But wait a minute? You have the same amount of money after two years, so how can that be 25%?
With Compound Annual Growth Rate the story is different as it only considers the start and end value. Here the difference is a big 0$, resulting in a 0% CAGR.
The formula for calculating CAGR is.
((end value)/(start value))^(1/years) – 1
As the above example: (10.000/10.000)^(1/2) – 1 = 0
Step 1: Getting access to financial sector data
In this tutorial we will use the Alpha Vantage. To connect to them you need to register to get a API_KEY.
To claim your key go to: https://www.alphavantage.co/support/#api-key

Where you will select Software Developer in the drop-down Which of the following best describes you? Write your organization of choice. Then write your email address and click that you are not a robot. Or are you?
Then it will give you hare API_KEY on the screen (not in a email). The key is probably a 16 upper case character and integer string.
Step 2: Get the sector data to play with
Looking at Pandas-datareaders API you will see you can use the get_sector_performance_av() function.
import pandas_datareader.data as web API_KEY = "INSERT YOUR KEY HERE" data = web.get_sector_performance_av(api_key=API_KEY) print(data)
Remember to change API_KEY to the key you got from Step 1.
You should get an output similar to this one (not showing all columns).
RT 1D 5D ... 3Y 5Y 1 0Y Communication Services 0.38% 0.38% -0.20% ... 24.04% 29.92% 74.7 8% Information Technology 0.04% 0.04% -1.36% ... 104.45% 183.51% 487.3 3% Consumer Discretionary -0.06% -0.06% 1.36% ... 66.06% 92.37% 384.7 1% Materials -0.07% -0.07% 1.75% ... 17.50% 37.64% 106.9 0% Health Care -0.16% -0.17% 0.90% ... 37.21% 43.20% 268.5 8% Consumer Staples -0.19% -0.19% 1.42% ... 15.96% 27.65% 137.66% Utilities -0.38% -0.38% 0.60% ... 13.39% 34.79% 99.63% Financials -0.61% -0.61% 3.23% ... 1.67% 23.89% 119.46% Industrials -0.65% -0.65% 4.45% ... 12.57% 40.05% 155.56% Real Estate -1.23% -1.23% -0.63% ... 12.51% NaN NaN Energy -1.99% -1.99% 1.38% ... -39.45% -44.69% -29.07%
The columns we are interested in are the 1Y, 3Y, 5Y, and 10Y.
Step 3: Convert columns to floats
As you saw in the previous Step that the columns all contain in %-sign, which tells you that the entries are strings and not floats and need to be converted.
This can be done by some string magic. First we need to remove the %-sign before we convert it to a float.
import pandas_datareader.data as web API_KEY = "INSERT YOUR KEY HERE" data = web.get_sector_performance_av(api_key=API_KEY) for column in data.columns: data[column] = data[column].str.rstrip('%').astype('float') / 100.0 print(data[['1Y', '3Y', '5Y' , '10Y']])
Where we convert all columns in the for-loop. Then we print only the columns we need.
1Y 3Y 5Y 10Y Communication Services 0.1999 0.2404 0.2992 0.7478 Information Technology 0.4757 1.0445 1.8351 4.8733 Consumer Discretionary 0.2904 0.6606 0.9237 3.8471 Materials 0.1051 0.1750 0.3764 1.0690 Health Care 0.1908 0.3721 0.4320 2.6858 Consumer Staples 0.0858 0.1596 0.2765 1.3766 Utilities 0.0034 0.1339 0.3479 0.9963 Financials -0.0566 0.0167 0.2389 1.1946 Industrials 0.0413 0.1257 0.4005 1.5556 Real Estate -0.0658 0.1251 NaN NaN Energy -0.3383 -0.3945 -0.4469 -0.2907
All looking nice. Also, notice that we converted them to float values and not in %-values by dividing by 100.
Step 4: Calculate the CAGR
Now we need to use the formula on the columns.
import pandas_datareader.data as web API_KEY = "INSERT YOUR KEY HERE" data = web.get_sector_performance_av(api_key=API_KEY) for column in data.columns: data[column] = data[column].str.rstrip('%').astype('float') / 100.0 data['1Y-CAGR'] = data['1Y']*100 data['3Y-CAGR'] = ((1 + data['3Y']) ** (1/3) - 1) * 100 data['5Y-CAGR'] = ((1 + data['5Y']) ** (1/5) - 1) * 100 data['10Y-CAGR'] = ((1 + data['10Y']) ** (1/10) - 1) * 100 cols = ['1Y-CAGR','3Y-CAGR', '5Y-CAGR', '10Y-CAGR'] print(data[cols])
This should result in something similar.
1Y-CAGR 3Y-CAGR 5Y-CAGR 10Y-CAGR Communication Services 19.99 7.445258 5.374421 5.742403 Information Technology 47.57 26.919700 23.172477 19.368083 Consumer Discretionary 29.04 18.419079 13.979689 17.097655 Materials 10.51 5.522715 6.597970 7.541490 Health Care 19.08 11.120773 7.445592 13.933956 Consumer Staples 8.58 5.059679 5.003594 9.042452 Utilities 0.34 4.277734 6.152820 7.157502 Financials -5.66 0.553596 4.377587 8.177151 Industrials 4.13 4.025758 6.968677 9.837158 Real Estate -6.58 4.007273 NaN NaN Energy -33.83 -15.399801 -11.169781 -3.376449
Looks like the Information Technology sector is very lucrative.
But to make it more digestible we should visualize it.
Step 5: Create a heatmap
We will use the seaborn library to create it, which is a statistical data visualizing library.
The heatmap endpoint is defined to simply take the DataFrame to visualize. It could not be easier.
import pandas_datareader.data as web import seaborn as sns import matplotlib.pyplot as plt API_KEY = "INSERT YOUR KEY HERE" data = web.get_sector_performance_av(api_key=API_KEY) for column in data.columns: data[column] = data[column].str.rstrip('%').astype('float') / 100.0 data['1Y-CAGR'] = data['1Y']*100 data['3Y-CAGR'] = ((1 + data['3Y']) ** (1/3) - 1) * 100 data['5Y-CAGR'] = ((1 + data['5Y']) ** (1/5) - 1) * 100 data['10Y-CAGR'] = ((1 + data['10Y']) ** (1/10) - 1) * 100 cols = ['1Y-CAGR','3Y-CAGR', '5Y-CAGR', '10Y-CAGR'] sns.heatmap(data[cols], annot=True, cmap="YlGnBu") plt.show()
Resulting in the following output.



