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

[其他] [原创]基于(Matlab/R/C++)的方差Gamma模型(Hull期权期货)随机抽样[by fantuanxiaot]   [推广有奖]

Ψ▄┳一大卫卍卐席尔瓦

大师

8%

还不是VIP/贵宾

-

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

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

fantuanxiaot 发表于 2015-4-16 00:04:10 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
方差Gamma模型来自Hull的期权期货,用于捕捉股价的跳跃
现在对方差Gamma模型进行样本抽样
资料如下:

Hull_Variance_Gamma1.jpg


Hull_Variance_Gamma2.jpg




一,基于Matlab编程:生成1000个样本并和几何布朗运动的概率分布进行比较
程序如下:

本帖隐藏的内容

  1. %%  基于方差Gamma模型的样本抽取
  2. %%  by fantuanxiaot
  3. function Sample=Variance_Gamma(Time,Variance,Skewness,Riskless,Dividend,S0,Sigma)
  4. %%  举例
  5. %  Variance_Gamma
  6. %  Sample=Variance_Gamma
  7. %  Variance_Gamma(1,0.4,-0.3,0,0,100,0.3)
  8. %  Sample=Variance_Gamma(1,0.4,-0.3,0,0,100,0.3)
  9. %%  Begin
  10. %  Time时间
  11. %  Variance是Gamma过程的方差率
  12. %  Skewness定义了偏态
  13. %  Riskness无风险利率
  14. %  Dividend定义红利率
  15. %  S0定义了基期价格
  16. %  Sigma定义波动率
  17. if nargin==0
  18.     Time=0.5;
  19.     Variance=0.5;
  20.     Skewness=0.1;
  21.     Riskless=0;
  22.     Dividend=0;
  23.     S0=100;
  24.     Sigma=0.2;
  25. end
  26. %  首先构建10000个0~1的随机数
  27. RandSample=rand(1,1000);
  28. Omiga=Time/Variance*log(1-Skewness*Variance-Sigma^2*Variance/2);
  29. %  抽取样本
  30. G=gaminv(RandSample,Time/Variance,Variance);
  31. B=G*Skewness+Sigma*sqrt(G).*norminv(RandSample,0,1);
  32. Sample=S0*exp((Riskless-Dividend)*Time+Omiga+B);
  33. %%  构建对比的几何布朗运动
  34. %  首先构建10000个正态分布的随机数
  35. ST=S0*exp((Riskless-Dividend)*Time+Sigma*normrnd(0,Time,1,1000));
  36. if nargout==0
  37.     %  构建密度函数进行对比
  38.     [f1,x1]=ksdensity(Sample);
  39.     figure('color','w')
  40.     plot(x1,f1,'bo-','markersize',10,'markerfacecolor','r')
  41.     hold on
  42.     [f2,x2]=ksdensity(ST);
  43.     plot(x2,f2,'go-','markersize',10,'markerfacecolor','m')
  44.     legend('方差Gamma','几何布朗')
  45.     set(gca,'fontname','华文楷体','fontsize',14)
  46.     title('方差Gamma分布的样本抽样','fontname','华文楷体','fontsize',18)
  47. end
复制代码



效果可见:

Variance_Gamma2.jpg


Variance_Gamma1.jpg



二,基于R语言编程:

本帖隐藏的内容

  1. ##  ########################################################
  2. ##  ########################################################
  3. ##  基于方差Gamma模型的随机抽样
  4. ##  by fantuanxiaot
  5. Variance_Gamma<-function(Time,Variance,Skewness,
  6.                          Riskless,Dividend,S0,Sigma)
  7. {
  8.   #  举例子:Sample<-Variance_Gamma(0.5,0.5,0.1,0,0,100,0.2)
  9.   Omiga<-Time/Variance*log(1-Skewness*Variance-
  10.                              Sigma^2*Variance/2);
  11.   #  首先构建10000个0~1的随机数
  12.   RandSample<-runif(1000,0,1)
  13.   #  抽取样本
  14.   Variance<-1/Variance
  15.   G<-qgamma(RandSample,Time/Variance,Variance)
  16.   B<-G*Skewness+Sigma*sqrt(G)*qnorm(RandSample,0,1)
  17.   Sample<-S0*exp((Riskless-Dividend)*Time+Omiga+B)
  18.   #  构建对比的几何布朗运动
  19.   #  首先构建10000个正态分布的随机数
  20.   ST<-S0*exp((Riskless-Dividend)*Time+
  21.                Sigma*rnorm(1000,0,Time))
  22.   #  作图进行几何布朗运动和方差Gamma模型的随机抽样比较
  23.   par(family='serif')
  24.   col=rainbow(2)
  25.   Data.Sample<-density(Sample)
  26.   Data.ST<-density(ST)
  27.   plot(Data.Sample$x,Data.Sample$y,,type='b',pch=21,
  28.        lwd=1,col='blue',bg=col[1],
  29.        main='方差Gamma模型样本抽样',
  30.        xlim=c(0,200))  
  31.   lines(Data.ST$x,Data.ST$y,type='b',pch=21,
  32.        lwd=1,col='green',bg=col[2])
  33.   legend(20,100,lty=c(1,1),
  34.          legend=c("方差Gamma","几何布朗"),
  35.          col=col,hori=FALSE,bty="o")
  36.   Data<-list()
  37.   Data$VaGamma<-Sample
  38.   Data$GeoBrown<-ST
  39.   return(Data)
  40. }
  41. ##  样本的抽取
  42. Variance_Gamma(0.5,0.5,0.1,0,0,100,0.2)
  43. Variance_Gamma(0.5,0.5,-0.2,0,0,100,0.2)
  44. ##  ########################################################
  45. ##  ########################################################
