Last active
April 16, 2019 20:36
-
-
Save tvladeck/f4fd780e47dbad1499232b192205fa10 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
less_uncertainty_smaller_step <- | |
.25 * (1:1000 %>% map(~ run_simulation(initial = 1 - 0.1)) %>% unlist %>% mean) + | |
.5 * (1:1000 %>% map(~ run_simulation(initial = 1)) %>% unlist %>% mean) + | |
.25 * (1:1000 %>% map(~ run_simulation(initial = 1 + 0.1)) %>% unlist %>% mean) | |
greater_uncertainty_bigger_step <- | |
.05 * (1:1000 %>% map(~ run_simulation(initial = 1 - 3, step_size = 0.5)) %>% unlist %>% mean) + | |
.1 * (1:1000 %>% map(~ run_simulation(initial = 1 - 2, step_size = 0.5)) %>% unlist %>% mean) + | |
.2 * (1:1000 %>% map(~ run_simulation(initial = 1 - 1, step_size = 0.5)) %>% unlist %>% mean) + | |
.3 * (1:1000 %>% map(~ run_simulation(initial = 1, step_size = 0.5)) %>% unlist %>% mean) + | |
.2 * (1:1000 %>% map(~ run_simulation(initial = 1 + 1, step_size = 0.5)) %>% unlist %>% mean) + | |
.1 * (1:1000 %>% map(~ run_simulation(initial = 1 + 2, step_size = 0.5)) %>% unlist %>% mean) + | |
.05 * (1:1000 %>% map(~ run_simulation(initial = 1 + 3, step_size = 0.5)) %>% unlist %>% mean) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
library(e1071) | |
library(tidyverse) | |
run_simulation <- function( | |
step_size = 0.1, | |
steps = 100, | |
initial = 1, | |
min_val = -5, | |
max_val = 5) { | |
add_step <- function(val) { | |
candidate_val <- val + sample(c(0, step_size, -step_size), 1) | |
if(candidate_val > max_val) return(max_val) | |
if(candidate_val < min_val) return(min_val) | |
return(candidate_val) | |
} | |
current_val <- initial | |
for(i in 1:steps) { | |
current_val <- add_step(current_val) | |
} | |
sig <- sigmoid(current_val) | |
result <- runif(1) < sig | |
return(result) | |
} | |
sigmoid(1) | |
1:1000 %>% map(~ run_simulation()) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation(step_size = 0.3)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation(step_size = 0.5)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation(step_size = 1)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation(step_size = 5)) %>% unlist %>% mean | |
run_simulation_without_constraints <- function( | |
step_size = 0.1, | |
steps = 100, | |
initial = 1) { | |
# min_val = -5, | |
# max_val = 5 | |
add_step <- function(val) { | |
candidate_val <- val + sample(c(0, step_size, -step_size), 1) | |
# if(candidate_val > max_val) return(max_val) | |
# if(candidate_val < min_val) return(min_val) | |
return(candidate_val) | |
} | |
current_val <- initial | |
for(i in 1:steps) { | |
current_val <- add_step(current_val) | |
} | |
sig <- sigmoid(current_val) | |
result <- runif(1) < sig | |
return(result) | |
} | |
sigmoid(1) | |
1:1000 %>% map(~ run_simulation_without_constraints()) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_without_constraints(step_size = 0.3)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_without_constraints(step_size = 0.5)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_without_constraints(step_size = 1)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_without_constraints(step_size = 5)) %>% unlist %>% mean | |
run_simulation_on_sigmoid <- function( | |
step_size = 0.1, | |
steps = 100, | |
initial = 1, | |
min_val = -5, | |
max_val = 5) { | |
add_step <- function(val) { | |
candidate_val <- val + sample(c(0, step_size, -step_size), 1) | |
if(candidate_val > max_val) return(max_val) | |
if(candidate_val < min_val) return(min_val) | |
return(candidate_val) | |
} | |
current_val <- initial | |
for(i in 1:steps) { | |
current_val <- add_step(current_val) | |
} | |
sig <- sigmoid(current_val) | |
return(sig) | |
} | |
sigmoid(1) | |
1:1000 %>% map(~ run_simulation_on_sigmoid()) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_on_sigmoid(step_size = 0.3)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_on_sigmoid(step_size = 0.5)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_on_sigmoid(step_size = 1)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_on_sigmoid(step_size = 5)) %>% unlist %>% mean | |
run_simulation_on_sigmoid_without_constraints <- function( | |
step_size = 0.1, | |
steps = 100, | |
initial = 1) { | |
# min_val = -5, | |
# max_val = 5) { | |
add_step <- function(val) { | |
candidate_val <- val + sample(c(0, step_size, -step_size), 1) | |
# if(candidate_val > max_val) return(max_val) | |
# if(candidate_val < min_val) return(min_val) | |
return(candidate_val) | |
} | |
current_val <- initial | |
for(i in 1:steps) { | |
current_val <- add_step(current_val) | |
} | |
sig <- sigmoid(current_val) | |
return(sig) | |
} | |
sigmoid(1) | |
1:1000 %>% map(~ run_simulation_on_sigmoid_without_constraints()) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_on_sigmoid_without_constraints(step_size = 0.3)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_on_sigmoid_without_constraints(step_size = 0.5)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_on_sigmoid_without_constraints(step_size = 1)) %>% unlist %>% mean | |
1:1000 %>% map(~ run_simulation_on_sigmoid_without_constraints(step_size = 5)) %>% unlist %>% mean |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
run_simulation_of_sim_paths_on_sigmoid_with_constraints <- function( | |
step_size = 0.1, | |
steps = 100, | |
initial = 1, | |
sims_per_step = 100, | |
max_val = 5, | |
min_val = -5 | |
) { | |
add_step <- function(val) { | |
candidate_val <- val + sample(c(0, step_size, -step_size), 1) | |
if(candidate_val > max_val) return(max_val) | |
if(candidate_val < min_val) return(min_val) | |
return(candidate_val) | |
} | |
current_val <- initial | |
current_prob <- c() | |
price_list <- c() | |
current_price <- c() | |
for(i in 0:steps) { | |
current_val <- add_step(current_val) | |
remaining_steps <- steps-i | |
if(remaining_steps > 0) { | |
simulated_outcomes <- c() | |
for(j in 1:sims_per_step) { | |
sim_val <- current_val | |
for(k in 1:remaining_steps){ | |
sim_val <- add_step(sim_val) | |
} | |
simulated_outcomes <- c(simulated_outcomes, sim_val) | |
} | |
current_price <- c(current_price, mean(sapply(simulated_outcomes, sigmoid))) | |
current_prob <- c(current_prob, sigmoid(current_val)) | |
} | |
} | |
return(data.frame(price = current_price, prob = current_prob)) | |
} | |
run_simulation_of_sim_paths_on_sigmoid_without_constraints <- function( | |
step_size = 0.1, | |
steps = 100, | |
initial = 1, | |
sims_per_step = 100 | |
) { | |
add_step <- function(val) { | |
candidate_val <- val + sample(c(0, step_size, -step_size), 1) | |
# if(candidate_val > max_val) return(max_val) | |
# if(candidate_val < min_val) return(min_val) | |
return(candidate_val) | |
} | |
current_val <- initial | |
current_prob <- c() | |
price_list <- c() | |
current_price <- c() | |
for(i in 0:steps) { | |
current_val <- add_step(current_val) | |
remaining_steps <- steps-i | |
if(remaining_steps > 0) { | |
simulated_outcomes <- c() | |
for(j in 1:sims_per_step) { | |
sim_val <- current_val | |
for(k in 1:remaining_steps){ | |
sim_val <- add_step(sim_val) | |
} | |
simulated_outcomes <- c(simulated_outcomes, sim_val) | |
} | |
current_price <- c(current_price, mean(sapply(simulated_outcomes, sigmoid))) | |
current_prob <- c(current_prob, sigmoid(current_val)) | |
} | |
} | |
return(data.frame(price = current_price, prob = current_prob)) | |
} | |
.t1 <- run_simulation_of_sim_paths_on_sigmoid_with_constraints(initial = 0.5, step_size = 0.1, steps = 300, sims_per_step = 100) | |
.t2 <- run_simulation_of_sim_paths_on_sigmoid_with_constraints(initial = 0.5, step_size = 0.4, steps = 300, sims_per_step = 100) | |
.t1 %>% | |
ggplot() + | |
aes(x = 1:nrow(.t1)) + | |
geom_line(aes(y = price), color = "red") + | |
geom_line(aes(y = prob), color = "blue") | |
.t2 %>% | |
ggplot() + | |
aes(x = 1:nrow(.t2)) + | |
geom_line(aes(y = price), color = "red") + | |
geom_line(aes(y = prob), color = "blue") | |
library(foreach) | |
library(doParallel) | |
registerDoParallel(4) | |
non_vol_runs <- foreach(i = 1:100, .combine = bind_rows) %dopar% { | |
sim <- run_simulation_of_sim_paths_on_sigmoid_with_constraints(initial = 0, step_size = 0.1, steps = 600, sims_per_step = 100) | |
sim %>% mutate( | |
run = i, | |
type = "non_vol" | |
) | |
} | |
vol_runs <- foreach(i = 1:100, .combine = bind_rows) %dopar% { | |
sim <- run_simulation_of_sim_paths_on_sigmoid_with_constraints(initial = 0, step_size = 0.4, steps = 600, sims_per_step = 100) | |
sim %>% mutate( | |
run = i, | |
type = "vol" | |
) | |
} | |
vol_runs %>% | |
filter(run == 2) %>% | |
ggplot() + | |
aes(x = 1:300) + | |
geom_line(aes(y = price), color = "red") + | |
geom_line(aes(y = prob), color = "blue") | |
saveRDS(non_vol_runs, "~/Downloads/non_vol_runs.RDS") | |
saveRDS(vol_runs, "~/Downloads/vol_runs.RDS") | |
bind_rows(non_vol_runs, vol_runs) %>% | |
group_by(type, run) %>% | |
mutate(idx = 1:n()) %>% | |
gather(key = series, value = value, -idx, -run, -type) %>% | |
# filter(run %in% c(1, 2, 3)) %>% | |
mutate(grp = str_c(run, "_", series)) %>% | |
filter(series == "price") %>% | |
ggplot() + | |
aes(x = idx) + | |
aes(y = value) + | |
# aes(color = series) + | |
geom_line(aes(group = grp), alpha = 0.5) + | |
labs(y = "Option price", x = "Time") + | |
# geom_density_2d(aes(group = series)) + | |
facet_wrap(~ type) + | |
theme_bw() | |
bind_rows(non_vol_runs, vol_runs) %>% | |
group_by(type, run) %>% | |
mutate(idx = 1:n()) %>% | |
gather(key = series, value = value, -idx, -run, -type) %>% | |
group_by(idx, series, type) %>% | |
summarize( | |
# quant_99 = quantile(value, .99), | |
quant_95 = quantile(value, .90), | |
# quant_80 = quantile(value, .8), | |
# quant_90 = quantile(value, .9), | |
# quant_98 = quantile(value, .98), | |
quant_05 = quantile(value, .05), | |
# quant_02 = quantile(value, 0.02) | |
# quant_01 = quantile(value, 0.01) | |
) %>% | |
ungroup %>% | |
gather(key = qntle, value = value, -series, -idx, -type) %>% | |
mutate(grp = str_c(qntle, "_", series, "_", type)) %>% | |
ggplot() + | |
aes(x = idx) + | |
aes(y = value) + | |
aes(group = grp) + | |
aes(color = type) + | |
aes(linetype = series) + | |
geom_smooth(se = F, lwd = 0.7) + | |
scale_color_brewer("", type = "qual", labels = c("Step size = 0.1", "Step size = 0.4")) + | |
scale_linetype_discrete("", labels = c("Price of option", "Underlying probability")) + | |
guides(lty = guide_legend(override.aes = list(col = 'darkgrey'))) + | |
theme_bw() + | |
theme(legend.position = c(0.6, 0.54), | |
legend.background = element_rect(fill = "transparent"), | |
legend.box = "horizontal", | |
legend.key = element_rect(fill = "transparent")) + | |
labs(x = "Time", y = "Value", title = "Trading bounds for different volatilities", | |
caption = "5% and 95% quantile, respectively\n100 runs for each step size\nPrice computed from 100 simulations at each step\nUnderlying bound in [-5,5]\nOutcome binomial draw from sigmoid transformation") + | |
# facet_wrap(~ type) + | |
NULL |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment