楼主: lvlong.cfa
6288 11

[期权交易] 关于美式期权定价C++程序的问题? [推广有奖]

  • 0关注
  • 10粉丝

svip1

已卖:6份资源

讲师

23%

还不是VIP/贵宾

-

威望
0
论坛币
3973 个
通用积分
344.7883
学术水平
31 点
热心指数
27 点
信用等级
29 点
经验
3658 点
帖子
91
精华
1
在线时间
699 小时
注册时间
2011-3-5
最后登录
2024-12-20

楼主
lvlong.cfa 发表于 2014-8-17 14:09:11 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请问各位高手,下面这段支付红利的美式看涨期权的定价程序问题究竟在什么地方,能够编译但是一旦执行就弹出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");
}
二维码

扫码加我 拉你入群

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

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

关键词:美式期权 期权定价 Dividend include double 程序

回帖推荐

志明宝贝 发表于7楼  查看完整内容

楼上说的很对,循环加递归的结构最好不要使用,这种算法结构很有问题。做金工matlab和python都挺好的,matlab有成熟的库支持,python精于计算又不拘泥于平台和软件(关键免费开源),C++的话,如果你打算使用quantlib则可以用之做金工,但是自己从头搭建的话,类结构的搭建按楼主的代码水平……还有待加强

irvingy 发表于6楼  查看完整内容

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

xuruilong100 发表于4楼  查看完整内容

表面上看,问题出在这里 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

xuruilong100 发表于5楼  查看完整内容

学MFE会用matlab和R或python就可以了,感觉用C++太不靠谱

本帖被以下文库推荐

沙发
lvlong.cfa 发表于 2014-8-17 14:10:39
先自己顶一下

藤椅
志明宝贝 发表于 2014-8-17 19:29:23
你的vector越界了,自己debug一下

板凳
xuruilong100 发表于 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);
}
循环+函数递归,不是一种好的算法设计,很可能使计算量爆炸。
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
见路不走 + 5 + 5 精彩帖子
Chemist_MZ + 20 + 20 + 1 + 1 + 1 热心帮助其他会员

总评分: 经验 + 25  论坛币 + 25  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

报纸
xuruilong100 发表于 2014-8-17 19:54:25
学MFE会用matlab和R或python就可以了,感觉用C++太不靠谱

地板
irvingy 发表于 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,不是这样写的
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
见路不走 + 5 + 5 精彩帖子
Chemist_MZ + 10 + 10 + 1 + 1 + 1 热心帮助其他会员

总评分: 经验 + 15  论坛币 + 15  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

7
志明宝贝 发表于 2014-8-17 21:12:01
楼上说的很对,循环加递归的结构最好不要使用,这种算法结构很有问题。做金工matlab和python都挺好的,matlab有成熟的库支持,python精于计算又不拘泥于平台和软件(关键免费开源),C++的话,如果你打算使用quantlib则可以用之做金工,但是自己从头搭建的话,类结构的搭建按楼主的代码水平……还有待加强
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
见路不走 + 5 + 5 精彩帖子
Chemist_MZ + 10 + 10 + 1 + 1 + 1 热心帮助其他会员

总评分: 经验 + 15  论坛币 + 15  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

8
xfx 发表于 2014-8-18 10:36:15
做衍生品定价的话C++还是主流语言。

9
Chemist_MZ 在职认证  发表于 2014-8-18 10:47:46
xfx 发表于 2014-8-18 10:36
做衍生品定价的话C++还是主流语言。
那是developer做产品用的,自己做research什么的matlab,python就ok了。

10
lvlong.cfa 发表于 2014-8-18 16:31:12
志明宝贝 发表于 2014-8-17 21:12
楼上说的很对,循环加递归的结构最好不要使用,这种算法结构很有问题。做金工matlab和python都挺好的,matl ...
多谢大神指点,之前一直用Matlab,这个暑假打算学C++,主要觉得Matlab在处理某些运算时效率太低了

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-1-6 14:19