Has anyone played with the parameters of the Vasicek model and observed the sometimes ridiculous bond prices it implies? E.g. with the right parameters, a 30-year zero is priced at $147,327.
To be specific, the SDE is $$ dr_t = a(b - r_t)dt + \sigma dW_t. $$ The $T$-bond price is given by $$ P = e^{A - rB} $$ where $r$ is the current short rate, $$ B = \frac{1 - e^{-aT}}{a}, \\ A = -\left(b - \frac{\sigma^2}{2a^2}\right)\left(T - B\right) - \frac{\sigma^2}{4a} B^2. $$
Try setting $r = 0.02$, $a = 0.3$, $b = 0.02$, $\sigma = 0.3$ and $T = 30$ in the C++ implementation below. I get a price of \$147,327. Of course, it should be less than \$1, and I know the Vasicek may imply prices larger than \$1 due to the possibility of negative rates, but this price is a bit ridiculous. After searching for a while I can't seem to find anything like the "Feller conditions" for the Heston model requiring some relationship among the parameters to avoid outputs like this. Has anyone had experience with this issue?
#include <iostream>
#include <cmath>
double BondPrice(double r, double a, double b, double sigma,
double tau)
{
double B = ( 1 - exp(-a*tau)) / a;
double A = -( b - pow(sigma,2.0)/(2*pow(a,2.0))) * (tau - B)
- pow(sigma,2.0)/(4*a) * pow(B,2.0);
double price = exp(A - r*B);
return price;
}
int main()
{
double r = 0.02; // initial short rate
double a = 0.3; // mean reversion speed
double b = 0.02; // long term mean
double sigma = 0.3; // volatility
double tau = 30; // time to maturity
std::cout << "price = " << BondPrice(r,a,b,sigma,tau) << "\n";
}