您好,欢迎来到独旅网。
搜索
您的当前位置:首页金融数学课程论文.

金融数学课程论文.

来源:独旅网


一、二叉树模型中的参数估计

1.1 二叉树参数估计算法原理

想要预测股价二叉树,在知道初始值的前提下,还需要知道模型中的的u和d,但对于一支只知道对应于日期的股票价格,我们应该进行怎样的数据处理呢?下面通过实证数据对二叉树模型中的参数进行估计。 原理:Hull-White算法

令p1,并用如下公式计算u和d: 2ud1t 2(ii)ud2t(i)我们假设:

S1X1S0Sk1Xk1Sk,

这里Xk是的伯努利随机变量,Pr[Sk/Sk1u]Pr[Sk/Sk1d]则我们可以得出ut和2t的合理估计值为:

1n1nU(Xk1)(Sk/Sk11)

nk1nk11 2其中:

1ns[(Sk/Sk11)2nU2]

n1k12,Sn的样本均值和样本方差,U和s2是来自实际市场数据S0、S1、S2,我们可以

1

得出u和的估计值为:

Ut stu 则:

u1ttd1tt

1.2举例应用

我选用中国农业银行2013年的股票价格,具体数据见附件1.

由表可知,U1.00198610.001986,s0.010568,这个二叉树中所用的

t和与数据的t相同,公式u和d可以简化成:

u1Us1.0125 d1Us0.991418

S055.56做4期二叉树图为:

这里的t是一天,我们通过选择更大的时间间隔,令t7,即以一周为一个时间段,则有:

u1U(7)s(7)1.033215 d1U(7)s(7)0.977293

S055.5期二叉树图变为:

2

再t15令即以半个月为一个时间段,则有:

u1U(15)s(15)1.07072

d1U(15)s(15)0.988858

S055.56

4期二叉树图又变为:

由于该题的t可以改变,时间间隔越长,股价“分叉”得更快。

二、 几何布朗运动估计与模拟

2.1几何布朗运动参数估计原理

令S(t)代表某股票在t时刻的价格,由以下公式给出S的模型。 dSSdtSdB

其中,、是常量,B服从布朗运动,而该方程的解就是几何布朗运动。 即:

StS0exp[Bt(2/2)t]

其中,Bt是均值为0,方差为t的正态随机变量,由此得到的就是股价的几何布朗运动模型。我们将采用修正的股价模型对欧式看涨期权进行定价,在此之前,要对股价模型进行参数估计,即波动率和漂移率。

假设我们得到了在一段较长时间[0, T]内的股价数据记录,这段时间由n个长度相等的子区间t组成,再假设我们知道每个子区间末的股价,将股价表示为:

Si:第i个子区间末的股价 样本观测值为n+1个; 令U表示均值,则:

3

Un样本方差用S2表示,则:

1Ui1ni

S(n1)21(Ui1n2iU)

而U的观测值的均值为(2/2)t,方差为2t。 即:

U(2/2)t

S22t 最后算的参数和为:

US2/2 及S/t

t而对于Bt,则需要随机产生一系列标准正态分布,通过累加处理获得计算所需要的值。

也可运用对数正态分布模型,即:

STS0eWT(2/2)T

其中,WT是一个均值为0,方差为T的随机正态分布变量,WT的获取与Bt相仿。

2.2举例应用

我选用中国农业银行2013年的股票价格,具体数据见附件2.

计算股价,先随机生成均值为0,方差为nt的正态分布随机数,而后进行处理生成预测值,结果如下:

而后将预测值与实际值进行比较,得到:

4

根据图可直观地看出,预测值的波动率比较大,整个曲线趋势很不平稳,因此需要进行修正;于是,再随机生成均值为0,方差为1的标准正态分布随机数,而后进行处理生成预测值,结果如下:

而后将预测值与实际值进行比较,得到:

5

由此可以看出,拟合程度还是很好的,可以用来预测未来几期的股票价格。预测未来两个月的股价,结果如下:

三、B-S模型及多期二叉树的期权定价

3.1.B-S期权定价公式:

假设有一股票现价为S0,V是看涨期权的价格,

X执行价T到期时间

股价波动率股价漂移率r无风险利率

看涨期权V值可表示为:VS0N(d1)XerTN(d2) 其中:

6

1xx2/2N(x)P[Zx]edx2

2ln(S0/X)(r/2)Td1T

d2d1T对于欧式看跌期权的价格P,可表示为:

PS0N(d1)XerTN(d2);

3.2举例应用

我选用了2013年11月16日的执行价,而后通过运用BS公式及多期二叉树计算期权价格的方式,将实际值与两方法的预测值进行比较,而后进行分析,详细数据见附件3。 计算结果数据:

