Risk Free Interest Rate
Key Concepts
Introduction
The risk free interest rate is the hurdle rate for investments. If investors can get a rate of return with virtually no risk, an investment needs to offer the potential for a greater return to attract capital from rational investors. The risk free interest rate also impacts some performance statistics, like Sharpe and Sortino ratios. Risk free interest rate models provide the interest rate data to your algorithms to enable these calculations.
Set Models
To set the risk free interest rate model, in the Initialize method, call the SetRiskFreeInterestRateModelset_risk_free_interest_rate_model method.
public overide void Initialize()
{
// Set the interest rate model for accurate option IV/greeks and result metrics like Sharpe Ratio
// You should set it according to the main currency of your trading Securities
SetRiskFreeInterestRateModel(new ConstantRiskFreeRateInterestRateModel(0.02m));
} def initialize(self) -> None:
# Set the interest rate model for accurate option IV/greeks and result metrics like Sharpe Ratio
# You should set it according to the main currency of your trading Securities
self.set_risk_free_interest_rate_model(ConstantRiskFreeRateInterestRateModel(0.02))
To view all the pre-built risk free interest rate models, see Supported Models.
Default Behavior
The default risk free interest rate model is the InterestRateProvider, which provides the primary credit rate from the Federal Open Market Committee (FOMC).
Model Structure
Risk free interest rate models must extend the IRiskFreeInterestRateModel interface. Extensions of the IRiskFreeInterestRateModel interface must implement a GetInterestRateget_interest_rate method. The GetInterestRateget_interest_rate method returns the risk free interest rate for a given date.
public class CustomRiskFreeInterestRateModelExampleAlgorithm : QCAlgorithm
{
public override void Initialize()
{
// Set the interest rate model for accurate option IV/greeks and result metrics like Sharpe Ratio
// You should set it according to the main currency of your trading Securities
SetRiskFreeInterestRateModel(new MyRiskFreeInterestRateModel());
}
}
// Define the custom risk free interest rate model
public class MyRiskFreeInterestRateModel : IRiskFreeInterestRateModel
{
public decimal GetInterestRate(DateTime date)
{
return 0.02m;
}
} class CustomRiskFreeInterestRateModelExampleAlgorithm(QCAlgorithm):
def initialize(self) -> None:
# Set the interest rate model for accurate option IV/greeks and result metrics like Sharpe Ratio
# You should set it according to the main currency of your trading Securities
self.set_risk_free_interest_rate_model(MyRiskFreeInterestRateModel())
# Define the custom risk free interest rate model
class MyRiskFreeInterestRateModel(IRiskFreeInterestRateModel):
def get_interest_rate(self, date: datetime | date) -> float:
return 0.02
Disable Interest Rates
To disable the risk free interest rate, set the model to the ConstantRiskFreeRateInterestRateModel and set the risk free rate to zero.
SetRiskFreeInterestRateModel(new ConstantRiskFreeRateInterestRateModel(0));
self.set_risk_free_interest_rate_model(ConstantRiskFreeRateInterestRateModel(0))
Get Interest Rate
To get the risk free interest rate for a specific time, call the GetInterestRateget_interest_rate method with the time.
public override void OnData(Slice slice)
{
var riskFreeInterestRate = RiskFreeInterestRateModel.GetInterestRate(slice.Time);
} def on_data(self, slice: Slice) -> None: risk_free_interest_rate = self.risk_free_interest_rate_model.get_interest_rate(slice.time)
To get the average risk free interest rate for a window of time, call the
GetRiskFreeRate method with the start date and end date.
RiskFreeInterestRateModelExtensions.get_risk_free_rate method with the model, the start date, and end date.
public override void OnData(Slice slice)
{
var avgRiskFreeInterestRate = RiskFreeInterestRateModel.GetRiskFreeRate(Time.AddDays(-30), Time);
} def on_data(self, slice: Slice) -> None: avg_risk_free_interest_rate = RiskFreeInterestRateModelExtensions.get_risk_free_rate( self.risk_free_interest_rate_model, self.time-timedelta(7), self.time )
To get the average risk free interest rate for a set of dates, call the
GetAverageRiskFreeRate method with the list of dates.
RiskFreeInterestRateModelExtensions.get_average_risk_free_rate method with the model and list of dates.
public override void OnData(Slice slice)
{
var avgRiskFreeInterestRate = RiskFreeInterestRateModel.GetAverageRiskFreeRate(
new [] {Time, Time.AddDays(-180), Time.AddDays(-365)}
);
} def on_data(self, slice: Slice) -> None: avg_risk_free_interest_rate = RiskFreeInterestRateModelExtensions.get_average_risk_free_rate( self.risk_free_interest_rate_model, [self.time, self.time-timedelta(180), self.time-timedelta(365)] )
Examples
The following examples demonstrate common practices for implementing a custom risk free interest rate model.
Example 1: Fixed Rate
The following algorithm implements a custom risk free interest rate model with a fixed rate of 2%.
public class CustomFillModelAlgorithm : QCAlgorithm
{
public override void Initialize()
{
SetStartDate(2024, 9, 1);
SetEndDate(2024, 12, 31);
SetCash(100000);
SetRiskFreeInterestRateModel(new MyRiskFreeInterestRateModel());
AddEquity("SPY", Resolution.Daily);
}
public override void OnData(Slice data)
{
if (!Portfolio.Invested)
{
SetHoldings("SPY", 1);
}
}
}
public class MyRiskFreeInterestRateModel : IRiskFreeInterestRateModel
{
public decimal GetInterestRate(DateTime date)
{
return 0.02m;
}
}
class CustomFillModelAlgorithm(QCAlgorithm):
def initialize(self) -> None:
self.set_start_date(2024, 9, 1)
self.set_end_date(2024, 12, 31)
self.set_cash(100000)
self.set_risk_free_interest_rate_model(MyRiskFreeInterestRateModel())
self.add_equity('SPY', Resolution.DAILY)
def on_data(self, data: Slice) -> None:
if not self.portfolio.invested:
self.set_holdings('SPY', 1)
class MyRiskFreeInterestRateModel:
def get_interest_rate(self, date: datetime | date) -> float:
return 0.02