nu = 0.12 sigma = 0.2 delta_t = 3/12 p = 1/2 + (1/2) / sqrt( sigma^2 / (nu^2 * delta_t) + 1 ) ln_u = sqrt( sigma^2 * delta_t + ( nu * delta_t )^2 ) u = exp(ln_u) ln_d = - sqrt( sigma^2 * delta_t + ( nu * delta_t )^2 ) d = exp(ln_d) print(sprintf('p= %f; u= %f; d= %f', p, u, d)) ## Build the grid that represents the possible outcomes at each point in time to plot: ## reductions = c(d, u) ## how much does our price change n_steps = 4 seg_x0 = c() seg_y0 = c() seg_x1 = c() seg_y1 = c() current_nodes = c(100) ## the initial price for( yi in 1:n_steps ){ new_current_nodes = c() for( pti in 1:length(current_nodes) ){ xx = yi-1 yy = current_nodes[pti] ## Create a segment from (xx, yy) -> (xx+1, yy*reduction): ## for( rai in 1:length(reductions) ){ xxp = xx+1 yyp = yy*reductions[rai] new_current_nodes = c(new_current_nodes, yyp) seg_x0 = c(seg_x0, xx) seg_y0 = c(seg_y0, yy) seg_x1 = c(seg_x1, xxp) seg_y1 = c(seg_y1, yyp) } } current_nodes = new_current_nodes } ##print(cbind(seg_x0, seg_y0, seg_x1, seg_y1)) ##postscript('../../WriteUp/Graphics/Chapter11/chap_11_ex_1_lattice.eps', onefile=FALSE, horizontal=FALSE) plot(NULL, xlim=c(0, max(c(seg_x0, seg_x1))+0.5), ylim=c(min(c(seg_y0, seg_y1)), max(c(seg_y0, seg_y1))), xlab='timestep', ylab='price', xaxt='n') segments(seg_x0, seg_y0, seg_x1, seg_y1) axis(1, at=0:4, labels=c('0','1','2','3','4')) final_state = sort(unique(seg_y1[seg_x1==4]), decreasing=T) points(rep(4, length(final_state)), final_state, type='p', pch=19) grid() ##dev.off() print('Final price can be one of:') print(round(final_state, 2))