Introduction to Financial Python

Rate of Return, Mean and Variance


In this chapter we are going to introduce some basic concepts in quantitative finance. We start with rate of return, mean and variance. You may think it's simple to calculate these values, however, there are number of different methods to calculate them. It's important to choose the appropriate calculation methods case by case.

Rate of Return

Single-period Return

The single-period rate of return can be calculated as following:

\[r = \frac{p_t}{p_0} - 1 = \frac{p_t - p_0}{p_0}\]

Where \(r\) is the rate of return, \(p_t\) is the asset price at time \(t\), and \(p_0\) is the asset price at time 0.

import numpy as np
rate_return = 102.0/100 - 1
print rate_return
[out]: 0.02

Let's say we bought a stock at $100, and half a year later it will grow to $102. A year later the price will come to $104. How to calculate our total return? Well, we can either deem it as a single-period:

\[r = 104/100 - 1 = 0.04\]

or as a two-stage period:

\[ r = (1+r_1)*(1+r_2) - 1 = \frac{102}{100} * \frac{104}{102} -1 = 0.04\]

Here we make calculations twice a year. It's called semi-annual compounding. How about quarterly compounding? Let's assume the stock prices at the end of each quarter are \(p_1, p_2, p_3, p_4\) respectively.

\[r = (1+r_1)*(1+r_2)*(1+r_3)*(1+r_4) -1\]

The rate of return we calculate here is called cumulative return or overall return. It measures the total return of this asset over a period of time.

Now consider the following situation: we have two strategies: strategy A and strategy B. We backtested strategy A for 1 years and the cumulative return is 20%, while we backtested strategy B for 3 months(one quarter) and the cumulative return is 6%. Which strategy has a high rate of return? Our commonly used method is to convert all the returns into compounding annual return, regardless of the investing horizon of each strategy. We can compare the returns of strategies with different time horizon now. Since there are four quarters in a year,the annual return of strategy B is

\[(1+0.06)^4 = 1+r\] \[ r = 0.262\]

Strategy B has an higher compounding annual return when we compare 26% with 20%.

Logarithm Return

In the above example, strategy A has 6% return over three months. Nominally, the annual return would be 4*6% = 24%. This nominal annual interest rate is called the stated annual interest rate. It is calculated as the periodic interest rate times the number of periods per year. It works according to the simple interest and does not take into account the compounding periods, while the effective annual interest rate is 26% as we calculated above and it does account for intra-year compounding. The effective annual interest rate is an essential tool that allows the evaluation of the real return on investment. If we assume the number of compounding periods in one year is n, the formula to convert the stated annual interest rate to the effective annual interest rate is


Now imagine the price of asset is changing every second or even every millisecond, the period of compounding n approaches infinite. This is called continuous compounding. The calculation formula is given below:

\[\lim_{n \to \infty }(1+\frac{r}{n})^n = e^r\]

From the above limitation equation, we know that if we assume continuous compounding:

\[e^{r_{nominal}} = 1 + r_{effective} = \frac{p_t}{p_0}\]

Then we take \(ln\) on both side of the equation:

\[r_{nominal} = ln\frac{p_t}{p_0} = lnp_t - lnp_0\]

Here we got the logarithmic return, or continuously compounded return. This return is the nominal return with the interest compounding every millisecond. To see how it is close to effective interest rate, recall the equation above:

\[e^{r_{nominal}} = 1 + r_{effective}\]

then we have

\[r_{effective} = e^{r_{nominal}} - 1 \approx r_{nominal}\]

where the second equality holds due to Taylor Expansion and the interest rate being small. This is frequently used when calculating returns, because once we take the logarithm of asset prices, we can calculate the logarithm return by simply doing a subtraction. Here we use Apple stock prices as an example:

import quandl
import numpy as np
import quandl
quandl.ApiConfig.api_key = 'zNXvSaz2oX5afVGKjf6o'
#get quandl data
aapl_table = quandl.get('WIKI/AAPL')
aapl = aapl_table.loc['2017-3',['Open','Close']]
#take log return
aapl['log_price'] = np.log(aapl.Close)
aapl['log_return'] = aapl['log_price'].diff()
print aapl

The output is:

