【问题标题】:Dynamic solution for calling a function in RR中调用函数的动态解决方案
【发布时间】:2021-03-01 00:11:12
【问题描述】:

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

下一步,我想计算一些性能指标,例如 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]))

还有办法动态实现吗?

提前致谢。

【问题讨论】:

    标签: r portfolio r-portfolioanalytics


    【解决方案1】:

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

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

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

    hh <- lapply(weights, comp_HHI)
    

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

    用你的第二个例子你会做

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

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

    【讨论】:

    • 或者使用weights &lt;- mget(ls(pattern = "weights_.*"))创建列表
    • 谢谢@MrFlick,我知道了!但是除了列表的解决方案之外还有其他选择吗?这样我就收到了针对每种投资组合类型的 4 个单独的解决方案。简单来说,分别是 4 个 data.fames?
    • 我确实编辑了最初的帖子,请在最后查看另一个示例。
    • 最后一个问题:见上!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多