2014-01-15 4 views
-1

Я пытаюсь оценить европейские параметры вызова и 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; 
} 

Любая помощь будет оценена! Спасибо!

+2

Итак, я не уверен, что понимаю этот вопрос. Похоже, вы просто свалили большой кучу кода на коленях и попросили меня отладить его для вас. Наверное, это не то, что ты делаешь, правда? Потому что очевидно, что StackOverflow не является волшебной отладочной машиной. –

+0

1) Этот код не является полным, мы не можем его скомпилировать. 2) Выполнение команд? 3) Что значит «ничего не происходит»? Если вы не дадите нам [минимальный полный пример] (http://sscce.org), у нас не будет большой возможности помочь вам, и если вы не попробуете, мы тоже. – Beta

+0

Почему вы делаете эту причудливую вещь, чтобы оценить европейский вариант? просто используйте черные-scholes. – thang

ответ

1

В PriceByCRR у вас есть пара ошибок, вы пишете отрицательный индекс в массиве Price, и вы будете вызывать повреждение памяти.

for (int i=-N; i<=N;i++) 
{ 
    Price[i]=Payoff(Model.S(N,i)); 
} 

И в следующий цикл вы имеете другую ошибку, здесь вы настраиваете п до N-1, а затем добавить к нему 1 в шаге итерации для цикла.

for (int n=N-1; n>=0;n++) 

Это только первые две ошибки, которые я видел ... есть еще два, что я заметил только взглянув на это, но я оставлю это для вас, чтобы выяснить.