# Calculating Risk Free Interest Rates for VIX formula

This question pertains to a whitepaper published by the CBOE that explains how the VIX index is calculated.

Near the bottom of page 5 of the whitepaper, it explains that two risk-free interest rates are calculated - R1 and R2. R1 and R2 correspond with expiration dates which are in the future. T1 and T2 represent the time to these expiration dates, measured in years.

The paper reads:

The risk-free interest rates, R1 and R2, are yields based on U.S. Treasury yield curve rates (commonly referred to as “Constant Maturity Treasury” rates or CMTs), to which a cubic spline is applied to derive yields on the expiration dates...

In the example given in the paper:

T1=0.0683486, R1=0.0305%
T2=0.0882686, R2=0.0286%

I’m hoping that someone answering this question can provide more detail as to how R1 and R2 are calculated. For example, if one were to calculate R1 and R2 for T1 and T2 today, where T1= 0.0683486 and T2=0.0882686:

• What inputs would be needed?
• How would one proceed with the calculation using these inputs?
• What would the results be?

## 1 Answer

I have replicated the complete CBOE VIX calculation approach in my working paper No Model No Cry?. Code and documentation are available in the accompanying R-Package R.MFIV, where I also explain the complete VIX-procedure.

What inputs would be needed?

The CBOE uses CMT rates which you can obtain from the U.S. Treasury Website, e.g: or use the scrape_cmt_data function or internal CMT dataset from R.MFIV:

library(R.MFIV)
cmt_dataset # internally saved data from U.S. Treasury
#>             Date X1.mo  X2.mo  X3.mo  X6.mo  X1.yr  X2.yr  X3.yr  X5.yr  X7.yr ...
#>    1: 1990-01-02    NA     NA 0.0783 0.0789 0.0781 0.0787 0.0790 0.0787 0.0798 ...
#>    2: 1990-01-03    NA     NA 0.0789 0.0794 0.0785 0.0794 0.0796 0.0792 0.0804 ...
#>    3: 1990-01-04    NA     NA 0.0784 0.0790 0.0782 0.0792 0.0793 0.0791 0.0802 ...
#>    4: 1990-01-05    NA     NA 0.0779 0.0785 0.0779 0.0790 0.0794 0.0792 0.0803 ...
#>    5: 1990-01-08    NA     NA 0.0779 0.0788 0.0781 0.0790 0.0795 0.0792 0.0805 ...
#>   ---
#> 7700: 2020-10-06 8e-04 0.0009 0.0010 0.0011 0.0014 0.0014 0.0017 0.0032 0.0053 ...
#> 7701: 2020-10-07 8e-04 0.0009 0.0010 0.0012 0.0013 0.0016 0.0021 0.0035 0.0056 ...
#> 7702: 2020-10-08 9e-04 0.0009 0.0009 0.0012 0.0013 0.0013 0.0018 0.0033 0.0054 ...
#> 7703: 2020-10-09 1e-03 0.0011 0.0010 0.0012 0.0015 0.0016 0.0020 0.0034 0.0055 ...
#> 7704: 2020-10-13 9e-04 0.0009 0.0011 0.0012 0.0013 0.0016 0.0018 0.0031 0.0052 ...


How would one proceed with the calculation using these inputs? What would the results be?

Usually you need to calculate the risk-free-rate for a maturity which lies in between the available ones. Simply use a cubic spline to interpolate a rate for a maturity of e.g. 4 months. Or use the interpolate_rfr function from R.MFIV.

library(lubridate)
library(R.MFIV)

interpolate_rfr(cmt_data = cmt_dataset,
date = as_date("2020-01-02"),
exp = as_date("2020-04-02"))
#> [1] 0.01540088


The result is then a risk-free-rate on a given date for a certain expiration date.

• Thanks for your answer. Your result of 0.0154 (1.54%) seems in line with short-term rates in Jan 2020. However, the rates used in the example in the VIX whitepaper are 0.000305 (0.0305%) and 0.000286 (0.0286%), which seem unrealistically low (especially in 2019, when the paper was written, when rates were 1.00-2.00% for most of the year). Additionally, R1 is greater than R2, which suggests an inverted yield curve. Is there a logical explanation for these seemingly unrealistic rates used in the whitepaper? Mar 29, 2022 at 16:33
• Well, the VIX was published in 2003 (and updated in 2014), so maybe the numbers in the example are from a quite different time Mar 30, 2022 at 17:09