Investments Costs
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![Read more...]