金融工程计算方法(二)—二叉树法C++代码下载

论坛 期权论坛 期权     
吴宇   2015-12-15 16:45   62034   5



二叉树期权定价模型概述
  Black-Scholes期权定价模型虽然有许多优点, 但是它的推导过程需要具备较高的数学知识才能理解。在1979年, 罗斯等人使用一种比较浅显的方法设计出一种期权的定价模型, 称为二项式模型(Binomial Model)或二叉树法(Binomial tree)。
  二项期权定价模型由考克斯(J.C.Cox)、罗斯(S.A.Ross)、鲁宾斯坦(M.Rubinstein)和夏普(Sharpe)等人提出的一种期权定价模型,主要用于计算美式期权的价值。其优点在于比较直观简单,不需要太多数学知识就可以加以应用。
  二项期权定价模型假设股价波动只有向上和向下两个方向,且假设在整个考察期内,股价每次向上(或向下)波动的概率和幅度不变。模型将考察的存续期分为若干阶段,根据股价的历史波动率模拟出股票在整个存续期内所有可能的发展路径,并对每一路径上的每一节点计算权证行权收益和用贴现法计算出的期权价格。对于美式期权,由于可以提前行权,每一节点上期权的理论价格应为期权行权收益和贴现计算出的权证价格两者较大者。
    构建二项式期权定价模型
    期权定价的核心概念是“风险中性”和“无套利”,在二叉树期权定价中最关键的几个参数是价格上升幅度u和价格下降幅度d,以及价格上升对应的概率pu和价格下降对应的概率pd,参数的选择对实现“风险中性”和“无套利”条件至关重要,细节参见王勇翻译的《期权期货和其他衍生品》p286.
    算法思想:二叉树算法是倒推计算,就是已知现在这一层的n个节点上的值,计算前一层n-1个节点上的值,以此类推,算出最开始的那个点上的值,这个值就是期权价的格。
    假设步数取N,则最后一层共有N+1个节点,这N+1个点上的值对应一个二项分布,实际上我们就是用这一个二项分布来近似期权到期日这一天股票价格的概率分布。于是,定义一个指针call_value,包含N+1个内存空间,存放N+1个价格。下面开始倒推,第一步,将call_value【i】和call_value【i+1】计算出的价格赋值给call_value【i】,这样算出了N个价格;第二步,重复第一步的操作,算出N-1个价格;第三步,重复第一步的操作,算出N-2个价格;······以此类推,直到不能再这样计算下去,此时call_value【0】的值就是期权价格。实际计算中需要用到一些有一定规律的参数,比如贴现系数,可以先将这些参数事先计算出来,用指针数组保存,计算call_value【i】时直接调用,避免重复计算以节省时间。
    可以看出,算法复杂性是O(N^2),并不快。
   程序实现(C++):




#include<iostream>
#include"runtime.h"
using namespace std;
double option_price_put_American_binomial
         (const double &S,
          const double &K,
          const double &sigma,
          const double &r,
          const double &time,
          const int &steps)
{
double* call_value=new double [steps+1];
double* a=new double [steps+1];
double* b=new double [steps+1];
double u=exp(sigma*sqrt(time/steps));
double d=1/u;
double p=(1+r*time/steps-d)/(u-d);
double q=1-p;
double beta=exp(-r*time/steps);
for (int i=0;i<=steps;i++)
{
  a=pow(u,i);
  b=S*pow(d,i);
}
for (int i=0;i<=steps;i++)
  call_value=max(0.0,K-a*b[steps-i]);
for (int i=steps-1;i>=0;i--)
  for (int j=0;j<=i;j++)
   call_value[j]=max(K-a[j]*b[i-j],beta*p*call_value[j+1]+beta*q*call_value[j]);
return call_value[0];
delete[] call_value;
delete[] a;
delete[] b;
}
void main()
{
double S=100;
double X=100;
double r=0.1;
double sigma=0.25;
double time=1;
int steps=2000;
clock_t s=clock();
cout<<"美式看跌期权价格:"\
  <<option_price_put_American_binomial(S,X,sigma,r,time,steps)<<" $"<<endl;
clock_t f=clock();
runtime(f-s);
}

分享到 :
0 人收藏
萍水相逢,尽是他乡之客

5 个回复

倒序浏览
哈哈,学习了
3#
玩红眼不敢吭声  4级常客 | 2017-7-22 12:24:08 发帖IP地址来自 北京
帖子不错
4#
Edwin_z  5级知名  期权比赛第一名 | 2017-7-22 15:34:10 发帖IP地址来自 辽宁大连
谢谢吧主大人哪
5#
Edwin_z  5级知名  期权比赛第一名 | 2017-7-22 15:34:22 发帖IP地址来自 辽宁大连
很有用,谢谢吧主大人
6#
Anonym  3级会员 | 2017-7-27 03:19:01 发帖IP地址来自 美国
有意思啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:38337
帖子:3370
精华:36
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP