一、二叉树模型中的参数估计
1.1 二叉树参数估计算法原理
想要预测股价二叉树,在知道初始值的前提下,还需要知道模型中的的u和d,但对于一支只知道对应于日期的股票价格,我们应该进行怎样的数据处理呢?下面通过实证数据对二叉树模型中的参数进行估计。 原理:Hull-White算法
令p1,并用如下公式计算u和d: 2ud1t 2(ii)ud2t(i)我们假设:
S1X1S0Sk1Xk1Sk,
这里Xk是的伯努利随机变量,Pr[Sk/Sk1u]Pr[Sk/Sk1d]则我们可以得出ut和2t的合理估计值为:
1n1nU(Xk1)(Sk/Sk11)
nk1nk11 2其中:
1ns[(Sk/Sk11)2nU2]
n1k12,Sn的样本均值和样本方差,U和s2是来自实际市场数据S0、S1、S2,我们可以
1
得出u和的估计值为:
Ut stu 则:
u1ttd1tt
1.2举例应用
我选用中国农业银行2013年的股票价格,具体数据见附件1.
由表可知,U1.00198610.001986,s0.010568,这个二叉树中所用的
t和与数据的t相同,公式u和d可以简化成:
u1Us1.0125 d1Us0.991418
S055.56做4期二叉树图为:
这里的t是一天,我们通过选择更大的时间间隔,令t7,即以一周为一个时间段,则有:
u1U(7)s(7)1.033215 d1U(7)s(7)0.977293
S055.5期二叉树图变为:
2
再t15令即以半个月为一个时间段,则有:
u1U(15)s(15)1.07072
d1U(15)s(15)0.988858
S055.56
4期二叉树图又变为:
由于该题的t可以改变,时间间隔越长,股价“分叉”得更快。
二、 几何布朗运动估计与模拟
2.1几何布朗运动参数估计原理
令S(t)代表某股票在t时刻的价格,由以下公式给出S的模型。 dSSdtSdB
其中,、是常量,B服从布朗运动,而该方程的解就是几何布朗运动。 即:
StS0exp[Bt(2/2)t]
其中,Bt是均值为0,方差为t的正态随机变量,由此得到的就是股价的几何布朗运动模型。我们将采用修正的股价模型对欧式看涨期权进行定价,在此之前,要对股价模型进行参数估计,即波动率和漂移率。
假设我们得到了在一段较长时间[0, T]内的股价数据记录,这段时间由n个长度相等的子区间t组成,再假设我们知道每个子区间末的股价,将股价表示为:
Si:第i个子区间末的股价 样本观测值为n+1个; 令U表示均值,则:
3
Un样本方差用S2表示,则:
1Ui1ni
S(n1)21(Ui1n2iU)
而U的观测值的均值为(2/2)t,方差为2t。 即:
U(2/2)t
S22t 最后算的参数和为:
US2/2 及S/t
t而对于Bt,则需要随机产生一系列标准正态分布,通过累加处理获得计算所需要的值。
也可运用对数正态分布模型,即:
STS0eWT(2/2)T
其中,WT是一个均值为0,方差为T的随机正态分布变量,WT的获取与Bt相仿。
2.2举例应用
我选用中国农业银行2013年的股票价格,具体数据见附件2.
计算股价,先随机生成均值为0,方差为nt的正态分布随机数,而后进行处理生成预测值,结果如下:
而后将预测值与实际值进行比较,得到:
4
根据图可直观地看出,预测值的波动率比较大,整个曲线趋势很不平稳,因此需要进行修正;于是,再随机生成均值为0,方差为1的标准正态分布随机数,而后进行处理生成预测值,结果如下:
而后将预测值与实际值进行比较,得到:
5
由此可以看出,拟合程度还是很好的,可以用来预测未来几期的股票价格。预测未来两个月的股价,结果如下:
三、B-S模型及多期二叉树的期权定价
3.1.B-S期权定价公式:
假设有一股票现价为S0,V是看涨期权的价格,
X执行价T到期时间
股价波动率股价漂移率r无风险利率
看涨期权V值可表示为:VS0N(d1)XerTN(d2) 其中:
6
1xx2/2N(x)P[Zx]edx2
2ln(S0/X)(r/2)Td1T
d2d1T对于欧式看跌期权的价格P,可表示为:
PS0N(d1)XerTN(d2);
3.2举例应用
我选用了2013年11月16日的执行价,而后通过运用BS公式及多期二叉树计算期权价格的方式,将实际值与两方法的预测值进行比较,而后进行分析,详细数据见附件3。 计算结果数据:
再将预测所得数据与实际值进行拟合比较,得到如下图:
从该图主观地看出,三种期权的价格的趋势基本上一致,拟合程度也比较高,
7
但对来说,BS的拟合程度更好一点。这样相对来说主观了一点,接着对数据进行再一次的处理分析:
最后算的,多期二叉树的预测误差的方差为:0.162756979,而几何布朗运动的预测误差的方差为:0.15752995 ,由此也可以得出,几何布朗运动拟合程度更好一些。
四、对冲
4.1做题思路
计算对冲,即计算值,N(d1),而d1ln(S0/X)(r2/2),对一
只股票,在一年的时间里,假设我们每周进行一次对冲,那每周相应的对冲值又该如何计算呢?
在解这个题目时,最重要的计算出S0的值,在第一周时,S0为初始价,但到了第二周,S0有所变动,它的值为:STS0exp(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] 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] 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]=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] 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]=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] 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]=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]); 20a[k][j]=r*(p*a[k+1][j]+q*a[k+1][j+1]); else
a[n][j]=0;
a[k][j]=r*(p*a[k+1][j]+q*a[k+1][j+1]); else
Copyright © 2019- dcrkj.com 版权所有 赣ICP备2024042791号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务