#include "binomial.h" #include #include BinomialTree::BinomialTree(long double price, long double vol, int _n, long double _tstep) : n(_n), S(price), volatility(vol), tstep(_tstep) { tfin = n * tstep; upfactor = exp(volatility*sqrt(tstep)); tree = new BinomialTree::Node * [n]; for( int i = 0; i < n; i++ ) tree[i] = new BinomialTree::Node [i+1] ; tree[0][0].price = S; tree[0][0].time = 0.0; long double currtime = 0.0; for( int i = 1; i < n; i++ ) { BinomialTree::Node * currnode = tree[i]; currtime += tstep; for( int j = 0; j <= i; j++, currnode++ ) { // the node at ith level and jlocation from the bottom // is highnode of i-1,j-1 or low node of i-1,j or both if(!j) { currnode->price = tree[i-1][j].price/upfactor ; currnode->time = currtime; } else { currnode->price = tree[i-1][j-1].price*upfactor ; currnode->time = currtime; } } } } long double BinomialTree::getValue(long double K, long double R) { long double discountfactor = exp(-R*tstep); return getValue(0, 0, K, discountfactor); } long double BinomialTree::getValue(int level, int node, long double K, long double df) { if(level == (n-1)) return tree[level][node].optionvalue = (K < tree[level][node].price) ? (tree[level][node].price - K) : 0.0; else return tree[level][node].optionvalue = 0.5*df*(getValue(level+1, node+1, K, df) + getValue(level+1, node, K, df)); } void BinomialTree::print() { for( int i = 0; i < n; i++ ) { for( int j = 0; j <= i; j++ ) { std::cout << "[" << tree[i][j].price << "," << tree[i][j].time << "," << tree[i][j].optionvalue << "]\t"; } std::cout << std::endl; } }