Date          Open   Close  log_price  log_return
2017-03-01  137.890  139.79   4.940141         NaN
2017-03-02  140.000  138.96   4.934186   -0.005955
2017-03-03  138.780  139.78   4.940070    0.005884
2017-03-06  139.365  139.34   4.936917   -0.003153
2017-03-07  139.060  139.52   4.938208    0.001291
2017-03-08  138.950  139.00   4.934474   -0.003734
2017-03-09  138.740  138.68   4.932169   -0.002305
2017-03-10  139.250  139.14   4.935481    0.003311
2017-03-13  138.850  139.20   4.935912    0.000431
2017-03-14  139.300  138.99   4.934402   -0.001510
2017-03-15  139.410  140.46   4.944923    0.010521
2017-03-16  140.720  140.69   4.946559    0.001636
2017-03-17  141.000  139.99   4.941571   -0.004988
2017-03-20  140.400  141.46   4.952017    0.010446
2017-03-21  142.110  139.84   4.940499   -0.011518
2017-03-22  139.845  141.42   4.951734    0.011235
2017-03-23  141.260  140.92   4.948192   -0.003542
2017-03-24  141.500  140.64   4.946203   -0.001989
2017-03-27  139.390  140.88   4.947908    0.001705
2017-03-28  140.910  143.80   4.968423    0.020515
2017-03-29  143.680  144.12   4.970646    0.002223
2017-03-30  144.190  143.93   4.969327   -0.001319
2017-03-31  143.720  143.66   4.967449   -0.001878

Here we calculated the daily logarithmic return of Apple stock. Given that we know the daily logarithm return of in this month, we can calculate the monthly return by simply sum all the daily returns up.

month_return = aapl.log_return.sum()
print month_return
[out]: 0.0273081001636

It may sounds incorrect to sum up the daily returns, but we can prove that it's mathematically correct. Let's assume the stock prices in a period of time are represented by \([p_0, p_1, p_2, p_3.....p_n]\). Then the cumulative rate of return is given by:

\[1 + r_{effective} \approx 1+r_{nominal} = ln\frac{p_t}{p_0} = ln\frac{p_t}{p_{t-1}} + ln\frac{p_{t-1}}{p_{t-2}}+......+ln\frac{p_1}{p_0}\]

According to the equation above, we can simple sum up each logarithmic return in a period to get the cumulative return. The convenience of this method is also one of the reasons why we use logarithmic return in quantitative finance.


Arithmetic Mean

Mean is a measure of the central tendency of a data series. It capture the key character of the distribution of the data series. When we talk about mean, by default it refers to arithmetic mean. It's defined as the sum of the values divided by the number of observations:

\[\mu = \frac{\sum_{i = 1}^{n}x_i}{n}\]

Where \((x_1,x_2,x_3.....x_n)\) is our data series.

In python we can use NumPy.mean() to do the calculation:

print np.mean(aapl.log_price)
[out]: 4.94597446551

Geometric Mean

The geometric mean is an average that is useful for data series of positive numbers that are better interpreted according to their product, such as growth rate. It's calculated by:

\[\bar{x} = \sqrt[n]{x_1x_2x_3...x_n}\]

Let's calculate the geometric mean of a series of single-period return:

\[1+\bar{r} = \sqrt[t]{\frac{p_t}{p_{t-1}}*\frac{p_{t-1}}{p_{t-2}}*...*\frac{p_2}{p_1}*\frac{p_1}{p_0}}\] \[(1+\bar{r}) = \sqrt[t]{\frac{p_t}{p_0}}\]

Now the equation becomes the form which we are familiar with:

\[(1+\bar{r})^t = \frac{p_t}{p_0}\]

This is why we said it make sense when applied to growth rates.

Variance and Standard Deviation


Variance is a measure of dispersion. In finance, most of the time variance is a synonym for risk. The higher the variance of an asset price is, the higher risk the asset bears. Variance is usually represented by \(\sigma^2\), and it's calculated by

\[\sigma^2 = \frac{\sum_{i = 1}^{n}(x_i- \mu)^2}{n}\]

In python we can use NumPy.var to calculate it:

print np.var(aapl.log_price)

Standard Deviation

The most commonly used measure of dispersion in finance is standard deviation. It's usually represented by \(\sigma\). It's obvious to see the relation between standard deviation and variance:

\[\sigma = \sqrt{\sigma^2} = \sqrt{\frac{\sum_{i = 1}^{n}(x_i- \mu)^2}{n}}\]

NumPy also provides us a method to calculate standard deviation.

print np.std(aapl.log_price)
[out]: 0.000142032804482


We introduced different types of rate of return in this chapter, which could be a little bit tricky when we calculate them. Mean and standard deviation are also very important concepts when we conduct hypothesis test or measure the risk associated with a asset. We will use those concepts intensively in our later chapter.

You can also see our Documentation and Videos. You can also get in touch with us via Discord.

Did you find this page helpful?

Contribute to the tutorials: