金融工程与并行计算:第四章 R进阶功能与使用RdotNet Part 3-经管之家官网!

人大经济论坛-经管之家 收藏本站
您当前的位置> 金融>>

金融工程

>>

金融工程与并行计算:第四章 R进阶功能与使用RdotNet Part 3

金融工程与并行计算:第四章 R进阶功能与使用RdotNet Part 3

发布:andydong1209 | 分类:金融工程

关于本站

人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!

经管之家新媒体交易平台

提供"微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯"等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

提供微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

第五节R语言的仿真实作下面为以R撰写的Black-Scholes程序下,阳春型选择权的仿真程序。NPath=1024;MStep=365;dt=1.0/365.0;S0=100.0;#SpotpriceK=100.0;#StrikepriceTTM=1.0;#Maturitysigma=0.3;#Hestonparameter:vo ...
扫码加入金融交流群


第五节 R语言的仿真实作


下面为以R撰写的Black-Scholes程序下,阳春型选择权的仿真程序。


NPath = 1024;

MStep = 365;

dt = 1.0/365.0;

S0 = 100.0; # Spot price

K = 100.0; # Strike price

TTM = 1.0; # Maturity

sigma = 0.3; # Heston parameter : volatility of variance

r = 0.08; # Risk free rate

q = 0.04; # Dividend yield


drift = ((r-q)-(sigma*sigma)/2.0)*dt;

volterm = sigma*sqrt(dt);

VST = numeric(NPath);

VCT = numeric(NPath);

VPT = numeric(NPath);


set.seed(1234);

for(i in 1:NPath)

{

St= S0;

for(j in 1:MStep)

{

n = rnorm(1);

St = St*exp(drift+volterm*n);

}

VST = St;

VCT = max(St-K, 0.0);

VPT = max(K-St, 0.0);

}


CallValue = mean(VCT)*exp(-r*TTM);

PutValue = mean(VPT)*exp(-r*TTM);

print(CallValue);

print(PutValue);

程序4.5.1(BSSimulation.R)


输出结果为,

> print(CallValue);

[1] 13.77969

> print(PutValue);

[1] 9.128698


圖4.5.1



第六节 R与C语言的沟通


使用R、Python或是Matlab这类解译式的语言,一个很大的问题是执行效率不高,通常,C是首选的语言,一方面C的执行效能高,另一方面C在计算器的领域已是市场的标准。在执行模拟法中,有效产生大量高质量的随机数,是一个很大的计算负荷,因此我们打算以C语言撰写MT的链接库,再由R来呼叫,产生需要的大量随机数,以加快模拟的效能。此范例使用VisualStudio 2010做为开发工具。


一、使用Visual Studio 产生动态链接库(DLL)

圖4.6.1


首先,以新增项目的方式,产生RUseDLL方案以及MTDLL项目。选取Win32控制台应用程序。按确定,出现Win32应用程序精灵。按下一步。


圖4.6.2


圖4.6.3


在Win32应用程序精灵中,应用程序类型选取DLL,其他选项选取空项目。


在项目中加入原始程序文件,MT19937.cpp。

圖4.6.4


查阅项目属性,组态类型为动态链接库(.dll)。

圖4.6.5


在C/C++的一般页面中,其他Include目标要含入R的程序开发所需的文件头,此目录是安装R时的设定。

圖4.6.6


二、MT程序代码

#001 //*******************************************************************

#002 #include <R.h>

#003

#004 /* Periodparameters */

#005 #define N 624

#006 #define M 397

#007 #define MATRIX_A0x9908b0dfUL /*constant vector a */

#008 #define UPPER_MASK0x80000000UL /* most significant w-r bits */

#009 #define LOWER_MASK0x7fffffffUL /* least significant r bits */

#010

#011 static unsigned long mt[N]; /* the array for the state vector*/

#012 static int mti=N+1; /* mti==N+1means mt[N] is not initialized */

#013

#014//*******************************************************************

#015 extern "C" __declspec(dllexport)

#016 /*initializes mt[N] with a seed */

#017 voidinit_genrand(unsigned longs)

#018 {

#019 mt[0]= s & 0xffffffffUL;

#020 for(mti=1; mti<N; mti++) {

#021 mt[mti] =

#022 (1812433253UL * (mt[mti-1] ^ (mt[mti-1]>> 30)) + mti);

#023 /* See KnuthTAOCP Vol2. 3rd Ed. P.106 for multiplier. */

#024 /* In theprevious versions, MSBs of the seed affect*/

#025 /* only MSBs of the array mt[]. */

#026 /*2002/01/09 modified by Makoto Matsumoto */

#027 mt[mti] &= 0xffffffffUL;

#028 /* for>32 bit machines */

#029 }

#030 }

#031

#032 /* initializeby an array with array-length */

#033 /* init_keyis the array for initializing keys */

#034 /* key_lengthis its length */

#035 /* slightchange for C++, 2004/2/26 */

#036 void init_by_array(unsigned longinit_key[], int key_length)

#037 {

