#' Part5: Portfolio Optimization Function(with drawdown constraints)
#'
#' These functions allow you --
#' @param tests ------------
#' @keywords tests
#' @export
#' @examples
#' connect.and.query = function(query, type = "get")
#' GET.value.lookup = function(table = "scaling", col2lookup = "Scaling_Ratio", col.name = "Date", col.value)
#' GET.n.until = function(column, table, n, DATE)
#' GET.column = function(table, column)
#' GET.rt.dateRange = function(first_day, last_day, tickers = slec.tickers, table = "daily_return")
#' GET.rt = function(tickers = "SHV,SHY,IEI,AGZ,STIP,TIP", table, DATE, days.all = 504, delim = ",")
#' excludeSheet
#' applyPreference = function(features, excludeSheet, riskTolerance="Low", investmentHorizon="Short")
#' check.and.print = function(x)
#' check.dateRange = function(dataset, column = "Date")
#' check.valid.tickers = function(tickers, first_day, last_day, lookback.days)
#' as.Date.n = function(x)
#' SD.year2day = function(SD_year, is.percent = FALSE)
#' SD.day2year = function(SD_day)
#' rt.quater2year = function(rt_quater)
#' rt.year2quater = function(rt_year)
#' percent = function(x){x / 100}
#' YTM2adjust_rt = function(YTM)
#' shorten.rts = function(dataset, exclude = "Date")
#' adjusted_rt2proj_rt = function(adjusted_rt, daily_rt, DATE, days.lookBackMmt=105, days.excludeMmt=21)
#' cov.period = function(DATE, days.lookBackSD = 504, daily_rt)
#' cov.matrix2 = function(cov_period, SR)
#' opti.wets.donlp2 = function(SD_1year.max=3.5, rt_1quater.min=-3, proj_rt, cov_matrix2, stress_rt, stress_drawdown=15)
#' opti.wets = function(daily_rt, forward_rt, DATE, days.lookBackSD=504, days.lookBackMmt=105, days.excludeMmt=21, SD_1year.max=3.5, rt_1quater.min=-3,forward_rt_type = "adjusted",stress_rt, stress_drawdown)
#' portfolio.SD = function(weights, cov_matrix2)
#' portfolio.rt = function(weights, rt_)
#' global.bounds = function(SD, limit)
#' notebook.declare = function(daily_rt)
#' compound = function(notebook, thisDay, cov_period.thisDay, returns.thisDay)
#' check.if.rebalance = function(SD_thisDay, lowerBound, upperBound)
opti.wets = function(daily_rt, forward_rt, DATE,
days.lookBackSD=504, days.lookBackMmt=105, days.excludeMmt=21,
SD_1year.max=3.5, rt_1quater.min=-3,
forward_rt_type = "adjusted",
stress_rt, stress_drawdown){
# convert the type of forward return: YTM -> adjusted -> projected ====
if(forward_rt_type == "YTM"){
proj_rt = forward_rt %>% YTM2adjust_rt() %>% adjusted_rt2proj_rt()
} else if (forward_rt_type == "adjusted") {
proj_rt = forward_rt %>%
adjusted_rt2proj_rt(daily_rt = daily_rt,
DATE = DATE,
days.lookBackMmt = days.lookBackMmt,
days.excludeMmt = days.excludeMmt)
} else if (forward_rt_type == "projected") {
proj_rt = forward_rt
} else {stop("The type of forward return must be one from the following: YTM, adjusted, projected")}
# main ====
cov_period = cov.period(DATE, days.lookBackSD, daily_rt)
SR_today = GET.value.lookup(table = "scaling",
col2lookup = "Scaling_Ratio",
col.name = "Date",
col.value = DATE)
cov2 = cov.matrix2(cov_period, SR_today)
#cov2 = cov(cov_period)
result = opti.wets.donlp2(SD_1year.max, rt_1quater.min, proj_rt, cov2, stress_rt, stress_drawdown)
# END of opti.wets ====
return(result)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.