复制代码



效果如下:

Variance_Gamma4.jpg


Variance_Gamma3.jpg



三,基于C++编程:

首先我们需要计算正态分布和Gamma分布的分位数计算函数
其次构建一个Gamma方差的类
并从中抽取100个样本
代码如下:

本帖隐藏的内容

  1. //  基于方差Gamma模型的随机抽样
  2. //  by fantuanxiaot
  3. #include <iostream>
  4. #include <cmath>
  5. #include <random>
  6. #include <iomanip>
  7. #include <random>
  8. #include <vector>
  9. using namespace std;
  10. #define pi 3.14159265359
  11. //  首先定义几个重要的分布函数和分位数的求解
  12. //  ////////////////////////////////////////////////////////////////////////
  13. //  ////////////////////////////////////////////////////////////////////////
  14. //  正态分布的分位数的求解
  15. //  计算分位数利用牛顿拉夫森发则
  16. double erf(double a)
  17. {
  18.         double a1=0.0705230784,
  19.                 a2=0.0422820123,
  20.                 a3=0.0092705272,
  21.                 a4=0.0001520143,
  22.                 a5=0.0002765672,
  23.                 a6=0.0000430638;
  24.         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;
  25.         a=pow(a,16);
  26.         a=1-1/a;
  27.         return(a);
  28. }
  29. double f_norm(double x,double p)
  30. {
  31.         double result;
  32.         if(x>=0)
  33.         {
  34.                 result=0.5+0.5*erf(x/sqrt(2))-p;
  35.         } else if(x<0)
  36.         {
  37.                 result=0.5-0.5*erf(fabs(x/sqrt(2)))-p;
  38.         }
  39.         return(result);
  40. }
  41. double g_norm(double x)
  42. {
  43.         return(1.0/sqrt(2*pi)*exp(-pow(x,2)/2.0));
  44. }
  45. double norminv(const double p)
  46. {
  47.         double x,x0=1;
  48.         double eps=1e-3;
  49.         while(true)
  50.         {
  51.                 x=x0-f_norm(x0,p)/g_norm(x0);
  52.                 if(fabs(x-x0)<=eps)
  53.                 {
  54.                         break;
  55.                 }
  56.                 x0=x;
  57.         }
  58.         return x;
  59. }
  60. //  正态分布的分位数的求解
  61. //  ////////////////////////////////////////////////////////////////////////
  62. //  ////////////////////////////////////////////////////////////////////////
  63. //  Gamma分布的分位数的求解
  64. //  计算gamma函数
  65. double gammafun(const double xx)
  66. {
  67.         int j;
  68.     double x,y,tmp,ser;
  69.     const double cof[6]={76.18009172947146,-86.50532032941677,24.01409824083091,
  70.                 -1.231739572450156,0.1208650973866179e-2,-0.5395239384953e-5};
  71.     y=x=xx;
  72.     tmp=x+5.5;
  73.     tmp=tmp-(x+0.5)*log(tmp);
  74.     ser=1.0000000000190015;
  75.     for(j=0;j<=5;j++)
  76.     {
  77.     ser=ser+cof[j]/(++y);
  78.     }
  79.     return(exp(-tmp+log(2.5066282746310005*ser/x)));
  80. }
  81. //  计算gamma的密度和分布函数
  82. double g_gamma(double x,double alpha,double beta)
  83. {
  84.         return(exp(-beta*x)*pow(beta,alpha)*pow(x,alpha-1)/gammafun(alpha));
  85. }
  86. double f_gamma(double x,double alpha,double beta,const double p)
  87. {
  88.          //  采用梯形法计算函数
  89.         double sum=0.0;
  90.     double gaps=(x-0.0)/double(1000);  //每个间隔的长度
  91.     for (int i=0;i<1000;i++)
  92.     {
  93.         sum+=(gaps/2.0)*(g_gamma(0+i*gaps,alpha,beta)+g_gamma(0+(i+1)*gaps,alpha,beta));
  94.     }
  95.     return sum-p;
  96. }
  97. //  计算分位数函数
  98. double gammainv(double p,const double alpha,const double beta)
  99. {
  100.         double eps=1e-3;
  101.         double x2;
  102.         double x0=2;
  103.         while(true)
  104.         {
  105.                 x2=x0-f_gamma(x0,alpha,beta,p)/g_gamma(x0,alpha,beta);
  106.                 if(fabs(x2-x0)<=eps)
  107.                 {
  108.                         break;
  109.                 }
  110.                 x0=x2;
  111.         }
  112.         return x2;
  113. }
  114. //  Gamma分布的分位数的求解
  115. //  ////////////////////////////////////////////////////////////////////////
  116. //  ////////////////////////////////////////////////////////////////////////
  117. //  构建一个方差Gamma随机抽样的类
  118. class VarianceGamma
  119. {
  120. private:
  121.         //  以下是求解的参数
  122.         double Time;
  123.         double Variance;
  124.         double Skewness;
  125.         double Riskless;
  126.         double Dividend;
  127.         double S0;
  128.         double Sigma;
  129. public:
  130.         VarianceGamma(double t,double v,double s,double r,double d,double s0,double si):
  131.                 Time(t),Variance(v),Skewness(s),Riskless(r),Dividend(d),S0(s0),Sigma(si){}
  132.         //  以下是一个随机数生成的函数
  133.         double VGammaPrice(const double randomNumber)
  134.         {
  135.                 double Omiga=Time/Variance*log(1-Skewness*Variance-Sigma*Sigma*Variance/2);
  136.                 double alpha=Time/Variance;
  137.                 double beta=1/Variance;
  138.                 double a=gammainv(randomNumber,alpha,beta);
  139.                 double b=a*Skewness+Sigma*sqrt(a)*norminv(randomNumber);
  140.                 double Sample=S0*exp((Riskless-Dividend)*Time+Omiga+b);
  141.                 return Sample;
  142.         }

  143. };
  144. //  ////////////////////////////////////////////////////////////////////////
  145. //  最终是主函数
  146. int main()
  147. {
  148.         VarianceGamma VG(0.5,0.5,0.1,0,0,100,0.2);
  149.         vector<VarianceGamma> Price;
  150.         //  输入100个价格和100个随机数
  151.         default_random_engine generator;  
  152.         uniform_real_distribution<double> unif_dis(0,1);
  153.         double randomNumber[100];
  154.         for(int i=0;i<=99;i++)
  155.         {
  156.                 Price.push_back(VG);
  157.                 randomNumber[i]=unif_dis(generator);
  158.         }
  159.         //  输出方差Gamma分布的抽样
  160.         for(int i=0;i<=99;i++)
  161.         {
  162.                 cout<<Price[i].VGammaPrice(randomNumber[i])<<"  ";
  163.                 if (i%5==4)
  164.                 {
  165.                         cout<<endl;
  166.                 }
  167.         }
  168.         return 0;
  169. }
