Bjerksund and Stensland(1993, 2002)美式期权定价(C#版)
这里的期权定价算法是指Bjerksund and Stensland分别在1993年和2002年的两篇论文里提出的算法,2002年是1993的改进,更精确。这个类原本就是为Bjerksund and Stensland( 2002)写得,不过由于稍作改动就可以得出Bjerksund and Stensland(1993)的结果,所以也加入了1993年的算法。
由于原文只是给出了期权的定价算法,但是没有给出希腊字母表达式,所以,这里也就只是写了期权定价的程序,如果要求希腊字母值能很简单地求出来,就不写了。
Bjerksund and Stensland的美式期权定价算法中有一个特别重要的问题就是里面用到了标准二元正态分布的累积分布函数,期权定价的精确性直接受制于累计分布函数的数值计算结果。这里用的是Drezner and Wesolowsky(1990),实际上这个还不够精确。最好使用Genz(2004)年的方法。
Bjerksund and Stensland的美式期权定价算法另有一个Bug就是,wilmott论坛上好像有人反映用quantlib中带的程序竟然求出了期权价格为负。。。不知道是程序的问题还是什么别的。感觉还是Ju and Zhong(1999)的算法更靠谱
public class BjerksundStensland{//S:标的资产现价//X:执行价//r:无风险利率//q:连续分红率,Cost of Carry = r-q//sigma:波动率//t:距离到期时间//PutCall:Call/Put//Year:Paper1993/Paper2002,选择论文的年份public enum EPutCall{Call,Put,}public EPutCall PutCall{get;set;}public enum EYear{Paper1993,Paper2002,}public EYear Year{get;set;}public double GetOptionValue(double S, double X, double q, double r,double sigma, double t, EPutCall PutCall, EYear Year){if(r==0)r = r+1e-10;if(q==0)q = q+1e-10;switch(PutCall){case EPutCall.Call:return CallValue(S, X, q, r, sigma, t, Year);case EPutCall.Put:return CallValue(X, S, r, q, sigma, t, Year);default:return 0.0;}}private double CallValue(double S, double X, double q, double r,double sigma, double t, EYear Year){double b = r-q;double sigma2 = sigma*sigma;double betaPart1 = 0.5-b/sigma2;double beta = betaPart1+Math.Sqrt(betaPart1*betaPart1+2.0*r/sigma2);double[] I = GetI(beta, X, r, b, t, sigma);double I1 = I[0];double I2 = I[1];double alpha1 = (I1-X)*Math.Pow(I1,-beta);double alpha2 = (I2-X)*Math.Pow(I2,-beta);double t1 = 0.5*(Math.Sqrt(5)-1.0)*t;if(Year==EYear.Paper1993)// 这里是Bjerksund and Stensland(1993)年的版本return alpha2*Math.Pow(S,beta)-alpha2*Phi(S, t, beta, I2, I2, b, sigma, r)+Phi(S, t, 1, I2, I2, b, sigma, r)-Phi(S, t, 1, X, I2, b, sigma, r)-X*Phi(S, t, 0, I2, I2, b, sigma, r)+X*Phi(S, t, 0, X, I2, b, sigma, r);else//这里是Bjerksund and Stensland(2002)年的版本return alpha2*Math.Pow(S,beta)-alpha2*Phi(S, t1, beta, I2, I2, b, sigma, r)+Phi(S, t1, 1, I2, I2, b, sigma, r)-Phi(S, t1, 1, I1, I2, b, sigma, r)-X*Phi(S, t1, 0, I2, I2, b, sigma, r)+X*Phi(S, t1, 0, I1, I2, b, sigma, r)+alpha1*Phi(S, t1, beta, I1, I2, b, sigma, r)-alpha1*Psi(S, t, beta, I1, I2, I1, t1, b, sigma, r)+Psi(S, t, 1, I1, I2, I1, t1, b, sigma, r)-Psi(S, t, 1, X, I2, I1, t1, b, sigma, r)-X*Psi(S, t, 0, I1, I2, I1, t1, b, sigma, r)+X*Psi(S, t, 0, X, I2, I1, t1, b, sigma, r); }private double Psi(double S, double t, double gamma, double H, double I2, double I1, double t1, double b, double sigma, double r){double sigma2 = sigma*sigma;double part1 = (b+(gamma-0.5)*sigma2)*t1;double part2 = sigma*Math.Sqrt(t1);double e1 = -(Math.Log(S/I1)+part1)/part2;double e2 = -(Math.Log(I2*I2/S/I1)+part1)/part2;double e3 = -(Math.Log(S/I1)-part1)/part2;double e4 = -(Math.Log(I2*I2/S/I1)-part1)/part2;part1 = (b+(gamma-0.5)*sigma2)*t;part2 = sigma*Math.Sqrt(t);double f1 = -(Math.Log(S/H)+part1)/part2;double f2 = -(Math.Log(I2*I2/S/H)+part1)/part2;double f3 = -(Math.Log(I1*I1/S/H)+part1)/part2;double f4 = -(Math.Log(S*I1*I1/H/I2/I2)+part1)/part2;double lamda = -r+gamma*b+0.5*gamma*(gamma-1.0)*sigma2;double kappa = 2.0*b/sigma2+(2.0*gamma-1.0);double rho = Math.Sqrt(t1/t);return Math.Exp(lamda*t)*Math.Pow(S,gamma)*(M(e1,f1,rho)-Math.Pow(I2/S,kappa)*M(e2,f2,rho)-Math.Pow(I1/S,kappa)*M(e3,f3,-rho)+Math.Pow(I1/I2,kappa)*M(e4,f4,-rho));}private double Phi(double S, double t, double gamma, double H, double I, double b, double sigma, double r){double sigma2 = sigma*sigma;double d = (Math.Log(S/H)+(b+(gamma-0.5)*sigma2)*t)/sigma/Math.Sqrt(t);double d2 = (Math.Log(I*I/S/H)+(b+(gamma-0.5)*sigma2)*t)/sigma/Math.Sqrt(t);double lamda = -r+gamma*b+0.5*gamma*(gamma-1.0)*sigma2;double kappa = 2.0*b/sigma2+(2.0*gamma-1.0);return Math.Exp(lamda*t)*Math.Pow(S,gamma)*(N(-d)-Math.Pow(I/S,kappa)*N(-d2));}private double[] GetI(double beta, double X, double r, double b, double t, double sigma){double infB = beta/(beta-1.0)*X;double B0 = Math.Max(X,r/(r-b)*X);double t1 = 0.5*(Math.Sqrt(5)-1.0)*t;//这里有疑问,不知道应该用t-t1还是t1double h1 = -(b*(t1)+2.0*sigma*Math.Sqrt(t1))*(X*X/(infB-B0)/B0);double h2 = -(b*t+2.0*sigma*Math.Sqrt(t))*(X*X/(infB-B0)/B0);double[] I = new double[2];I[0] = B0+(infB-B0)*(1-Math.Exp(h1));I[1] = B0+(infB-B0)*(1-Math.Exp(h2));return I;}public double N(double d){if(d>6.0)return 1.0;else if(d<-6.0)return 0.0;double b1 = 0.31938153;double b2 = -0.356563782;double b3 = 1.781477937;double b4 = -1.821255978;double b5 = 1.330274429;double p = 0.2316419;double c2 = 0.3989423;double a = Math.Abs(d);double t = 1.0/(1.0+a*p);double b = c2*Math.Exp((-d)*(d*0.5));double n = ((((b5*t+b4)*t+b3)*t+b2)*t+b1)*t;n = 1.0-b*n;if(d<0)n = 1.0-n;return n;}public double M(double a, double b, double rho){double[] x = {0.018854042,0.038088059,0.0452707394,0.038088059,0.018854042};double[] y = {0.04691008,0.23076534,0.5,0.76923466,0.95308992};double M = N(a)*N(b);for(int i = 0; i<5; i++){M = M+rho*x[i]*Math.Exp((2.0*a*b*y[i]*rho-a*a-b*b)/2.0/(1.0-Math.Pow(y[i]*rho,2)))/Math.Sqrt(1.0-Math.Pow(y[i]*rho,2));}return M;}}
Bjerksund and Stensland(1993, 2002)美式期权定价(C#版)相关推荐
- 期权定价lsm方法matlab,运用Matlab基于LSM方法对美式期权定价的新探究
一.引言1973年之前,理论上对于期权定价一直找不到令人满意的模型,主要是由于对标的资产价格的变动过程无法用适当的随机过程来描述.1973年布莱克.斯科尔斯(Black.Scholes)两位学者将标的 ...
- 美式期权定价python_【优质好课】Python量化期权实战应用
优质好课 · 涨价预警 <Python量化期权实战应用>课程,在预售初期就备受关注,课程开始上线以来,内容更是受到了广大学员的一致好评. 现在,眼看着课程就快要更新完毕了,如果还没有开始学 ...
- 美式期权定价python_【定价】二叉树(CRR)欧式/美式期权定价的原理及Python实现...
二叉树一种常用的期权定价方法,相比BSM模型,这个方法适用范围更广,可以为美式期权等一些其他品种定价.该方法是保持波动率不变的条件下,将价格路径做简化,根据简化的路径做分析和计算. 本文首先介绍使用二 ...
- 美式期权定价python_蒙特卡洛模拟和美式期权定价
最近面试的时候,面试官问我怎么用蒙卡模拟无股息的美式期权定价.我瞬间石化...不怕死地申请了期权建模的实习...主要参考课件 主要内容二叉树定价推导+Python Longstaff-Schwartz ...
- 美式期权定价利率衍生证券
Navigator 支付红利 code 支付已知红利额条件下的美式期权定价 有限差分法 内含有限差分法 外推有限差分法 利率衍生证券 利率上限定价 支付红利 支付已知红利:在期权的有效期的某些时刻的资 ...
- 最小二乘蒙特卡洛模拟方法-美式期权定价
对于最小二乘蒙特卡洛模拟方法,相信很多人刚开始都搞不清楚到底是怎么回事,特别是对于非金融专业的同学来说,解决此类问题有点吃力,但解决美式期权定价问题,此方法被广泛使用,下面给出介绍: 由于美式期权允许 ...
- python期权定价代码_【定价】二叉树(CRR)欧式/美式期权定价的原理及Python实现...
二叉树一种常用的期权定价方法,相比BSM模型,这个方法适用范围更广,可以为美式期权等一些其他品种定价.该方法是保持波动率不变的条件下,将价格路径做简化,根据简化的路径做分析和计算. 本文首先介绍使用二 ...
- BAW美式期权定价半解析解
BAW美式期权定价半解析解 参考文献:G. Barone-Adesi & R. E. Whaley, Efficient Analytic Approximation of American ...
- 最小二乘蒙特卡罗法(LSM)美式期权定价
最小二乘蒙特卡罗(LSM)法美式期权定价 蒙特卡罗欧式期权定价 最小二乘蒙特卡罗 lsm 程序实现 结果及疑问 代码及文档地址 最小二乘蒙特卡罗(LSM)法美式期权定价 这篇文章主要介绍使用蒙特卡罗法 ...
最新文章
- 算法练习day12——190331(哈希函数、哈希表、布隆过滤器、一致性哈希)
- 201671010117 2016-2017-2 《Java程序设计》Java第十七周学习心得
- 旅游景点、住宿带餐饮一天一万多流水能做到吗?
- 【李宏毅2020 ML/DL】P73 More about Anomaly Detection
- 测试可变字符序列stringBuilder
- 计算机组装报告目录,计算机组装实验报告(共9篇).doc
- 不确定性原理的前世今生 · 数学篇(一)
- [CSCCTF 2019 Qual]FlaskLight
- 2022年最新区块链电商赋能企业的解决方案
- 嵌入式字符设备驱动——ULN2003步进电机驱动程序实现
- [转帖]优麒麟和银河麒麟操作系统都出自于天津麒麟信息技术有限公司
- OpenAI 开源语音识别 Whisper
- 如何用纯 CSS 创作一个永动的牛顿摆
- Layman数字土地指南
- 运动的“点”与“线”,竟然能产生错觉???
- 学习机器学习的最佳路径是什么
- python路径、工作路径、文件路径问题、改变当前路径
- 正则表达式(Perl 示例)
- BeeGo环境新建时候的问题
- 操作迅捷CAD编辑器进行CAD转换PDF