Я пытаюсь оценить европейские параметры вызова и put на C++, используя трехмерную модель дерева для цен на акции. Мне удалось избавиться от ошибок, но после запуска команд он возвращает nan для цены опциона. Код выглядит следующим образом:Европейские опции, Trinomial Tree, C++
Исходный код для трехчлена дерева:
#include <iostream>
#include <cmath>
using namespace std;
// contructor to initialise the data member by list
TriModel(double S0_, double q_, double sigma_, double R_):S0(S0_),q(q_),sigma(sigma_),R(R_)
{
}
/* member function to work out time interval dt
T maturity of the option, N number of time steps*/
void TriModel::Setdt(double T, int N)
{
T=1;
dt=T/N;
}
// risk-neutral probability of going up
double TriModel::RiskNeutProb_up()
{
double v=R-q-0.5*sigma*sigma;
double dx=sigma*sqrt(3*dt);
return 0.5*((sigma*sigma*dt+v*v*dt*dt)/(dx*dx)+v*dt/dx);
}
// calculate the risk neutual probability of going down
double TriModel::RiskNeutProb_down()
{
double v=R-q-0.5*sigma*sigma;
double dx=sigma*sqrt(3*dt);
return 0.5*((sigma*sigma*dt+v*v*dt*dt)/(dx*dx)-v*dt/dx);
}
// calculate the stock price at time step n and node i
double TriModel::S(int N, int i)
{
double dx=sigma*sqrt(3*dt);
return S0*exp(i*dx);
}
// return the risk free interest rate R
double TriModel::GetR()
{
return R;
}
// return time interval dt
double TriModel::Getdt()
{
return dt;
}
Заголовочный файл для опций:
#ifndef Proj1_Options06_h
#define Proj1_Options06_h
#include "TriModel01.h"
class EurOption
{
private:
int N; //steps to expiry
public:
void SetN(int N_){N=N_;}
int getN(){return N;}
//Payoff defined to return 0.0
//for pedagogical purposes.
//To use a pure virtual function replace by
//virtual double Payoff(double z)=0;
virtual double Payoff(double z){return 0.0;}
//pricing European option by a Trinomial Tree model
// please implement this function in the accompany Options06.cpp file
double PriceByCRR(TriModel Model);
};
class Call: public EurOption
{
private:
double K; //strike price
public:
void SetK(double K_){K=K_;}
int GetInputData();
double Payoff(double z);
};
#endif
Исходный код для опций:
#include "TriModel01.h"
#include "Proj1_Options06.h"
#include <iostream>
#include <cmath>
using namespace std;
double EurOption::PriceByCRR(TriModel Model)
{
double pu=Model.RiskNeutProb_up();
double pd=Model.RiskNeutProb_down();
double pm=1-pu-pd;
double Price[N+1];
for (int i=N; i>=-N;i--)
{
Price[i]=Payoff(Model.S(N,i));
}
for (int n=N-1; n>=0;n--)
{
for (int i=n; i>=-n; i--)
{
Price[i]=(pu*Price[i+1]+pm*Price[i]+pd*Price[i-1])*exp(-Model.GetR()*Model.Getdt());
}
}
return Price[0];
}
int Call::GetInputData()
{
cout << "Enter call option data:" << endl;
int N;
cout << "Enter steps to expiry N: "; cin >> N;
SetN(N);
cout << "Enter strike price K: "; cin >> K;
cout << endl;
return 0;
}
double Call::Payoff(double z)
{
if (z>K) return z-K;
return 0.0;
}
Основная функция:
#include "TriModel01.h"
#include "Proj1_Options06.h"
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double R=0.05;
double q=0.03;
double sigma=0.2;
double S0;
cout << "Enter S0: "; cin >> S0;
cout << endl;
TriModel Model(S0,q,sigma,R);
Call Option1;
Option1.GetInputData();
cout << "European call option price = "
<< Option1.PriceByCRR(Model)
<< endl << endl;
/*Put Option2;
Option2.GetInputData();
cout << "European put option price = "
<< Option2.PriceByCRR(Model)
<< endl << endl;*/
return 0;
}
Любая помощь будет оценена! Спасибо!
Итак, я не уверен, что понимаю этот вопрос. Похоже, вы просто свалили большой кучу кода на коленях и попросили меня отладить его для вас. Наверное, это не то, что ты делаешь, правда? Потому что очевидно, что StackOverflow не является волшебной отладочной машиной. –
1) Этот код не является полным, мы не можем его скомпилировать. 2) Выполнение команд? 3) Что значит «ничего не происходит»? Если вы не дадите нам [минимальный полный пример] (http://sscce.org), у нас не будет большой возможности помочь вам, и если вы не попробуете, мы тоже. – Beta
Почему вы делаете эту причудливую вещь, чтобы оценить европейский вариант? просто используйте черные-scholes. – thang