//  基于方差Gamma模型的随机抽样

//  by fantuanxiaot

#include

#include

#include

#include

#include

#include

using namespace std;

#define pi 3.14159265359

//  首先定义几个重要的分布函数和分位数的求解

//

//

//  正态分布的分位数的求解

//  计算分位数利用牛顿拉夫森发则

double erf(double a)

{

double a1=0.0705230784,

a2=0.0422820123,

a3=0.0092705272,

a4=0.0001520143,

a5=0.0002765672,

a6=0.0000430638;

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;

a=pow(a,16);

a=1-1/a;

return(a);

}

double f_norm(double x,double p)

{

double result;

if(x>=0)

{

result=0.5+0.5*erf(x/sqrt(2))-p;

} else if(x<0)

{

result=0.5-0.5*erf(fabs(x/sqrt(2)))-p;

}

return(result);

}

double g_norm(double x)

{

return(1.0/sqrt(2*pi)*exp(-pow(x,2)/2.0));

}

double norminv(const double p)

{

double x,x0=1;

double eps=1e-3;

while(true)

{

x=x0-f_norm(x0,p)/g_norm(x0);

if(fabs(x-x0)<=eps)

{

break;

}

x0=x;

}

return x;

}

//  正态分布的分位数的求解

//

//

//  Gamma分布的分位数的求解

//  计算gamma函数

double gammafun(const double xx)

{

int j;

double x,y,tmp,ser;

const double cof[6]={76.18009172947146,-86.50532032941677,24.01409824083091,

-1.231739572450156,0.1208650973866179e-2,-0.5395239384953e-5};

y=x=xx;

tmp=x+5.5;

tmp=tmp-(x+0.5)*log(tmp);

ser=1.0000000000190015;

for(j=0;j<=5;j++)

{

ser=ser+cof[j]/(++y);

}

return(exp(-tmp+log(2.5066282746310005*ser/x)));

}

//  计算gamma的密度和分布函数

double g_gamma(double x,double alpha,double beta)

{

return(exp(-beta*x)*pow(beta,alpha)*pow(x,alpha-1)/gammafun(alpha));

}

double f_gamma(double x,double alpha,double beta,const double p)

{

//  采用梯形法计算函数

double sum=0.0;

double gaps=(x-0.0)/double(1000);  //每个间隔的长度

for (int i=0;i<1000;i++)

{

sum+=(gaps/2.0)*(g_gamma(0+i*gaps,alpha,beta)+g_gamma(0+(i+1)*gaps,alpha,beta));

}

return sum-p;

}

//  计算分位数函数

double gammainv(double p,const double alpha,const double beta)

{

double eps=1e-3;

double x2;

double x0=2;

while(true)

{

x2=x0-f_gamma(x0,alpha,beta,p)/g_gamma(x0,alpha,beta);

if(fabs(x2-x0)<=eps)

{

break;

}

x0=x2;

}

return x2;

}

//  Gamma分布的分位数的求解

//

//

//  构建一个方差Gamma随机抽样的类

class VarianceGamma

{

private:

//  以下是求解的参数

double Time;

double Variance;

double Skewness;

double Riskless;

double Dividend;

double S0;

double Sigma;

public:

VarianceGamma(double t,double v,double s,double r,double d,double s0,double si):

Time(t),Variance(v),Skewness(s),Riskless(r),Dividend(d),S0(s0),Sigma(si){}

//  以下是一个随机数生成的函数

double VGammaPrice(const double randomNumber)

{

double Omiga=Time/Variance*log(1-Skewness*Variance-Sigma*Sigma*Variance/2);

double alpha=Time/Variance;

double beta=1/Variance;

double a=gammainv(randomNumber,alpha,beta);

double b=a*Skewness+Sigma*sqrt(a)*norminv(randomNumber);

double Sample=S0*exp((Riskless-Dividend)*Time+Omiga+b);

return Sample;

}

};

//

//  最终是主函数

int main()

{

VarianceGamma VG(0.5,0.5,0.1,0,0,100,0.2);

vector Price;

//  输入100个价格和100个随机数

default_random_engine generator;

uniform_real_distribution unif_dis(0,1);

double randomNumber[100];

for(int i=0;i<=99;i++)

{

Price.push_back(VG);

randomNumber[i]=unif_dis(generator);

}

//  输出方差Gamma分布的抽样

for(int i=0;i<=99;i++)

{

cout<

if (i%5==4)

{

cout<

}

}

return 0;

}

