请选择 进入手机版 | 继续访问电脑版
楼主: fantuanxiaot
13314 136

[源码分享] [原创]基于C++的标准期权定价(标准看涨欧式/看跌欧式/标准看跌美式)[by fantuanxiaot]   [推广有奖]

Ψ▄┳一大卫卍卐席尔瓦

大师

8%

还不是VIP/贵宾

-

威望
7
论坛币
-234475 个
通用积分
123.7824
学术水平
3783 点
热心指数
3819 点
信用等级
3454 点
经验
150207 点
帖子
7546
精华
32
在线时间
1327 小时
注册时间
2013-2-3
最后登录
2022-2-24

初级学术勋章 初级热心勋章 中级热心勋章 中级学术勋章 初级信用勋章 中级信用勋章 高级热心勋章 高级学术勋章 特级学术勋章 特级热心勋章 高级信用勋章 特级信用勋章

fantuanxiaot 发表于 2015-3-29 08:49:28 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

一,我的C/C++/C#资源和学习篇

C++多线程

CSharp .Net书籍

C/C++/CSharp红包

[原创]欧式看涨期权二叉树C++

C/C++/CSharp资源2

C++资源基于VS2008

C++数值分析和C++衍生品学习篇

二,基于C++的标准期权定价(标准看涨欧式/看跌欧式/标准看跌美式)[by fantuanxiaot]

程序基于广泛的面向对象编程:

首先定义需要的函数,诸如正态分布cdf:正态分布cdf函数的数值参考方法文献如下:

本帖隐藏的内容

正态分布的分布函数与分位数计算毕业论文.pdf (848.53 KB)

程序:

  1. //  误差函数的近似公式
  2. double erf(double a)
  3. {
  4.         double a1=0.0705230784,
  5.                 a2=0.0422820123,
  6.                 a3=0.0092705272,
  7.                 a4=0.0001520143,
  8.                 a5=0.0002765672,
  9.                 a6=0.0000430638;
  10.         a=1+a1*a+a2*a*a+a3*a*a*a+a4*a*a*a*a+a5*a*a*a*a*a+a6*a*a*a*a*a*a;
  11.         a=pow(a,16);
  12.         a=1-1/a;
  13.         return(a);
  14. }
  15. //  正态分布的累积分布函数
  16. double NormCDF(double x)
  17. {
  18.         double result;
  19.         if(x>=0)
  20.         {
  21.                 result=0.5+0.5*erf(x/sqrt(2));
  22.         } else if(x<0)
  23.         {
  24.                 result=0.5-0.5*erf(fabs(x/sqrt(2)));
  25.         }
  26.         return(result);
  27. }
复制代码
正态分布cdf函数检测:
  1. //  检测正态分布的累积密度函数
  2. //  int main()
  3. //  {
  4. //        double x1=0;
  5. //        double x2=2;
  6. //        double x3=3;
  7. //        double x4=-2;
  8. //        double x5=-3;
  9. //        cout<<NormCDF(x1)<<endl;
  10. //        cout<<NormCDF(x2)<<endl;
  11. //        cout<<NormCDF(x3)<<endl;
  12. //        cout<<NormCDF(x4)<<endl;
  13. //        cout<<NormCDF(x5)<<endl;
  14. //  return 0;
  15. //  }
  16. //  以上的检测质量还行
  17. //  以上的检测质量还行
  18. ////////////////////////////////////////////////////////////////////////
复制代码
定义期权定价的基类:
  1. class OptionPricing
  2. {
  3. protected:
  4.         double S;
  5.         double K;
  6.         double Sigma;
  7.         double Rate;
  8.         double Time;
  9.         //  结果的输出
  10. public:
  11.         //  构造函数
  12.         OptionPricing(double s,double k,double si,double r,double t):
  13.                 S(s),K(k),Sigma(si),Rate(r),Time(t){}
  14.         virtual void OptionPricingResultShow()
  15.         {
  16.                 cout<<endl;
  17.         }
  18. };
复制代码
随后就是定义欧式看涨期权、欧式看跌期权、美式看跌期权的派生类(美式看跌期权运用二叉树的方法)