复制代码



最终效果:抽取100个随机样本

Variance_Gamma5.jpg


二维码

扫码加我 拉你入群

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

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

关键词:fantuanxiaot MATLAB gamma matla atlab 模型

回帖推荐

Chinix 发表于95楼  查看完整内容

支持楼主~

chengzhifu2013 发表于91楼  查看完整内容

老弟,建议你到时候将这些相关帖汇个总。

painx 发表于90楼  查看完整内容

楼主辛苦了。。。。。。。。。。。。。。。。

jahveh 发表于83楼  查看完整内容

好用功的一個樓主

liuyuchun-cumt 发表于78楼  查看完整内容

不错 很好,相当不错

sqb865384487 发表于67楼  查看完整内容

感谢分享,再对楼主的原创加32个赞,然后希望论坛有更多的原创,最后希望自己的第一个有水平的原创快点出炉!

14HBjpttxs 发表于61楼  查看完整内容

好帖学习咯

trueyahoo 发表于60楼  查看完整内容

henhao kankan xiexie

pkl 发表于55楼  查看完整内容

感谢楼主分享!

杰式悦敏 发表于59楼  查看完整内容

看看 学习一下 好指导哈

zhanglijun93 发表于58楼  查看完整内容

正准备跟老师做课题,lz的分享非常及时,谢谢!