#038 int i, j,k;

#039 init_genrand(19650218UL);

#040 i=1; j=0;

#041 k = (N>key_length ? N : key_length);

#042 for (; k;k--) {

#043 mt = (mt ^ ((mt[i-1] ^ (mt[i-1]>> 30)) * 1664525UL))

#044 + init_key[j] + j; /* non linear */

#045 mt &= 0xffffffffUL; /* for WORDSIZE > 32 machines */

#046 i++; j++;

#047 if(i>=N) { mt[0] = mt[N-1]; i=1; }

#048 if(j>=key_length) j=0;

#049 }

#050 for(k=N-1; k; k--) {

#051 mt = (mt ^ ((mt[i-1] ^ (mt[i-1]>> 30)) * 1566083941UL))

#052 - i; /*non linear */

#053 mt &= 0xffffffffUL; /* for WORDSIZE > 32 machines */

#054 i++;

#055 if(i>=N) { mt[0] = mt[N-1]; i=1; }

#056 }

#057

#058 mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */

#059 }

#060

#061 /* generatesa random number on [0,0xffffffff]-interval */

#062 unsigned long genrand_int32(void)

#063 {

#064 unsigned long y;

#065 static unsigned longmag01[2]={0x0UL, MATRIX_A};

#066 /* mag01[x] = x* MATRIX_Afor x=0,1 */

#067

#090 /* Tempering */

#091 y ^= (y >> 11);

#092 y ^= (y << 7) & 0x9d2c5680UL;

#093 y ^= (y << 15) & 0xefc60000UL;

#094 y ^= (y >> 18);

#095

#096 return y;

#097 }


.............................


#134

#135//*******************************************************************

#136 extern "C" __declspec(dllexport)

#137 // These realversions are due to Isaku Wada, 2002/01/09 added

#138 voidgenerate(int* dim, double*result)

#139 {

#140 unsigned long a, b;

#141 for(int i=0; i<*dim; i++)

#142 {

#143 a=genrand_int32()>>5, b=genrand_int32()>>6;

#144 *(result+i) = (a*67108864.0+b)*(1.0/9007199254740992.0);

#145 }

#146 }

程序行表4.6.1


在MT19937.cpp中输入列表4.1程序代码。#002先把R的挡头含入。#015的宣告extern "C" __declspec(dllexport),是针对#017 voidinit_genrand(unsigned longs)。由于CPP的编译程序会对函数做复杂的修饰,为了要使R认的此函数,我们要告知编译程序要以C语言的格式产出此函数的链接库。#136的宣告 extern "C" __declspec(dllexport)也是针对#138 void generate(int* dim, double*result)同样的作用。如此,我们便可在R中,引用这两个函数。读者如果需要由R中呼叫其他函数,也可类似处理。

建置此项目,输出结果如下。其中MTDLL.dll是R要引用的链接库。将其拷贝的R的工作目录,D:\RProjects下,以备R的呼叫使用。

圖4.6.7



R的工作目录,D:\RProjects下的内容。

圖4.6.8


三、R使用DLL

#005 > setwd("D:\\RProjects")

#006 > dyn.load("MTDLL.dll")

#007 > seed = 1234

#008 > dim = 1024

#009 > .C("init_genrand", as.integer(seed))

#010 [[1]]

#011 [1] 1234

#012

#013 > Res <- .C("generate", as.integer(dim), result =double(dim))

#014 > Res

#015 [[1]]

#016 [1] 1024

#017

#018 $result

#019 [1] 0.9981249604 0.42447415090.5900033008 0.4061420923 0.3762355761 0.4631217649 0.8263664039

#020 [8] 0.1999571176 0.31256047810.6980994841 0.5451827569 0.7955019851 0.8777663181 0.5317340976

#021

#022

#023

#026 [1016] 0.0050764715 0.77529226810.2824727317 0.0860086472 0.2160509267 0.1308943564 0.2769393093

#027 [1023] 0.3684407598 0.5566065340

#028

#029 > v1 = Res[[1]]

#030 > v2 = Res[[2]]

#031 > mean(v2)

#032 [1] 0.498358

#033 > var(v2)

#034 [1] 0.08669075

#035 > dyn.unload("MTDLL.dll")

程序行表4.6.2


在R的交谈环境中输入程序行表4.2,#005设定工作目录到D:\RProjects。注意#005setwd(“D:\\RProjects”)中的双斜线,这是控制程序中跳脱字符的方式。#006动态加载MTDLL.dll链接库。#009呼叫init_genrand(intseed)函数。#013呼叫generate(int dims, double* result)函数,并将结果传回给 Res。#014显示Res的内容,一共有1024个均等分布[0, 1)随机数。Res为一个列表的数据结构,内有两个成分。第一个成分为dims,第二个成分为result。#029将dims传给v1,#030将result传给v2。#031与#033分别计算v2的平均数与变异数。


「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
本文关键词:

本文论坛网址:https://bbs.pinggu.org/thread-6508195-1-1.html

人气文章

1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。