再将预测所得数据与实际值进行拟合比较,得到如下图:

从该图主观地看出,三种期权的价格的趋势基本上一致,拟合程度也比较高,

7

但对来说,BS的拟合程度更好一点。这样相对来说主观了一点,接着对数据进行再一次的处理分析:

最后算的,多期二叉树的预测误差的方差为:0.162756979,而几何布朗运动的预测误差的方差为:0.15752995 ,由此也可以得出,几何布朗运动拟合程度更好一些。

四、对冲

4.1做题思路

计算对冲,即计算值,N(d1),而d1ln(S0/X)(r2/2),对一

只股票,在一年的时间里,假设我们每周进行一次对冲,那每周相应的对冲值又该如何计算呢?

在解这个题目时,最重要的计算出S0的值,在第一周时,S0为初始价,但到了第二周,S0有所变动,它的值为:STS0exp(WT(2/2)T),而对于,其值等于到期时间周数与总周期数的比值。对于WT,先产生随机数,而后再将它转换为正态分布随机数。

4.2举例应用

对于附件2里的数据,T=0.51506849,S0=55.56,X=50,sigma=0.20203053, miu=0.724348005,r=0.04, 假设卖出1000股股票,在这样的情况下,实现对冲为:

8

课程小结:

对于金融数学这门课程,一个多星期的计算机操作,让我惊叹。突然间才发现,这是一门综合性特别强的学科,才明白自己在某些知识点的掌握上拿捏得不是很好,所以做起来还是有一定的挑战性的,可能在学习理论知识的时候,这样的缺陷不是暴露的特别明显。一开始决定编写C语言,是因为自己电脑上安装了这一软件,如果赶不上进度自己可以补一下,最后才发现自己这一举动是那么的正确,因为自己在C这方面学的不扎实,下课后,我还不得不窝在电脑前一次次修改程序,不过看到自己的程序可以完美实现的时候,真的真的特别开心,“废寝忘食”的程序员生活,稍稍体验了一把,才可以懂得他们为什么会有很大的情绪波动。在做这个课程设计的时候,最麻烦的是计算积分与产生正态分布随机变量,这个涉及到了数值计算方法和概率统计的知识,自然,C语言是基础,在计算积分的时候,我运用了复合梯形公式,但在n的取值上遇到了一点问题,不能很好地把握它的取值。在后面进行分析比较时,我运用了统计预测与决策的相关知识。总的来说,这一个星期真的过的特别充实,懂得了时间的概念。但是时间比较紧张,我们要做的内容又比较多,做的还是不够精细。

9

源程序如下: 欧式看涨期权: #include \"stdio.h\" #include \"stdlib.h\" #include \"math.h\" #define N 200 main()

