Ju and Zhong(1999) 美式期权定价(C#版)

本文介绍了如何使用C#编程实现Ju and Zhong(1999)提出的美式期权定价算法,该算法在保持计算效率的同时提供更高的精度。此外,还提供了计算美式期权的Delta、Gamma和Theta的方法,以及通过牛顿法求解隐含波动率的实现。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值