[This article was first published on R on msperlin, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Investing is hard. People often
get_perf <- function(starting_cash = 1, perc_perf = 0.2, perc_manag = 0.02, manager_skill_down = 0.8, manager_skill_up = 1.2) { require(BatchGetSymbols) df_sp500 <- BatchGetSymbols(tickers = '^GSPC', first.date = '1950-01-01', last.date = Sys.Date())[[2]] df_invest <- df_sp500 %>% mutate(ref_year = lubridate::year(ref.date)) %>% group_by(ref_year) %>% summarise(last_price = last(price.adjusted)) %>% mutate(ret = last_price/lag(last_price) - 1) df_out <- tibble() port_value <- starting_cash invest_value <- starting_cash for (i_year in df_invest$ref_year[2:nrow(df_invest)]) { idx <- which(i_year == df_invest$ref_year) ret_year <- df_invest$ret[idx] invest_value <- invest_value*(1 + ret_year) fund_return <- (ret_year>0)*manager_skill_up*ret_year + (ret_year<=0)*manager_skill_down*ret_year bench_cost <- (fund_return > 0)*(fund_return - ret_year)*perc_perf*port_value management_cost <- port_value*perc_manag port_value <- port_value*(1+fund_return) - bench_cost - management_cost df_out <- bind_rows(df_out, tibble(i_year, ret_investment = ret_year, fund_return, bench_cost, management_cost, fund_cost = bench_cost + management_cost, port_value, invest_value)) } df_tab <- tibble(perc_perf, perc_manag, manager_skill_down, manager_skill_up, total_ret_asset = last(df_out$invest_value)/starting_cash-1, total_fund_return = last(cumprod(1+df_out$fund_return)) - 1, total_ret_portfolio = last(df_out$port_value)/starting_cash-1, total_cash_fund_cost = sum(df_out$fund_cost), total_cash_investor = last(port_value), CAGR_asset = (1+total_ret_asset)^(1/nrow(df_out))-1, CAGR_fund = (1+total_fund_return)^(1/nrow(df_out))-1, CAGR_portfolio = (1+total_ret_portfolio)^(1/nrow(df_out))-1 ) return(df_tab) } perc_perf <- 0.2 perc_manag <- 0.02 bench <- 0.05 starting_cash <- 1000 manager_skill_down <- 0.5 manager_skill_up <- 1.5 df_tab <- get_perf(starting_cash = starting_cash , perc_perf = perc_perf, perc_manag = perc_manag, manager_skill_down = manager_skill_down, manager_skill_up = manager_skill_up) ## Loading required package: BatchGetSymbols ## Loading required package: rvest ## Loading required package: xml2 ## Loading required package: dplyr ## ## Attaching package: 'dplyr' ## The following objects are masked from 'package:stats': ## ## filter, lag ## The following objects are masked from 'package:base': ## ## intersect, setdiff, setequal, union ## ## ## Running BatchGetSymbols for: ## tickers =^GSPC ## Downloading data for benchmark ticker ## ^GSPC | yahoo (1|1) | Found cache file ## ^GSPC | yahoo (1|1) | Found cache file - Got 100% of valid prices | Looking good!
To leave a comment for the author, please follow the link and comment on their blog: R on msperlin.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.