0

我正在尝试在 R 中实现“动态”解决方案。首先,我确实为 4 种不同的策略运行了投资组合优化:MV、CVaR、熵池和幼稚。

作为下一步,我想计算一些性能测量值,例如 HHI。

我现在的问题是:我怎样才能简化我的代码?如前所述,我得到了 4 种不同的策略,我检索了 4 个具有相应优化权重的不同数据帧。当然有一个解决方案可以简化这一点。

# call function
hhi_MV <- comp_HHI(weights_MV)
hhi_CVAR <- comp_HHI(weights_CVAR)
hhi_EP <- comp_HHI(weights_EP)
hhi_naive <- comp_HHI(weights_naive)

第一部分即通过

portfolios <- list("MV", "CVAR", "EP", "naive")
paste0("hhi_", i (from portfolios list), sep="")

第二部分“comp_HHI”是一个函数,我将相应的权重数据帧交给它。

另一个例子:

#### Compute Cumulative Return (can take a while) #####
perf_MV <- comp_perf(r = returns, w = weights_MV, fund = 100, freq = "months")
perf_CVAR <- comp_perf(r = returns, w = weights_CVAR, fund = 100, freq = "months")
perf_EP <- comp_perf(r = returns, w = weights_EP, fund = 100, freq = "months")
perf_naive <- comp_perf(r = returns, w = weights_naive, fund = 100, freq = "months")

使用前面介绍的代码,我计算了各个投资组合(comp_perf --> 函数)的性能,其中包含再平衡频率和用于计算最终财富的起始基金。我想动态实现代码 - 简单地说:最好是单行代码。

perf_* <- comp_perf(r = returns, w = weights_*, fund = 100, freq = "months")

如上一行所述,我将动态应用带有 * 符号的代码。换言之,即在不同投资组合类型上具有循环的符号。

我的最后一个问题是关于以下代码:

# First compute returns from cumulative returns
return_MV <- monthlyReturn(xts(perf_MV$CumReturn[ ,-1], 
                               order.by = perf_MV$CumReturn[ ,1]))
return_CVAR <- monthlyReturn(xts(perf_CVAR$CumReturn[ ,-1], 
                               order.by = perf_CVAR$CumReturn[ ,1]))
return_EP <- monthlyReturn(xts(perf_EP$CumReturn[ ,-1], 
                               order.by = perf_EP$CumReturn[ ,1]))
return_naive <- monthlyReturn(xts(perf_naive$CumReturn[ ,-1], 
                                  order.by = perf_naive$CumReturn[ ,1]))

还有一种方法可以动态实现它吗?

提前谢谢。

4

1 回答 1

1

目前尚不清楚您是如何生成权重对象的,但将相关数据组合到列表中会容易得多。例如

weights <- list(MV=weights_MV, CVAR=weights_CVAR, EP=weights_EP, naive=weights_naive)

然后你可以在列表上应用一个函数

hh <- lapply(weights, comp_HHI)

您可以使用hh$MV或从列表中获取值hh[["MV"]]

在你的第二个例子中,你会做

perf <- lapply(weights, function(x) comp_perf(r = returns, w = x, 
    fund = 100, freq = "months"))

避免使用存储有数据的变量名是个好主意。如果您希望在其中执行相同操作的相关值,它们应该在列表中。R 使得使用列表变得非常容易。尝试动态创建变量名称更加混乱且容易出错,并且只会使下游的所有内容也更加难以使用。

于 2020-11-17T18:20:14.497 回答