全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 金融工程(数量金融)与金融衍生品
6217 11
2014-08-17
请问各位高手,下面这段支付红利的美式看涨期权的定价程序问题究竟在什么地方,能够编译但是一旦执行就弹出exe......?
///支付红利的美式看涨期权二叉树定价
#include<math.h>
#include<vector>
#include<iostream>
using namespace std;
///////
double Max(double x, double y)
{
if (x > y)return x; else return y;
}
////开始正式定价程序/////
double usa_call_dividend(const double&s,
const double&x,
const double&r,
const double&sigma,
const double&time,
const int&steps,
const vector<double>&dividend_amounts,
const vector<double>&dividend_times)
{
double dt = time / steps;
double R = exp(r*dt);
double Rinv = 1 / R;
double u = exp(sigma*sqrt(dt));
double d = 1 / u;
double p_up = (R - d) / (u - d);
double p_down = 1 - p_up;
int num_dividend = dividend_amounts.size();
double dividend1 = dividend_amounts[0];
int steps_before_dividend =(int)(dividend_times[0] / time)*steps;
vector<double>temp_amounts(num_dividend - 1);
vector<double>temp_times(num_dividend - 1);
for (int i1 = 0; i1 <( num_dividend - 1); ++i1)
{
  temp_amounts[i1] = dividend_amounts[i1 + 1];
  temp_times[i1] = dividend_times[i1 + 1] - dividend_times[0];
}
vector<double> price(steps_before_dividend + 1);
vector<double> values(steps_before_dividend + 1);
price[0] = pow(d, steps_before_dividend)*s;
for (int i = 1; i <= steps_before_dividend; ++i)
{
  price[i] = u*u*price[i - 1];
}
for (int j = 0; j <= steps_before_dividend; ++j)
{
  double alive_value = usa_call_dividend(price[j] - dividend1, x, r, sigma, time - dividend_times[0], steps - steps_before_dividend, temp_amounts, temp_times);
  values[j] = Max(alive_value, price[j] - x);
}
for (int step = steps_before_dividend - 1; step >= 0; --step)
{
  for (int m = 0; m <= step; ++m)
  {
   price[m] = price[m + 1] * d;
   values[m] = (p_up*values[m + 1] + p_down*values[m])*Rinv;
   values[m] = Max(values[m], price[m] - x);
  }
}
double callprice = values[0];
return callprice;
}
/////求解支付红利的美式看涨期权/////
int main()
{
double s = 100;
double x = 100;
double sigma = 0.25;
double r = 0.1;
double time = 1;
int steps = 100;
vector<double> dividend_times;
dividend_times.push_back(0.25);
dividend_times.push_back(0.75);
vector<double> dividend_amounts;
dividend_amounts.push_back(2.5);
dividend_amounts.push_back(2.5);
double callprice1 = usa_call_dividend(s, x, r, sigma, time, steps, dividend_amounts, dividend_times);
cout << "支付红利的美式看涨期权价格是:" << callprice1<< endl;
system("pause");
}
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-8-17 14:10:39
先自己顶一下
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-8-17 19:29:23
你的vector越界了,自己debug一下
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-8-17 19:52:31
表面上看,问题出在这里
int num_dividend = dividend_amounts.size();
double dividend1 = dividend_amounts[0];
int steps_before_dividend =(int)(dividend_times[0] / time)*steps;应该改为int steps_before_dividend =(int)((dividend_times[0] / time)*steps);否则一直为零。

当dividend_amounts的size=0时,double dividend1 = dividend_amounts[0];发生错误。

算法的整体结构貌似有重大缺陷
for (int j = 0; j <= steps_before_dividend; ++j)
{
  double alive_value = usa_call_dividend(price[j] - dividend1, x, r, sigma, time - dividend_times[0], steps - steps_before_dividend, temp_amounts, temp_times);
  values[j] = Max(alive_value, price[j] - x);
}
循环+函数递归,不是一种好的算法设计,很可能使计算量爆炸。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-8-17 19:54:25
学MFE会用matlab和R或python就可以了,感觉用C++太不靠谱
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-8-17 20:54:25
你那个temp_amounts和temp_times碰到是空的,然后你没检查vector的size就说
double dividend1 = dividend_amounts[0];
int steps_before_dividend =(int)(dividend_times[0] / time)*steps;
看你的意思是non recombining tree,不是这样写的
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群