matlab dividend,[原创]基于(Matlab/R/C++)的方差Gamma模型(Hull期权期货)随机抽样[by fantuanxiaot]...相关推荐

  1. matlab fts2mat,[原创]基于MATLAB的通达信股价数据的复权处理(fantuanxiaot版本)

    function FT_Candle(hi, lo, cl, op, color, dates, dateform) %%  Modified by fantuanxiaot %%  模仿faruto ...

  2. matlab设计译码器,基于MATLAB的循环码编译码器设计与仿真.doc

    扳昂旨螺冈唉陨裤外狸尿恨铸伸隧刽搅必勒诚天腑皖漂豌鲁靳碑缆键兽峙棘陶宽槐撒层僧袁廖颤渐魄货鼎躬薛扬衍逮西兰迫依煤鲁虐渠惫平合啥昭并屿己笆坍痞庐披吏去凄嘛兄察突徊溅今箩直藩潦咙锨谓崇若制匹扮复淌颐糖嗅你 ...

  3. 「电子万年历matlab仿真」——基于Matlab的电子万年历仿真实现

    「电子万年历matlab仿真」--基于Matlab的电子万年历仿真实现 作为一种具有时间显示.日期查询.闹钟提醒等功能的电子产品,电子万年历已经成为了人们日常生活中不可或缺的一部分.而在现代科技的发展 ...

  4. matlab心电信号处理,基于Matlab的心电信号自动处理系统的设计与开发 毕业论文设计.doc...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspmatlab 基于Matlab的心电信号自动处理系统的设计与开发 ...

  5. 基于matlab的回波,基于MATLAB回波信号产生与消除.doc

    基于MATLAB回波信号产生与消除 摘 要 MATLAB可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其他编程语言的程序等,主要应用于工程计算.控制设计.信号处理与通讯.图像处理.信号 ...

  6. matlab 非线性电感,基于Matlab/Simulink利用动态和静态电感等磁参数建立了一种开关磁阻电机的非线性磁参数模型...

    基于动.静态电感特性的开关磁阻电机非线性磁参数模型 蒋涛 (北京航空航天大学,北京100191) 摘要:基于Matlab/Simulink.利用动态和静态电感等磁参数建立了一种开关磁阻电机的非线性磁参 ...

  7. matlab link offset,基于MATLAB教学型机器人空间轨迹仿真

    基于MATLAB教学型机器人空间轨迹仿真 robotic toolbox for matlab工具箱 1. PUMA560的MATLAB仿真 要建立PUMA560的机器人对象,首先我们要了解PUMA5 ...

  8. matlab异步电机仿真,基于MATLAB的异步电机仿真系统

    科 学 研 究 基于 MATLAB的异步电初I仿真系统 顾亭亭 科学与财富 (南 京航 空航天大学金城 学院,江苏 南京 211156) 摘 要:本文开展了对基于matlab的异步电机仿真系统的研究, ...

  9. matlab求解零输入响应,基于matlab的零输入和零状态响应

    基于matlab的零输入和零状态响应 一. 课程设计题目: 信号系统的时域分析 二.课程设计目的: 1.学习MATLAB 软件的使用. 2.使学生掌握利用工具软件来实现信号系统基本概念.基本原 理的方 ...

最新文章

  1. 普适方案|资管新规落地,资管领域存量市场竞争激烈。专家:得转型(附产品推广)
  2. 0x32.数学知识 - 约数
  3. 建立Lotus Domino CA验证字权威
  4. 关于redis的几件小事(一)redis的使用目的与问题
  5. http协议、模块、express框架以及路由器、中间件和mysql模块
  6. 操作系统设计与实现第3版笔记与minix3心得(4)-操作系统发展历史(2)
  7. 华大 MCU 之七 DMA 导致 SPI 异常停止的原因分析、DMA 配置的那些坑
  8. 【爬虫系列之一】爬虫开发环境的搭建
  9. SAP Spartacus里使用defer的一个例子
  10. [蓝桥杯2018初赛]全球变暖-dfs,bfs,连通块
  11. 编程实现将rdd转换为dataframe:源文件内容如下(_第四篇|Spark Streaming编程指南(1)
  12. 图片素材网站|找素材、提升审美力就靠它了!
  13. 修改docx表格_实例29_在Word表格中将上下行相同内容的单元格自动合并
  14. 希捷扩展PCIe产品组合 推出两款新闪存加速卡
  15. 用户反馈小程序模板源码
  16. Kafka Eagle安装详情及问题解答
  17. 数据分析方法(营销模型篇)--最全的9种分析方法
  18. 高校实验室安全隐患及安全建设-LIMS2
  19. 【已解决】Win 10 切换程序时,默认输入法始终为英文,抓狂,解决办法
  20. 原生JavaScript批量下载文件压缩包

热门文章

  1. c# Invoke和BeginInvoke 区别详解
  2. Qt Creator基本使用方法
  3. VS2010中添加lib库引用
  4. c#中用鼠标点击事件实现抠图
  5. html文件头自动生成,基于infinispan源码包HtmlGenerator代码生成器通过指定头部、标题、底部等进行生成HTML文件...
  6. 信息收集——Web目录扫描
  7. 临时手机验证码_实用网站(一)短信验证码 临时网盘 临时邮箱
  8. AndroidX 方法数限制 Error:Cannot fit requested classes in a single dex file 64K问题
  9. c语言程序能够在不同的操作系统下运行,这说明c语言具有很好的,上海交通大学继续教育学院2012春——程序设计(C)作业1(有答案)...
  10. 怎么在Mac上安装Tomcat 7