Ju and Zhong(1999) 美式期权定价算法在wilmott论坛里一直被很多人推荐,所以就用c#把这个写出来了。Ju and Zhong(1999) 的思路与Barone Adesi and Whaley(1987)相似,都是将美式期权的价值视为欧式期权价值加上一个美式期权带来的溢价,但是Ju and Zhong(1999) 得特点就是在运算速度大致相同的情况下,更加精确,各类算法对比可以在他们的论文里看到。此外,Ju and Zhong(1999)还得出了三个希腊字母(Delta、Gamma、Theta)的表达式,至于剩下的Vega和Rho我们还是只能通过数值的办法来求。
JuZhong99这个类中可以求美式期权的价值、希腊字母和隐含波动率。没做过交易数据,不知道美式期权的隐含波动率和欧式期权的隐含波动率会差多少。但是如果能直接求美式期权的隐含波动率肯定更好,所以这里也就实现了一下,和求BS公式隐含波动率类似,都是用牛顿法。
public class JuZhong99
{
//S:标的资产现价
//X:执行价
//r:无风险利率
//q:连续分红率,Cost of Carry = r-q
//sigma:波动率
//t:距离到期时间
//PutCall:Call/Put
public enum EPutCall
{
Call,
Put,
}
public EPutCall PutCall
{
get;
set;
}
public double GetOptionValue(double S, double X, double q, double r,
double sigma, double t, EPutCall PutCall)
{
if(r==0)
r = r+1e-10;
if(q==0)
q = q+1e-10;
BS myBS = new BS();
double phi;
if(PutCall==EPutCall.Call)
{
phi = 1.0;
myBS.PutCall = BS.EPutCall.Call;
}
else
{
phi = -1.0;
myBS.PutCall = BS.EPutCall.Put;
}
double Sseed = X;
double Sstar = GetSstar(phi, q, t, sigma, r, X, 1e-6, 1000, Sseed);
if(phi*(Sstar-S)>0)
{
double BSprice = myBS.GetOptionValue(S, X, q, r, sigma, t, myBS.PutCall);
double hAh = phi*(Sstar-X)-myBS.GetOptionValue(Sstar, X, q, r, sigma, t, myBS.PutCall);
double[] chi = GetChi(S, S