1、1一、二叉树模型中的参数估计1.1 二叉树参数估计算法原理想要预测股价二叉树,在知道初始值的前提下,还需要知道模型中的的 u和 d,但对于一支只知道对应于日期的股票价格,我们应该进行怎样的数据处理呢?下面通过实证数据对二叉树模型中的参数进行估计。原理:Hull-White 算法令 ,并用如下公式计算 u 和 d:21p tdui2)(1我们假设:,kkSX101这里 是独立的伯努利随机变量,kX 21/Pr/Pr 11 dSuSkk则我们可以得出 和 的合理估计值为:tut2nkknk SXU111 )/()(其中: )/(1212nkkUnSsU和 是来自实际市场数据 的样本均值和样本方差,
2、我们可2s nS,、 202以得出 和 的估计值为: utsUu则: ttdu11.2 举例应用我选用中国农业银行 2013 年的股票价格,具体数据见附件 1.由表可知, , ,这个二叉树中所用的01986.01986.U058.s和与数据的 相同,公式 u 和 d 可以简化成:tt561420SsU做 4 期二叉树图为:这里的 是一天,我们通过选择更大的时间间隔,令 ,即以一周为t 7t一个时间段,则有:56.0.923)7(1150SsUdu4 期二叉树图变为:3再 令即以半个月为一个时间段,则有:15t1.072)5()1sUu98d6.50S4 期二叉树图又变为:由于该题的 可以改变,
3、时间间隔越长,股价“分叉” 得更快。t二、 几何布朗运动估计与模拟2.1 几何布朗运动参数估计原理令 代表某股票在 时刻的价格,由以下公式给出 S 的模型。)(tStSdBtd其中, 是常量,B 服从布朗运动,而该方程的解就是几何布朗运动。、即:)2/(exp0tStt 其中, 是均值为 0,方差为 t 的正态随机变量,由此得到的就是股价的t几何布朗运动模型。我们将采用修正的股价模型对欧式看涨期权进行定价,在此之前,要对股价模型进行参数估计,即波动率 和漂移率 。假设我们得到了在一段较长时间0, T内的股价数据记录,这段时间由 n 个长度相等的子区间 组成,再假设我们知道每个子区间末的股价,将
4、股价表示t为:Si:第 i 个子区间末的股价样本观测值为 n+1 个;令 表示均值,则:U4niiU1样本方差用 S2 表示,则:212)()(niiS而 U 的观测值的均值为 ,方差为 。t/(2t2即:tU)/(2S2最后算的参数 和 为:及t/2tS/而对于 ,则需要随机产生一系列标准正态分布,通过累加处理获得计算所需tB要的值。也可运用对数正态分布模型,即:2(/)0TWTSe其中, 是一个均值为 0,方差为 T 的随机正态分布变量, 的获取与 相TWTtB仿。2.2 举例应用我选用中国农业银行 2013 年的股票价格,具体数据见附件 2.计算股价,先随机生成均值为 0,方差为 n 的
5、正态分布随机数,而后进t行处理生成预测值,结果如下:而后将预测值与实际值进行比较,得到:5根据图可直观地看出,预测值的波动率比较大,整个曲线趋势很不平稳,因此需要进行修正;于是,再随机生成均值为 0,方差为 1 的标准正态分布随机数,而后进行处理生成预测值,结果如下:而后将预测值与实际值进行比较,得到:6由此可以看出,拟合程度还是很好的,可以用来预测未来几期的股票价格。预测未来两个月的股价,结果如下:三、B-S 模型及多期二叉树的期权定价3.1.B-S 期权定价公式:假设有一股票现价为 ,V 是看涨期权的价格,0S无 风 险 利 率股 价 漂 移 率股 价 波 动 率到 期 时 间执 行 价r
6、XT看涨期权 V 值可表示为: )()(210dNXedSVrT其中:72/011()ln/)()xNxPZedSXrTd21T对于欧式看跌期权的价格 P,可表示为:;012()()rSNdXed3.2 举例应用我选用了 2013 年 11 月 16 日的执行价,而后通过运用 BS 公式及多期二叉树计算期权价格的方式,将实际值与两方法的预测值进行比较,而后进行分析,详细数据见附件 3。计算结果数据:再将预测所得数据与实际值进行拟合比较,得到如下图:从该图主观地看出,三种期权的价格的趋势基本上一致,拟合程度也比较8高,但对来说,BS 的拟合程度更好一点。这样相对来说主观了一点,接着对数据进行再一
7、次的处理分析:最后算的,多期二叉树的预测误差的方差为:0.162756979,而几何布朗运动的预测误差的方差为:0.15752995 ,由此也可以得出,几何布朗运动拟合程度更好一些。四、对冲4.1 做题思路计算对冲,即计算 值, ,而 ,对一1()Nd201ln(/)(/)SXr只股票,在一年的时间里,假设我们每周进行一次对冲,那每周相应的对冲值又该如何计算呢?在解这个题目时,最重要的计算出 的值,在第一周时, 为初始价,但0S0S到了第二周, 有所变动,它的值为: ,而对于0S 2exp(/)TTW,其值等于到期时间周数与总周期数的比值。对于 ,先产生随机数,而后再将它转换为正态分布随机数。
8、4.2 举例应用对于附件 2 里的数据,T=0.51506849,S0=55.56,X=50,sigma=0.20203053, miu=0.724348005,r=0.04, 假设卖出 1000 股股票,在这样的情况下,实现对冲为:9课程小结:对于金融数学这门课程,一个多星期的计算机操作,让我惊叹。突然间才发现,这是一门综合性特别强的学科,才明白自己在某些知识点的掌握上拿捏得不是很好,所以做起来还是有一定的挑战性的,可能在学习理论知识的时候,这样的缺陷不是暴露的特别明显。一开始决定编写 C 语言,是因为自己电脑上安装了这一软件,如果赶不上进度自己可以补一下,最后才发现自己这一举动是那么的正确
9、,因为自己在 C 这方面学的不扎实,下课后,我还不得不窝在电脑前一次次修改程序,不过看到自己的程序可以完美实现的时候,真的真的特别开心, “废寝忘食 ”的程序员生活,稍稍体验了一把,才可以懂得他们为什么会有很大的情绪波动。在做这个课程设计的时候,最麻烦的是计算积分与产生正态分布随机变量,这个涉及到了数值计算方法和概率统计的知识,自然,C 语言是基础,在计算积分的时候,我运用了复合梯形公式,但在 n 的取值上遇到了一点问题,不能很好地把握它的取值。在后面进行分析比较时,我运用了统计预测与决策的相关知识。总的来说,这一个星期真的过的特别充实,懂得了时间的概念。但是时间比较紧张,我们要做的内容又比较
10、多,做的还是不够精细。10附 录源程序如下:欧式看涨期权:#include “stdio.h“#include “stdlib.h“#include “math.h“#define N 200main() int n,k,j;float s0,i,X,u,d,r,q,p,t,w,v;float aNN+1;printf(“请输入初始价 s0:n“); scanf(“%f“,printf(“请输入每期利率 i:n“); scanf(“%f“,printf(“请输入增长因子 u:n“); scanf(“%f“,printf(“请输入下降因子 d:n“);scanf(“%f“,printf(“请输入
11、执行价 X:n“); scanf(“%f“,printf(“请输入期数 n:n“);11scanf(“%d“,r=exp(-i);q=(1/r-d)/(u-d);p=1-q;printf(“股价二叉树为:n“);for(k=0;k=1;j-)w=pow(u,j-1);v=pow(d,n-j+1);akj=s0*w*v;if(anjX)anj=anj-X;else anj=0;printf(“%f “,anj);printf(“n“);for(k=n-1;k=0;k-)for(j=k+1;j=1;j-)akj=r*(p*ak+1j+q*ak+1j+1);printf(“%.6lf “,akj);
12、printf(“n“);printf(“欧式看涨期权定价为: “);printf(“%f n“,a01);12欧式看跌期权:#include “stdio.h“#include “stdlib.h“#include “math.h“#define N 200main() int n,k,j;float s0,i,X,u,d,r,q,p,t, w,v;float aNN+1;printf(“请输入初始价 s0:n“); scanf(“%f“,printf(“请输入每期利率 i:n“); scanf(“%f“,printf(“请输入增长因子 u:n“); scanf(“%f“,printf(“请输
13、入下降因子 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=1;j-)w=pow(u,j-1);v=pow(d,n-j+1);akj=s0*w*v;if(anj=0;k-)for(j=k+1;j=1;j-)akj=r*(p*ak+1j+q*ak+1j+1);printf(“%f “,akj);printf(“n“);printf(“欧式看跌期权定价为: “);p
14、rintf(“%f n“,a01);欧式向上敲出障碍看跌期权:#include “stdio.h“#include “stdlib.h“#include “math.h“#define N 200main() int n,k,j;float s0,i,X,u,d,r,q,p,t,w,v,Q;float aNN+1;printf(“请输入初始价 s0:n“); scanf(“%f“,printf(“请输入每期利率 i:n“); scanf(“%f“,printf(“请输入增长因子 u:n“); scanf(“%f“,printf(“请输入下降因子 d:n“);scanf(“%f“,printf(
15、“请输入执行价 X:n“); scanf(“%f“,printf(“请输入期数 n:n“);scanf(“%d“,printf(“请输入向上敲出障碍期权 Q:n“); scanf(“%f“,14r=exp(-i);q=(1/r-d)/(u-d);p=1-q;printf(“股价二叉树为:n“);for(k=0;k=1;j-)w=pow(u,j-1);v=pow(d,n-j+1);akj=s0*w*v;if(anj=0;k-)for(j=k+1;j=1;j-)if(akj=1;j-)16w=pow(u,j-1);v=pow(d,n-j+1);akj=s0*w*v;if(anjXk-)for(j=
16、k+1;j=1;j-)if(akj=1;j-)w=pow(u,j-1);v=pow(d,n-j+1);akj=s0*w*v;if(anjQ)anj=X-anj;else anj=0;printf(“%f “,anj);printf(“n“);for(k=n-1;k=0;k-)for(j=k+1;j=1;j-)if(akjQ)akj=r*(p*ak+1j+q*ak+1j+1);elseakj=0;printf(“%f “,akj);18printf(“n“);printf(“欧式向下敲出障碍看跌期权定价为: “);printf(“%f n“,a01);欧式向下敲出障碍看涨期权:#include
17、“stdio.h“#include “stdlib.h“#include “math.h“#define N 200main() int n,k,j;float s0,i,X,u,d,r,q,p,t,w,v,Q;float aNN+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(“请输入期数
18、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=1;j-)w=pow(u,j-1);v=pow(d,n-j+1);akj=s0*w*v;if(anjXelse anj=0;printf(“%f “,anj);printf(“n“);for(k=n-1;k=0;k-)for(j=k+1;j=1;j-)if(akjQ)akj=r*(p*ak+1j+q*ak+1j+1);elseakj=0;printf(“%f “,a
19、kj);printf(“n“);printf(“欧式向下敲出障碍看涨期权定价为: “);printf(“%f n“,a01);美式看跌期权:#include “stdio.h“#include “stdlib.h“#include “math.h“#define N 100main() int n,k,j;float s0,i,X,u,d,r,q,p,t,w,v,T;float aNN+1;printf(“请输入初始价 s0:n“); scanf(“%f“,20printf(“请输入每期利率 i:n“); scanf(“%f“,printf(“请输入增长因子 u:n“); scanf(“%f“
20、,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=1;j-)w=pow(u,j-1);v=pow(d,n-j+1);akj=s0*w*v;if(anj=0;k-)for(j=k+1;j=1;j-)T=X-akj;21akj=r*(p*ak+1j+q*ak+1j+1);if(T#include#define d -1000#defi
21、ne pi 3.1415926double 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;k#include#define d -1000#define pi 3.1415926double 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;kn-1;k+)h=(b-a)/n;s1=a+k*h;s2=f(s1)
22、+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“);23scanf(“%lf“,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 的值为:%lfn“,d1);printf(“d2 的值为:%lfn“,d2);printf(“请输入合适划分的等份数 n:n“);scanf(“%d“,v=-s0*N(-d1,d,n)+X*exp(-r*t)*N(-d2,d,n);printf(“欧式看跌期权 BS 价格为:%lfn“,v);return 0;