Black-Scholes期权定价公式是最简单的,这里放出来主要是因为其他的美式期权定价也要用到。

这个类里可以求期权价格、希腊字母、隐含波动率。

唯一可能造成不同Black-Scholes期权定价程序结果不一致的原因就是累计正态分布实现方法不同。众所周知,累计正态分布是没有解析表达式计算的,只能通过数值方法逼近。这里提供了两种算法:

1)Financial Numerical Recipes in C++这本书附录部分采用的算法

2)Bagby, R. J. "Calculating Normal Probabilities." Amer. Math. Monthly 102, 46-49, 1995这篇论文里的方法

public class BS{//S:标的资产现价//X:执行价//r:无风险利率//q:连续分红率,Cost of Carry = r-q//sigma:波动率//t:距离到期时间//PutCall:Call/Putpublic 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){double t_sqrt = Math.Sqrt(t);double sigma2 = sigma*sigma;double d1 = (Math.Log(S/X)+(r-q+sigma2*0.5)*t)/(t_sqrt*sigma);double d2 = d1-t_sqrt*sigma;switch(PutCall){case EPutCall.Call:return S*Math.Exp(-q*t)*N(d1)-X*Math.Exp(-r*t)*N(d2);case EPutCall.Put:return -S*Math.Exp(-q*t)*N(-d1)+X*Math.Exp(-r*t)*N(-d2);default:return 0.0;}            }public double GetDelta(double S, double X, double q, double r,double sigma, double t, EPutCall PutCall){double t_sqrt = Math.Sqrt(t);double sigma2 = sigma*sigma;double d1 = (Math.Log(S/X)+(r-q+sigma2*0.5)*t)/(t_sqrt*sigma);switch(PutCall){case EPutCall.Call:return Math.Exp(-q*t)*N(d1);case EPutCall.Put:return -Math.Exp(-q*t)*N(-d1);default:return 0.0;}    }public double GetGamma(double S, double X, double q, double r,double sigma, double t, EPutCall PutCall){double t_sqrt = Math.Sqrt(t);double sigma2 = sigma*sigma;double d1 = (Math.Log(S/X)+(r-q+sigma2*0.5)*t)/(t_sqrt*sigma);return Math.Exp(-q*t)*n(d1)/S/t_sqrt/sigma;}public double GetTheta(double S, double X, double q, double r,double sigma, double t, EPutCall PutCall){double t_sqrt = Math.Sqrt(t);double sigma2 = sigma*sigma;double d1 = (Math.Log(S/X)+(r-q+sigma2*0.5)*t)/(t_sqrt*sigma);double d2 = d1-t_sqrt*sigma;double part1 = S*sigma*Math.Exp(-q*t)*n(d1)/2.0/t_sqrt;double part2 = -q*S*Math.Exp(-q*t);double part3 = r*X*Math.Exp(-r*t);switch(PutCall){case EPutCall.Call:return -part1-part2*N(d1)-part3*N(d2);case EPutCall.Put:return -part1+part2*N(-d1)+part3*N(-d2);default:return 0.0;}  }public double GetVega(double S, double X, double q, double r,double sigma, double t, EPutCall PutCall){double t_sqrt = Math.Sqrt(t);double sigma2 = sigma*sigma;double d1 = (Math.Log(S/X)+(r-q+sigma2*0.5)*t)/(t_sqrt*sigma);return S*Math.Exp(-q*t)*n(d1)*t_sqrt;}public double GetRho(double S, double X, double q, double r,double sigma, double t, EPutCall PutCall){double t_sqrt = Math.Sqrt(t);double sigma2 = sigma*sigma;double d1 = (Math.Log(S/X)+(r-q+sigma2*0.5)*t)/(t_sqrt*sigma);double d2 = d1-t_sqrt*sigma;switch(PutCall){case EPutCall.Call:return t*X*Math.Exp(-r*t)*N(d2);case EPutCall.Put:return -t*X*Math.Exp(-r*t)*N(-d2);default:return 0.0;}    }public double GetImpliedVol(double S, double X, double q, double r,double optionPrice,double t, EPutCall PutCall, double accuracy, int maxIterations){if(optionPrice<0.99*(S-X*Math.Exp(-r*t)))return 0.0;double t_sqrt = Math.Sqrt(t);double sigma = optionPrice/S/0.398/t_sqrt;for(int i=0; i<maxIterations; i++){double price = GetOptionValue(S, X, q, r, sigma, t, PutCall);double diff = optionPrice-price;if(Math.Abs(diff)<accuracy)return sigma;double vega = GetVega(S, X, q, r, sigma, t, PutCall);sigma = sigma+diff/vega;}return sigma;}public double N(double d){/*//Bagby, R. J. "Calculating Normal Probabilities." Amer. Math. Monthly 102, 46-49, 1995          double part1 = 7.0*Math.Exp(-d*d/2.0);double part2 = 16.0*Math.Exp(-d*d*(2.0-Math.Sqrt(2.0)));double part3 = (7.0+Math.PI*d*d/4.0)*Math.Exp(-d*d);double cumProb = Math.Sqrt(1.0-(part1+part2+part3)/30.0)/2.0;if(d>0)cumProb = 0.5+cumProb;elsecumProb = 0.5-cumProb;return cumProb;*///出自Financial Numerical Recipes in C++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 n(double d){     return 1.0/Math.Sqrt(2.0*Math.PI)*Math.Exp(-d*d*0.5);}}

Black-Scholes期权定价(C#版)相关推荐

  1. 期权定价matlab计算,期权的定价方法概述及利用matlab计算期权价格

    期权的定价方法概述及利用matlab计算期权价格 摘要期权是功能最多.最激动人心的融衍生工具之一.期权定价问题一直是金融数学当中最复杂的问题之一,简要介绍几种基本的期权定价理论,并利用matlab金融 ...

  2. canvasnest 移动距离_NEST 预言机新增均价和波动率数据,直面真实需求

    一个经济系统,无论机制如何,如果不能捕获价值.创造价值,那么也必将消亡. **撰文 | 区块链金融分析师.Matlif** **出品| NEST爱好者(nestfans.com)已获作者授权发布** ...

  3. 表达式求值负数乘负数_为什么现在很多期权的时间价值都为负数?

    作者:一厢财经 来源:网络 缠中说禅的确是炒股人的圣经,无数人靠着模仿学习他,通过缠论分析股票,最后实现了财务自由,我的一个朋友,学习缠论后打板,最高纪录是22个涨停,有兴趣的同学可以点击下面链接购买 ...

  4. Bjerksund and Stensland(1993, 2002)美式期权定价(C#版)

    这里的期权定价算法是指Bjerksund and Stensland分别在1993年和2002年的两篇论文里提出的算法,2002年是1993的改进,更精确.这个类原本就是为Bjerksund and ...

  5. Intel金融加速卡计算库及FPGA期权定价应用

    作者:喻伟 东方证券FPGA加速应用负责人 / 黄琦 Intel FPGA金融加速产品经理 联系邮箱:yuwei1119@sina.com.cn / 个人微信号:yuwei_1119 近年来,在互联网 ...

  6. 随机过程在计算机领域的应用,清华大学出版社-图书详情-《随机过程及其在金融领域中的应用(第2版)》...

    随机过程理论是概率论的重要分支,是一门应用性很强的学科.从1930年起,对于随机过程理论的研究不断发展和丰富,特别是近几十年来,随机过程理论及其应用得到了迅速发展.随机过程理论被广泛地应用到物理学.自 ...

  7. matlab显式差分离散,第9章期权定价的有限差分法.doc

    第9章期权定价的有限差分法.doc 金融衍生工具(第2版) 金融衍生工具(第2版) STYLEREF "标题 1,部分标题 1,章" \* MERGEFORMAT STYLEREF ...

  8. 十二、计算期权定价和布莱克-斯科尔斯公式

    期权定价 期权定价(Option Valuation),期权价值的两个基本构成要素是:内含价值和时间价值. 期权定价,内含价值,也称内在价值,是期权持有人因通过行权获得股票而不是直接购买股票而实现的收 ...

  9. 期权定价lsm方法matlab,运用Matlab基于LSM方法对美式期权定价的新探究

    一.引言1973年之前,理论上对于期权定价一直找不到令人满意的模型,主要是由于对标的资产价格的变动过程无法用适当的随机过程来描述.1973年布莱克.斯科尔斯(Black.Scholes)两位学者将标的 ...

最新文章

  1. C++中stl使用过程中的一些tips
  2. PHP获取表单值--同时获取下拉框的Value和Text值
  3. Linux停止后台运行Django项目
  4. 如何在一个站点里使用两个Web.sitemap 或是多个Web.sitemap?
  5. 程序员:你的业余时间是怎么被浪费掉的?
  6. 【对比学习】koa.js、Gin与asp.net core——中间件
  7. 儒林外史每回概括简短10字_早安心语正能量经典短句 一句话的简短励志语录
  8. selenium 示例_Selenium findElement和findElements示例
  9. 全国草地资源类型分布数据/植被类型分布数据/土地利用类型分布数据
  10. iis aspnet_iisreg.exe 0x8007000B
  11. 【Linux】制作U-Boot烧写镜像到SD卡的过程(下篇:Makefile文件)
  12. vxWorks系统ps2键盘,tty设备,vga设备的联系
  13. 使用云主机的5大好处?
  14. synopsys工具介绍
  15. chatgpt赋能Python-pythonista免费
  16. otn与stn网络_全光网络:OTN与超长距离传输
  17. 米家iHealth体温计拆解
  18. Linux命令之文件内容分屏显示more
  19. WiFi driver框架的一般层次
  20. STM32实战总结:HAL之电机

热门文章

  1. 相机内存卡恢复软件数据恢复方法
  2. Android判断当前手机连接网络
  3. 广州光环国际:PMI-ACP敏捷项目管理认证说明会
  4. 2021年ACP敏捷认证考哪些内容?
  5. fairygui富文本html语法怎么用,文本-FairyGUI 教程-面试哥
  6. Java真的要没落了?
  7. The value of ESP was not properly saved across a function call.
  8. 罗技Logitech MX Vertical 和 MX Lift Vertial无线鼠标简单测评
  9. 计算机专业毕业设计之避坑指南(开题答辩选导师必看)--告诉你怎么顺利毕业,其他专业也适用
  10. 写计算机pr的开题报告,最新计算机硕士论文开题报告(2)