这个问题的名称并不公平。最好通过数值例子来解释。假设我有以下投资组合数据,称为data
。
> data
Stdev AvgReturn
1 1.92 0.35
2 1.53 0.34
3 1.39 0.31
4 1.74 0.31
5 1.16 0.30
6 1.27 0.29
7 1.78 0.28
8 1.59 0.27
9 1.05 0.27
10 1.17 0.26
11 1.62 0.25
12 1.33 0.25
13 0.96 0.24
14 1.47 0.24
15 1.09 0.24
16 1.20 0.24
17 1.49 0.23
18 1.01 0.23
19 0.88 0.22
20 1.21 0.22
21 1.37 0.22
22 1.09 0.22
23 0.95 0.21
24 0.81 0.21
我已经按data
对AvgReturn
data.frame进行了排序,以实现此目标(我认为更容易)。我的目标是基本上消除所有选择无意义的点,即我不想要一个我选择较低AvgReturn
但收到较高Stdev
的投资组合(假设stdev是合适的衡量风险,但我现在假设。)
基本上,是否知道选择“理性”投资组合选择的有效(在代码意义上)方式。我已手动为此数据框创建了第三列,以显示应保留哪些投资组合选项。我想删除投资组合4,因为我永远不会选择它,因为我可以选择投资组合3并获得相同的回报和较低的标准。同样地,我永远不会选择8,因为我可以选择5具有更高的回报和更低的stdev。
> res
Stdev AvgReturn Keep
1 1.92 0.35 TRUE
2 1.53 0.34 TRUE
3 1.39 0.31 TRUE
4 1.74 0.31 FALSE
5 1.16 0.30 TRUE
6 1.27 0.29 FALSE
7 1.78 0.28 FALSE
8 1.59 0.27 FALSE
9 1.05 0.27 TRUE
10 1.17 0.26 FALSE
11 1.62 0.25 FALSE
12 1.33 0.25 FALSE
13 0.96 0.24 TRUE
14 1.47 0.24 FALSE
15 1.09 0.24 FALSE
16 1.20 0.24 FALSE
17 1.49 0.23 FALSE
18 1.01 0.23 FALSE
19 0.88 0.22 TRUE
20 1.21 0.22 FALSE
21 1.37 0.22 FALSE
22 1.09 0.22 FALSE
23 0.95 0.21 FALSE
24 0.81 0.21 TRUE
我能想到解决这个问题的唯一方法是循环并检查每个条件。但是,对于此解决方案,R
这是我的首选语言,效率相对较低。我很难想到一个矢量化解决方案。任何帮助表示赞赏!
修改 我认为这是一个解决方案:
domstrat <- function(data){
keep <- c(-1,sign(diff(cummin(data[[1]]))))
data <- data[which(keep!=0),]
return(data)
}
Stdev AvgReturn
1 1.92 0.35
2 1.53 0.34
3 1.39 0.31
5 1.16 0.30
9 1.05 0.27
13 0.96 0.24
19 0.88 0.22
24 0.81 0.21
答案 0 :(得分:1)
这使用函数cummax
通过测试原始数据来识别一系列限定点:
> data <- data[order(data$Stdev),]
> data[ which(data$AvgReturn == cummax(data$AvgReturn)) , ]
Stdev AvgReturn
24 0.81 0.21
19 0.88 0.22
13 0.96 0.24
9 1.05 0.27
5 1.16 0.30
3 1.39 0.31
2 1.53 0.34
1 1.92 0.35
> plot(data)
> points( data[ which(data$AvgReturn == cummax(data$AvgReturn)) , ] , col="green")
它实际上不是凸壳,而是可能被称为“单调增加的船体”。
答案 1 :(得分:0)
您可以定义一个自定义R function
,其中包含一些逻辑,用于根据标准偏差和平均回报来决定是否保留某个投资组合:
>portfolioKeep <- function(x){
+ # x[1] contains the Stdev for the input row
+ # x[2] contains the AvgReturn for the input row
+ # make your decision based on these inputs here...
+ # and remember to return either "TRUE" or "FALSE"
+ }
接下来,我们可以在输入数据框中使用apply
函数来提供您想要的Keep
列:
# your 'input' data frame
input.mat <- data.matrix(input)
# apply custom function to rows
keep <- apply(input.mat, 1, portfolioKeep)
# bind keep vector to input data frame
input <- cbind(input, keep)
上面的代码首先将input
数据框转换为数字矩阵,以便我们可以在其上使用apply
函数。 apply
函数将在每一行上运行portfolioKeep
,返回“TRUE”或“FALSE”。最后,为方便起见,我们将Keep
列向上滚动到原始数据框中。
现在,您可以使用您开始使用的数据框input
轻松完成报告。