For a research project, I need to find or calculate dividend yield for all the index of major countries in the world (e.g: s&p500,DAX,CAC40 and so on), and I am struggling a bit with it.

I cannot find the raw data anywhere (apart for s&p500), so I was thinking to try to calculate it as a difference between absolute return and total return.

Do anyone has a suggestion or documentation on how to do it?

Thanks in advance

  • $\begingroup$ If the below answer is adequate, would you mind marking it as accepted? I'm nakedly trying to improve my street cred. $\endgroup$ – David Addison Feb 12 '18 at 4:29

S&P indices usually use an adjusted float weighted methodology, in which a change in the index level is defined -- in the base case -- by a Laspeyres index:

$\frac{I + \Delta I}{I} = \frac{\sum_i P_{i,1}*Q_{i,0}}{\sum P_{i,0}*Q_{i,0}} \,; \forall i \in I$

where: $I$ is the index level; $P_i$ is the price of asset $i$; and, $Q_i$ is the float adjusted share count of asset $i$.

Please reference this following S&P document for a more robust definition: http://us.spindices.com/documents/methodologies/methodology-index-math.pdf

Total Returns Indices are further defined as follows:

$\frac{I_{TR,t}}{I_{TR,t-1}} = \frac{I_{t-1} + \Delta I_t + \sum_{i,t} (D_{i,t}*Q_{i,t})}{I_{TR,t-1}}$

where: $I_{TR} $ is the total return index level; and, $D_{i,t}$ is the dividend for asset $i$ on dividend ex-date $t$.


$I_{TR,t}- I_t = \sum_0^t \sum_i (D_{i,t}*Q_{i,t}) $

And your intuition about taking the difference between the price and total return versions of the index should be absolutely right on. To calculate the annual yield then should be simple:

$yield = \frac{(I_{TR,t} - I_{TR,t-365})-(I_{t} - I_{t-365})}{I_{TR,t}} \approx \frac{I_{TR,t}}{I_{TR,t-365}} - \frac{I_{t}}{I_{t-365}} $

where now $t$ represents calendar days.

While I realize that indexing methodologies can be very complicated and can vary, I suspect that the above formula for yield will yield a result which is both accurate and robust.

  • $\begingroup$ Thanks! Do you know a website where I can download the time series to perform the calculation? $\endgroup$ – Dave92 Apr 18 '17 at 13:18
  • $\begingroup$ Index data is usually proprietary. The steps to estimate yield of FTSE which is maintained by the LSE would be nuanced from, say, those to estimate the yield of the S&P500. You could also pay for an institutional data feed -- this project becomes almost trivial if you have a Bloomberg Terminal. If your project permits, it would be far simpler to operate on ETFs which track the underlying indices. ETFDB.com has almost all of the relevant data for most ETFs and links back to the fund's homepage for additional granularity. $\endgroup$ – David Addison Apr 18 '17 at 15:40

If you have a price index $I$ and the corresponding total return index $I_{TR}$, then you can calculate a pre-dividend version of the total return index for period t as follows

$$ I^{predividend}_{TR, t} = I_{TR, t-1}*(1+r_{t}) $$

Our pre-dividend total return index of period t is the previous period's total return index times the return of the price index. The return is simple arithmetic.

$$ r_{t} = \dfrac{I_{t}}{I_{t-1}} -1 $$

The dividend on the total return index in period t $D_{t}$ would be the difference between the actual total return index value and the computed pre-dividend version of it.

$$ D_{t} = I_{TR, t} - I^{predividend}_{TR,t} $$

The yield is the computed dividend divided by the total return index. Note that periods should be in years, as the yield is expressed in annual terms. If your t is not years, you would need to aggregate (yearly sum of dividends, and mean of TR index value).

$$ y_{dividend} = D_t / I_{TR,t}$$

In R and using the tidyverse and the common finance package tidyquant to get S&P500 data from Yahoo, this is the script that I came up with.


sp500 <- tq_get("^GSPC", from = "1990-01-01")
sp500_tr <- tq_get("^SP500TR", from = "1990-01-01")

spx <- left_join(sp500 %>% select(date, SP500 = adjusted), 
                 sp500_tr %>% select(date, SP500_TR = adjusted), 
                 by = "date")

spx_dividend <- spx %>% 
  mutate(SP500_return = SP500/lag(SP500)-1,
         SP500_TR_predividend = lag(SP500_TR)*(1+SP500_return),
         dividend = SP500_TR - SP500_TR_predividend)

spx_dividend_yield <- spx %>% 
  group_by(year = year(date)) %>% 
  summarise(dividend = sum(dividend, na.rm = T),
            SP500_TR = mean(SP500_TR)) %>% 
  mutate(dividendyield = dividend/SP500_TR)

Your Answer

