S0=50; Time=2; r=0.05; sigma=0.30; amer=FALSE n=10 lookbackCallPriceByBinomCRR(S0=S0, Time=Time, r=r, n=n, sigma=sigma, amer=amer) prices = sapply(1:20, function(n) lookbackCallPriceByBinomCRR(S0=S0, Time=Time, r=r, n=n, sigma=sigma, amer=amer)) prices plot(prices) install.packages("fExoticOptions") library(fExoticOptions) library(help=fExoticOptions) ?LookbackOptions exact = FloatingStrikeLookbackOption(TypeFlag = "c", S=S0, SMinOrMax = S0, Time=Time, r=r, b=r, sigma=sigma)@price #[1] 16.61741 plot(prices, ylim=c(10, exact)) abline(h=exact, col="blue", lwd=2) exact - prices[20] #[1] 1.473453 (exact - prices[20]) / exact #[1] 0.08866922 chyba 9% - obrovska, a nemozeme radovo zvysit hlbku stromu n # # Monte Carlo v binom modeli # ## skuska sample() set.seed(123) x = sample(x = c(0,1), size = 1000, prob = c(1-p, p), replace=T) table(x) #0 1 #663 337 n = 10 u = 2 d = 1/2 p = (exp(r * Time / n) - d) / (u-d) ## pravdepodobnost narastu - tj. 1-ky #[1] 0.3400334 set.seed(123) omega = sample(x = c(0,1), size = n, prob = c(1-p, p), replace=T) omega #[1] 0 1 0 1 1 0 0 1 0 0 (pocet1 = sum(omega)) # 4 (ST = S0 * (u^pocet1) * (d^(n-pocet1))) #[1] 12.5 S = numeric(n+1) S[1] = S0 for(i in 1:n) { S[i+1] = S[i] * ifelse(omega[i] == 1, u, d) } S #[1] 50.0 25.0 50.0 25.0 50.0 100.0 50.0 25.0 50.0 25.0 12.5 (fT = S[n+1] - min(S)) ## 0 set.seed(123) n=100 R=100 lookbackCallMC(S0=S0, Time=Time, r=r, n=n, sigma=sigma, R=R) #[1] 17.29482 exact #[1] 16.61741 library(pbapply) set.seed(123) M = 500 ## time=1m30s prices2 = numeric(M) pb = startpb(0,M) for(i in 1:M) { prices2[i] = lookbackCallMC(S0=S0, Time=Time, r=r, n=n, sigma=sigma, R=1000) setpb(pb, i) } closepb(pb) prices2 #[1] 17.29482 18.09280 17.85776 19.08765 16.82380 ## priemer mean(prices2) #[1] 15.92502 sd(prices2) #[1] 0.5499455 ## graficke overenie normality qqnorm(prices2) qqline(prices2)