{ int n,k,j;

float s0,i,X,u,d,r,q,p,t,w,v; float a[N][N+1];

printf(\"请输入初始价s0:\\n\"); scanf(\"%f\

printf(\"请输入每期利率i:\\n\"); scanf(\"%f\

printf(\"请输入增长因子u:\\n\"); scanf(\"%f\

printf(\"请输入下降因子d:\\n\"); scanf(\"%f\

printf(\"请输入执行价X:\\n\"); scanf(\"%f\

printf(\"请输入期数n:\\n\"); scanf(\"%d\

录10

r=exp(-i);

q=(1/r-d)/(u-d); p=1-q;

printf(\"股价二叉树为:\\n\"); for(k=0;k<=n;k++) {

for(j=1;j<=k+1;j++) {

w=pow(u,j-1); v=pow(d,k-j+1); a[k][j]=s0*w*v;

printf(\"%.6lf \ }

printf(\"\\n\"); }

printf(\"期权二叉树为:\\n\"); {

for(j=n+1;j>=1;j--) {

w=pow(u,j-1); v=pow(d,n-j+1); a[k][j]=s0*w*v; if(a[n][j]>X)

a[n][j]=a[n][j]-X; else

a[n][j]=0;

printf(\"%f \ }

printf(\"\\n\");

for(k=n-1;k>=0;k--) {

for(j=k+1;j>=1;j--) {

a[k][j]=r*(p*a[k+1][j]+q*a[k+1][j+1]); printf(\"%.6lf \ }

printf(\"\\n\"); }

printf(\"欧式看涨期权定价为: \"); printf(\"%f \\n\ } }

欧式看跌期权:

11

#include \"stdio.h\" #include \"stdlib.h\" #include \"math.h\" #define N 200 main()

{ int n,k,j;

float s0,i,X,u,d,r,q,p,t, w,v; float a[N][N+1];

printf(\"请输入初始价s0:\\n\"); scanf(\"%f\

printf(\"请输入每期利率i:\\n\"); scanf(\"%f\

printf(\"请输入增长因子u:\\n\"); scanf(\"%f\

printf(\"请输入下降因子d:\\n\"); scanf(\"%f\

printf(\"请输入执行价X:\\n\"); scanf(\"%f\

printf(\"请输入期数n:\\n\"); scanf(\"%d\ r=exp(-i);

q=(1/r-d)/(u-d); p=1-q;

printf(\"股价二叉树为:\\n\"); for(k=0;k<=n;k++) {

for(j=1;j<=k+1;j++) {

w=pow(u,j-1); v=pow(d,k-j+1); a[k][j]=s0*w*v; printf(\"%f \ }

printf(\"\\n\"); }

printf(\"期权二叉树为:\\n\"); {

for(j=n+1;j>=1;j--) {

w=pow(u,j-1); v=pow(d,n-j+1); a[k][j]=s0*w*v; if(a[n][j]a[n][j]=X-a[n][j];

12

else

a[n][j]=0;

printf(\"%f \ }

printf(\"\\n\");

for(k=n-1;k>=0;k--) {

for(j=k+1;j>=1;j--) {

a[k][j]=r*(p*a[k+1][j]+q*a[k+1][j+1]); printf(\"%f \ }

printf(\"\\n\"); }

printf(\"欧式看跌期权定价为: \"); printf(\"%f \\n\ } }

欧式向上敲出障碍看跌期权: #include \"stdio.h\" #include \"stdlib.h\" #include \"math.h\" #define N 200 main()

{ int n,k,j;

float s0,i,X,u,d,r,q,p,t,w,v,Q; float a[N][N+1];

printf(\"请输入初始价s0:\\n\"); scanf(\"%f\

printf(\"请输入每期利率i:\\n\"); scanf(\"%f\

printf(\"请输入增长因子u:\\n\"); scanf(\"%f\

printf(\"请输入下降因子d:\\n\"); scanf(\"%f\

printf(\"请输入执行价X:\\n\"); scanf(\"%f\

printf(\"请输入期数n:\\n\"); scanf(\"%d\

printf(\"请输入向上敲出障碍期权Q:\\n\"); scanf(\"%f\ r=exp(-i);

13

q=(1/r-d)/(u-d); p=1-q;

printf(\"股价二叉树为:\\n\"); for(k=0;k<=n;k++) {

for(j=1;j<=k+1;j++) {

w=pow(u,j-1); v=pow(d,k-j+1); a[k][j]=s0*w*v; printf(\"%f \ }

printf(\"\\n\"); }

printf(\"期权二叉树为:\\n\"); {

for(j=n+1;j>=1;j--) {

w=pow(u,j-1); v=pow(d,n-j+1); a[k][j]=s0*w*v;

if(a[n][j]a[n][j]=0;

printf(\"%f \ }

printf(\"\\n\");

for(k=n-1;k>=0;k--) {

for(j=k+1;j>=1;j--) {

if(a[k][j]a[k][j]=r*(p*a[k+1][j]+q*a[k+1][j+1]); else

a[k][j]=0;

printf(\"%f \ }

printf(\"\\n\"); }

printf(\"欧式向上敲出障碍看跌期权定价为: \"); printf(\"%f \\n\ } }

14

欧式向上敲出障碍看涨期权: #include \"stdio.h\" #include \"stdlib.h\" #include \"math.h\" #define N 200 main()

{ int n,k,j;

float s0,i,X,u,d,r,q,p,t,w,v,Q; float a[N][N+1];

printf(\"请输入初始价s0:\\n\"); scanf(\"%f\

printf(\"请输入每期利率i:\\n\"); scanf(\"%f\

printf(\"请输入增长因子u:\\n\"); scanf(\"%f\

printf(\"请输入下降因子d:\\n\"); scanf(\"%f\

printf(\"请输入执行价X:\\n\"); scanf(\"%f\

printf(\"请输入期数n:\\n\"); scanf(\"%d\

printf(\"请输入向上敲出障碍期权Q:\\n\"); scanf(\"%f\ r=exp(-i);

q=(1/r-d)/(u-d); p=1-q;

printf(\"股价二叉树为:\\n\"); for(k=0;k<=n;k++) {

for(j=1;j<=k+1;j++) {

w=pow(u,j-1); v=pow(d,k-j+1); a[k][j]=s0*w*v; printf(\"%f \ }

printf(\"\\n\"); }

printf(\"期权二叉树为:\\n\"); {

for(j=n+1;j>=1;j--) {

w=pow(u,j-1);

15

v=pow(d,n-j+1); a[k][j]=s0*w*v;

if(a[n][j]>X&&a[n][j]a[n][j]=0;

printf(\"%f \ }

printf(\"\\n\");

for(k=n-1;k>=0;k--) {

for(j=k+1;j>=1;j--) {

if(a[k][j]a[k][j]=r*(p*a[k+1][j]+q*a[k+1][j+1]); else

a[k][j]=0;

printf(\"%f \ }

printf(\"\\n\"); }

printf(\"欧式向上敲出障碍看涨期权定价为: \"); printf(\"%f \\n\ } }

欧式向下敲出障碍看跌期权: #include \"stdio.h\" #include \"stdlib.h\" #include \"math.h\" #define N 200 main()

{ int n,k,j;

float s0,i,X,u,d,r,q,p,t,w,v,Q; float a[N][N+1];

printf(\"请输入初始价s0:\\n\"); scanf(\"%f\

printf(\"请输入每期利率i:\\n\"); scanf(\"%f\

printf(\"请输入增长因子u:\\n\"); scanf(\"%f\

printf(\"请输入下降因子d:\\n\"); scanf(\"%f\

printf(\"请输入执行价X:\\n\");

16

scanf(\"%f\

printf(\"请输入期数n:\\n\"); scanf(\"%d\

printf(\"请输入向下敲出障碍期权Q:\\n\"); scanf(\"%f\ r=exp(-i);

q=(1/r-d)/(u-d); p=1-q;

printf(\"股价二叉树为:\\n\"); for(k=0;k<=n;k++) {

for(j=1;j<=k+1;j++) {

w=pow(u,j-1); v=pow(d,k-j+1); a[k][j]=s0*w*v; printf(\"%f \ }

printf(\"\\n\"); }

printf(\"期权二叉树为:\\n\"); {

for(j=n+1;j>=1;j--) {

w=pow(u,j-1); v=pow(d,n-j+1); a[k][j]=s0*w*v;

if(a[n][j]Q) a[n][j]=X-a[n][j]; else

a[n][j]=0;

printf(\"%f \ }

printf(\"\\n\");

for(k=n-1;k>=0;k--) {

for(j=k+1;j>=1;j--) {

if(a[k][j]>Q)

a[k][j]=r*(p*a[k+1][j]+q*a[k+1][j+1]); else

a[k][j]=0;

printf(\"%f \ }

17

printf(\"\\n\"); }

printf(\"欧式向下敲出障碍看跌期权定价为: \"); printf(\"%f \\n\ } }

欧式向下敲出障碍看涨期权: #include \"stdio.h\" #include \"stdlib.h\" #include \"math.h\" #define N 200 main()

{ int n,k,j;

float s0,i,X,u,d,r,q,p,t,w,v,Q; float a[N][N+1];

printf(\"请输入初始价s0:\\n\"); scanf(\"%f\

printf(\"请输入每期利率i:\\n\"); scanf(\"%f\

printf(\"请输入增长因子u:\\n\"); scanf(\"%f\

printf(\"请输入下降因子d:\\n\"); scanf(\"%f\

printf(\"请输入执行价X:\\n\"); scanf(\"%f\

printf(\"请输入期数n:\\n\"); scanf(\"%d\

printf(\"请输入向下敲出障碍期权Q:\\n\"); scanf(\"%f\ r=exp(-i);

q=(1/r-d)/(u-d); p=1-q;

printf(\"股价二叉树为:\\n\"); for(k=0;k<=n;k++) {

for(j=1;j<=k+1;j++) {

w=pow(u,j-1); v=pow(d,k-j+1); a[k][j]=s0*w*v; printf(\"%f \ }

printf(\"\\n\");

18

}

printf(\"期权二叉树为:\\n\"); {

for(j=n+1;j>=1;j--) {

w=pow(u,j-1); v=pow(d,n-j+1); a[k][j]=s0*w*v;

if(a[n][j]>X&&a[n][j]>Q) a[n][j]=a[n][j]-X; else

a[n][j]=0;

printf(\"%f \ }

printf(\"\\n\");

for(k=n-1;k>=0;k--) {

for(j=k+1;j>=1;j--) {

if(a[k][j]>Q)

a[k][j]=r*(p*a[k+1][j]+q*a[k+1][j+1]); else

a[k][j]=0;

printf(\"%f \ }

printf(\"\\n\"); }

printf(\"欧式向下敲出障碍看涨期权定价为: \"); printf(\"%f \\n\ } }

美式看跌期权: #include \"stdio.h\" #include \"stdlib.h\" #include \"math.h\" #define N 100 main()

{ int n,k,j;

float s0,i,X,u,d,r,q,p,t,w,v,T; float a[N][N+1];

printf(\"请输入初始价s0:\\n\"); scanf(\"%f\

printf(\"请输入每期利率i:\\n\");

19

scanf(\"%f\

printf(\"请输入增长因子u:\\n\"); scanf(\"%f\

printf(\"请输入下降因子d:\\n\"); scanf(\"%f\

printf(\"请输入执行价X:\\n\"); scanf(\"%f\

printf(\"请输入期数n:\\n\"); scanf(\"%d\ r=exp(-i);

q=(1/r-d)/(u-d); p=1-q;

printf(\"股价二叉树为:\\n\"); for(k=0;k<=n;k++) {

for(j=1;j<=k+1;j++) {

w=pow(u,j-1); v=pow(d,k-j+1); a[k][j]=s0*w*v; printf(\"%f \ }

printf(\"\\n\"); }

printf(\"期权二叉树为:\\n\"); {

for(j=n+1;j>=1;j--) {

w=pow(u,j-1); v=pow(d,n-j+1); a[k][j]=s0*w*v; if(a[n][j]a[n][j]=X-a[n][j]; else

a[n][j]=0;

printf(\"%f \ }

printf(\"\\n\");

for(k=n-1;k>=0;k--) {

for(j=k+1;j>=1;j--) {

T=X-a[k][j];

a[k][j]=r*(p*a[k+1][j]+q*a[k+1][j+1]);

20

if(Ta[k][j]=T;

printf(\"%f \ }

printf(\"\\n\"); }

printf(\"美式看跌期权定价为: \"); printf(\"%f \\n\ } }

欧式看涨期权BS价格: #include #include #define d -1000

#define pi 3.1415926 double f(double x) {

return exp(-x*x/2); }

double N(double b,double a,int n) {

double h,s1,s,s2=0; int k;

for(k=1;kh=(b-a)/n; s1=a+k*h; s2=f(s1)+s2; }

s=1/sqrt(2*pi)*h/2*(f(a)+2*s2+f(b)); return (s); }

main() {

double s0,X,t,p,r,d1,d2,v; int n;

printf(\"请输入股票初始价格s0:\\n\"); scanf(\"%lf\

printf(\"请输入执行价X:\\n\"); scanf(\"%lf\

printf(\"请输入以年为单位的到期时间t:\\n\");

21

scanf(\"%lf\

printf(\"请输入波动率p:\\n\"); scanf(\"%lf\

printf(\"请输入无风险利率r:\\n\"); scanf(\"%lf\

d1=(log(s0/X)+(r+p*p/2)*t)/(pow(t,0.5)*p); d2=d1-p*pow(t,0.5);

printf(\"d1的值为:%lf\\n\ printf(\"d2的值为:%lf\\n\

printf(\"请输入合适划分的等份数n:\\n\"); scanf(\"%d\

v=s0*N(d1,d,n)-X*exp(-r*t)*N(d2,d,n);

printf(\"欧式看涨期权BS价格为:%lf\\n\ return 0; }

欧式看跌期权BS价格: #include #include #define d -1000

#define pi 3.1415926 double f(double x) {

return exp(-x*x/2); }

double N(double b,double a,int n) {

double h,s1,s,s2=0; int k;

for(k=1;kh=(b-a)/n; s1=a+k*h; s2=f(s1)+s2; }

s=1/sqrt(2*pi)*h/2*(f(a)+2*s2+f(b)); return (s); }

main() {

double s0,X,t,p,r,d1,d2,v; int n;

printf(\"请输入股票初始价格s0:\\n\"); scanf(\"%lf\

22

printf(\"请输入执行价X:\\n\"); scanf(\"%lf\

printf(\"请输入以年为单位的到期时间t:\\n\"); scanf(\"%lf\

printf(\"请输入波动率p:\\n\"); scanf(\"%lf\

printf(\"请输入无风险利率r:\\n\"); scanf(\"%lf\

d1=(log(s0/X)+(r+p*p/2)*t)/(pow(t,0.5)*p); d2=d1-p*pow(t,0.5);

printf(\"d1的值为:%lf\\n\ printf(\"d2的值为:%lf\\n\

printf(\"请输入合适划分的等份数n:\\n\"); scanf(\"%d\

v=-s0*N(-d1,d,n)+X*exp(-r*t)*N(-d2,d,n); printf(\"欧式看跌期权BS价格为:%lf\\n\ return 0; }

23

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- dcrkj.com 版权所有 赣ICP备2024042791号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务