这是标准的欧式看涨期权的定价类


  1. //  标准的欧式期权定价
  2. class EurCallOptionPricing:public OptionPricing
  3. {
  4. public:
  5.         EurCallOptionPricing(double s,double k,double si,double r,double t):
  6.                 OptionPricing(s,k,si,r,t){}
  7.         virtual void OptionPricingResultShow()
  8.         {
  9.                 double EuropeCallOptionPricing,Omiga;
  10.                 //  定价
  11.                 Omiga=Rate*Time+Sigma*Sigma*Time/2-log(K/S);
  12.                 Omiga=Omiga/(Sigma*sqrt(Time));
  13.                 EuropeCallOptionPricing=S*NormCDF(Omiga)-K*exp(-Rate*Time)*NormCDF(Omiga-Sigma*sqrt(Time));
  14.                 cout<<"您设定的参数:"<<endl;
  15.                 cout<<"基期价格:"<<S<<endl;
  16.                 cout<<"目标价格:"<<K<<endl;
  17.                 cout<<"到期时间:"<<S<<endl;
  18.                 cout<<"波动参数:"<<Sigma<<endl;
  19.                 cout<<"无风险收益率:"<<Rate<<endl;
  20.                 cout<<"标准的欧式看涨期权的价格为:"<<EuropeCallOptionPricing<<endl;
  21.         }
  22. };
复制代码

这是标准的欧式看跌期权的定价类:


  1. class EurPutOptionPricing:public OptionPricing
  2. {
  3. public:
  4.         EurPutOptionPricing(double s,double k,double si,double r,double t):
  5.                 OptionPricing(s,k,si,r,t){}
  6.         virtual void OptionPricingResultShow()
  7.         {
  8.                 double EuropeCallOptionPricing,EuropePutOptionPricing,Omiga;
  9.                 //  定价
  10.                 Omiga=Rate*Time+Sigma*Sigma*Time/2-log(K/S);
  11.                 Omiga=Omiga/(Sigma*sqrt(Time));
  12.                 EuropeCallOptionPricing=S*NormCDF(Omiga)-K*exp(-Rate*Time)*NormCDF(Omiga-Sigma*sqrt(Time));
  13.                 EuropePutOptionPricing=EuropeCallOptionPricing+K*exp(-Rate*Time)-S;
  14.                 cout<<"您设定的参数:"<<endl;
  15.                 cout<<"基期价格:"<<S<<endl;
  16.                 cout<<"目标价格:"<<K<<endl;
  17.                 cout<<"到期时间:"<<S<<endl;
  18.                 cout<<"波动参数:"<<Sigma<<endl;
  19.                 cout<<"无风险收益率:"<<Rate<<endl;
  20.                 cout<<"标准的欧式看跌期权的价格为:"<<EuropePutOptionPricing<<endl;
  21.         }

  22. };
复制代码
这是标准的美式看跌期权的定价类:

  1. class USAPutOptionPricing:public OptionPricing
  2. {
  3. protected:
  4.         //  定义划分的区间数目
  5.         int N;
  6. public:
  7.         USAPutOptionPricing(double s,double k,double si,double r,double t,int n):
  8.                 OptionPricing(s,k,si,r,t),N(n){}
  9.         virtual void OptionPricingResultShow()
  10.         {
  11.                 //  定义要划分的二叉树矩阵
  12.                 double Matrix[100][100];
  13.                 int i,j;
  14.             double Probability,u,d,deltaT,Price1,Price2;
  15.                 deltaT=Time/N;
  16.             u=exp(Sigma*sqrt(deltaT));
  17.             d=exp(-Sigma*sqrt(deltaT));
  18.         Probability=(1+Rate*deltaT-d)/(u-d);
  19.             for(i=0;i<=N;i++)
  20.                 {
  21.                         Matrix[i][N]=max(0,K-S*pow(u,N-i)*pow(d,i));
  22.                 }
  23.                 for(i=N-1;i>=0;i--)
  24.                 {
  25.                         for(j=0;j<=i;j++)
  26.                         {
  27.                                 Price1=exp(-Rate*deltaT)*((1-Probability)*(Matrix[j+1][i+1])
  28.                                         +Probability*(Matrix[j][i+1]));
  29.                                 Price2=K-S*pow(u,i-j)*pow(d,j);
  30.                                 Matrix[j][i]=max(Price1,Price2);
  31.                         }
  32.                 }
  33.                 cout<<"您设定的参数:"<<endl;
  34.                 cout<<"基期价格:"<<S<<endl;
  35.                 cout<<"目标价格:"<<K<<endl;
  36.                 cout<<"到期时间:"<<S<<endl;
  37.                 cout<<"波动参数:"<<Sigma<<endl;
  38.                 cout<<"无风险收益率:"<<Rate<<endl;
  39.                 cout<<"标准的美式看跌期权的价格为:"<<Matrix[0][0]<<endl;

  40.         }
  41. };