liliangcun 发表于56楼  查看完整内容

不错,支持原创

kai0261 发表于53楼  查看完整内容

这个类说明真是不错,同一问题多种语言的写法的展示和说明对以后语言方法研究很有帮助!

condmn 发表于49楼  查看完整内容

感觉楼主matlab很厉害

condmn 发表于48楼  查看完整内容

感觉楼主matlab很厉害

maxclchen 发表于47楼  查看完整内容

it is interesting to see the comparisons !

zbin7451f 发表于21楼  查看完整内容

原创帖巨多,支持!

Freddy0110 发表于28楼  查看完整内容

r语言编程,顶一个

chenyi112982 发表于13楼  查看完整内容

哈哈,经典模型用了三种不同的方法逐一实现 跑出来的结果很NICE的样子 代码越来越熟练啦!
已有 14 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
niuniuyiwan + 100 + 100 + 5 + 5 + 5 精彩帖子
kongqingbao280 + 60 + 1 + 2 对论坛有贡献
日新少年 + 100 + 5 + 5 + 5 NB!佩服!!
arthistory4 + 1 精彩帖子
zhxjin + 5 + 5 + 5 对论坛有贡献
chengzhifu2013 + 60 继续期待神作
zbin7451f + 100 + 5 + 5 + 5 对论坛有贡献
kychan + 100 精彩 !
crystal8832 + 40 + 3 + 3 + 3 精彩帖子
happy_287422301 + 100 精彩帖子

总评分: 经验 + 740  论坛币 + 360  学术水平 + 39  热心指数 + 41  信用等级 + 33   查看全部评分

本帖被以下文库推荐

xddlovejiao1314 学生认证  发表于 2015-4-16 09:00:57 |显示全部楼层 |坛友微信交流群
鼓励原创帖,给了你我能给的最高奖励,并做加精处理。期待你的再次分享。
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
happy_287422301 + 2 + 2 是应该多鼓励
fantuanxiaot + 50 + 1 + 1 + 1 加油

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

使用道具

zengzhi062 发表于 2015-4-16 09:10:44 |显示全部楼层 |坛友微信交流群
好给力
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
xddlovejiao1314 + 3 + 1 + 1 鼓励积极发帖讨论

总评分: 论坛币 + 3  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

fantuanxiaot 发表于 2015-4-16 09:15:03 |显示全部楼层 |坛友微信交流群
xddlovejiao1314 发表于 2015-4-16 09:00
鼓励原创帖,给了你我能给的最高奖励,并做加精处理。期待你的再次分享。
以后会多多分享
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
xddlovejiao1314 + 30 + 3 鼓励积极发帖讨论
kychan + 100 + 1 + 1 + 1 精彩帖子

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

使用道具

dahai229 发表于 2015-4-16 09:24:54 |显示全部楼层 |坛友微信交流群
好好学习,天天向上
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
xddlovejiao1314 + 3 + 1 + 1 鼓励积极发帖讨论

总评分: 论坛币 + 3  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

mike68097 发表于 2015-4-16 09:26:14 |显示全部楼层 |坛友微信交流群
已有 1 人评分经验 论坛币 学术水平 热心指数 收起 理由
xddlovejiao1314 + 10 + 3 + 1 + 1 鼓励积极发帖讨论

总评分: 经验 + 10  论坛币 + 3  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

雪过无痕 发表于 2015-4-16 10:07:39 |显示全部楼层 |坛友微信交流群
Thanks for sharing!
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
xddlovejiao1314 + 3 + 1 + 1 鼓励积极发帖讨论

总评分: 论坛币 + 3  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

jerker 发表于 2015-4-16 10:21:24 |显示全部楼层 |坛友微信交流群
鼓励原创,为搭档小友点赞
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
xddlovejiao1314 + 3 + 1 + 1 鼓励积极发帖讨论

总评分: 论坛币 + 3  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

yangbing1008 发表于 2015-4-16 11:13:38 |显示全部楼层 |坛友微信交流群
感谢分享
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
xddlovejiao1314 + 3 + 1 + 1 鼓励积极发帖讨论

总评分: 论坛币 + 3  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

很好的资料,支持楼主的分享精神
已有 1 人评分经验 论坛币 学术水平 热心指数 收起 理由
xddlovejiao1314 + 10 + 3 + 1 + 1 鼓励积极发帖讨论

总评分: 经验 + 10  论坛币 + 3  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

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

本版微信群
加好友,备注jltj
拉您入交流群

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

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