【问题标题】:CVaR minimization with the BDportfolio_optim function (PortfolioOptim package)使用 BDportfolio_optim 函数(PortfolioOptim 包)最小化 CVaR
【发布时间】:2021-08-09 16:11:35
【问题描述】:

我正在尝试使用 PortfolioOptim 包 (https://cran.r-project.org/web/packages/PortfolioOptim/PortfolioOptim.pdf) 中的 BDportfolio_optim 函数运行示例代码,以最小化 CVaR。输出应该是关于某些约束的最小 CVaR 的最佳权重。 但是,我总是遇到一个错误,说我的第一个约束矩阵 A 的尺寸有误。 使用的代码与 PortfolioOptim 手册中使用的示例非常相似: https://cran.r-project.org/web/packages/PortfolioOptim/PortfolioOptim.pdf

库(PortfolioOptim) 图书馆(fPortfolio) 库(quantmod) 图书馆(吃豆人) 图书馆(时间日期) 库(timeSeries)

getSymbols("EBAY", src="yahoo", from= "2011-01-01")
getSymbols("MSFT", src="yahoo", from= "2011-01-01")
getSymbols("INTC", src="yahoo", from= "2011-01-01")
getSymbols("KO", src="yahoo", from= "2011-01-01")

portfolio_1 = cbind(EBAY$EBAY.Close, MSFT$MSFT.Close, INTC$INTC.Close, KO$KO.Close)
ret_p_1 = cbind(dailyReturn(EBAY), dailyReturn(MSFT), dailyReturn(INTC), dailyReturn(KO))
portfolioReturns_1 <- as.timeSeries(ret_p_1)
colnames(ret_p_1) <- tickers
portfolioReturns_1 <- as.timeSeries(ret_p_1)

k = ncol(portfolioReturns_1)
num = nrow(portfolioReturns_1)
port_ret = 0.05 # target portfolio return
alpha_optim = 0.95

a0 <- rep(1,k)
A <- rbind(a0,-a0)
b <- rbind(1+1e-8, -1+1e-8)
LB <- rep(0, k)
UB <- rep(0.5 ,k)

result <- BDportfolio_optim(portfolioReturns_1, port_ret, "CVAR", alpha_optim,
                          Aconstr = A , bconstr = b, LB, UB, maxiter=10000, tol=1e-8)

控制台的输出总是一样的:

Error in BDportfolio_optim(portfolioReturns_1, port_ret, "CVAR", alpha_optim,  : 
  Matrix A must have as many rows as constraints (=elements of vector b)  and as many columns as variables (=assets).

但是,当我检查 A 的维度时,它是 (2, 4) - 完全对应于向量 b 的元素和资产变量 (k=4)。

有人知道出了什么问题吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    您似乎遗漏了BDportfolio_optim 函数的第一个参数dat(您的portfolioReturns_1)的部分描述,上面写着:

    dat返回数据的时间序列; dat = cbind(rr, pk),其中 rr 是一个数组(时间序列) 资产回报,对于 n 个回报和 k 个资产,它是一个具有 dim(rr) = (n , k), pk 是一个长度为 n 的向量,其中包含返回概率。

    您的portfolioReturns_1 仅包含 rr 部分,缺少 pk 部分。

    似乎 BDportfolio_optim 只能使用回报(概率)分布作为输入。您知道如何将一个分配给portfolioReturns_1 吗?

    根据 PortfolioOptim 手册中使用的示例,您可以这样做:

    result <- BDportfolio_optim(cbind(portfolioReturns_1, matrix(1/num, num, 1)), port_ret, …
    

    【讨论】:

    • 非常感谢这个小细节!同时,我发现它需要一个额外的列,现在我知道它应该是哪种类型。无论如何,似乎 BDportfolio_optim 只能使用回报(概率)分布作为输入。你知道我如何将一个分配给portfolioReturns_1吗?如果您熟悉投资组合优化,您是否知道不期望收益分布作为输入的内置 CVaR 优化函数?
    • 很抱歉,我不熟悉投资组合优化。也许在另一个 Stack Exchange 站点上回答这个问题的机会更大,例如。 G。 Quantitative Finance.
    • 但我会在答案中添加如何将 pk 列添加到数据中,就像在 PortfolioOptim 手册中使用的示例中所做的那样。
    猜你喜欢
    • 2021-10-25
    • 2018-01-30
    • 2015-02-18
    • 2020-10-06
    • 1970-01-01
    • 2017-08-18
    • 2011-01-16
    • 2017-07-28
    相关资源
    最近更新 更多