复制代码


最终的主函数:


  1. //  主函数
  2. int main()
  3. {
  4.         //  定义对象
  5.         EurCallOptionPricing eurcall(10,12,0.03,0.03/360,100);
  6.         USAPutOptionPricing usaput(10,12,0.03,0.03/360,100,10);
  7.         EurPutOptionPricing eurput(10,12,0.03,0.03/360,100);
  8.         //  输出结果
  9.         eurcall.OptionPricingResultShow();
  10.         cout<<endl;
  11.         eurput.OptionPricingResultShow();
  12.         cout<<endl;
  13.         usaput.OptionPricingResultShow();
  14.         return 0;

  15. }
复制代码

所有的程序如下:

本帖隐藏的内容

OptionPricing.txt (4.83 KB)


运行环境:visual Studio2012
运行结果:
OptionPricingPlot.jpg












二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:fantuanxiaot 期权定价 Fan Ant NTU double 多线程 程序 书籍 资源

已有 9 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子
chengzhifu2013 + 3 + 3 + 3 + 3 拜读大作!
xujingtang + 80 + 2 + 2 + 1 精彩帖子
chenyi112982 + 5 + 5 精彩帖子
zbin7451f + 100 + 5 + 5 + 5 对论坛有贡献
kychan + 10 + 1 + 1 + 1 精彩帖子
oink-oink + 1 + 1 + 1 精彩帖子
fjrong + 5 + 5 + 5 精彩帖子
离歌レ笑 + 100 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 290  论坛币 + 103  学术水平 + 28  热心指数 + 28  信用等级 + 22   查看全部评分

本帖被以下文库推荐

mike68097 发表于 2015-3-29 09:48:00 |显示全部楼层 |坛友微信交流群

回帖奖励 +3

支持!!!!

使用道具

jerker 发表于 2015-3-29 09:52:25 |显示全部楼层 |坛友微信交流群

回帖奖励 +3

为楼主的学习劲头点赞
已有 2 人评分经验 论坛币 收起 理由
kychan + 24 精彩帖子
fantuanxiaot + 5 + 2 精彩帖子

总评分: 经验 + 29  论坛币 + 2   查看全部评分

使用道具

791935570 学生认证  发表于 2015-3-29 09:52:26 |显示全部楼层 |坛友微信交流群

回帖奖励 +3

使用道具

zhukeming 发表于 2015-3-29 09:53:31 |显示全部楼层 |坛友微信交流群

回帖奖励 +3

为版主的学以致用点大赞狂赞怒赞超赞
已有 1 人评分论坛币 收起 理由
fantuanxiaot + 3 精彩帖子

总评分: 论坛币 + 3   查看全部评分

使用道具

sq2008 发表于 2015-3-29 10:00:10 |显示全部楼层 |坛友微信交流群

回帖奖励 +3

顶起来!!!!!!!!

使用道具

laughlaugh 发表于 2015-3-29 10:04:05 |显示全部楼层 |坛友微信交流群

回帖奖励 +3

使用道具

fantuanxiaot 发表于 2015-3-29 10:04:24 |显示全部楼层 |坛友微信交流群
大家速度顶起来!!!!!!!!!
已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
kychan + 10 + 1 + 1 + 1 起来 顶起来

总评分: 经验 + 10  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

fantuanxiaot 发表于 2015-3-29 10:04:55 |显示全部楼层 |坛友微信交流群
laughlaugh 发表于 2015-3-29 10:04
今天中午可能有红包 大家准备好
已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
kychan + 10 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 10  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

qingbo0221 发表于 2015-3-29 10:06:47 |显示全部楼层 |坛友微信交流群

回帖奖励 +3

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 06:27