Rmetrics中的投资组合约束主要是指由组合资产的权重(权重指该项资产占投资资金的比例)或者与权重相关的变量决定的限制性条件和边界条件。这些约束条件由字符串或由字符串组成的向量定义,这些字符串需要能表达出组合权重的上下界,主要约束类型有盒状(box)、成组(group)、协方差风险预算(covariance risk budgets)、非线性约束(general non-linear constraint)等。下面按总分的形式阐述组合约束。
1.组合约束的整体概况
Rmetrics中组合约束的代表fPFOLIOCON是由portfolioConstraints函数创建的S4型R对象,我们可以通过它了解组合约束的全貌:
library(fPortfolio)
showClass("fPFOLIOCON")
## Class "fPFOLIOCON" [package "fPortfolio"]
##
## Slots:
##
## Name: stringConstraints minWConstraints maxWConstraints
## Class: character numeric numeric
##
## Name: eqsumWConstraints minsumWConstraints maxsumWConstraints
## Class: matrix matrix matrix
##
## Name: minBConstraints maxBConstraints listFConstraints
## Class: numeric numeric list
##
## Name: minFConstraints maxFConstraints
## Class: numeric numeric
另外,我们也可以通过portfolioConstraints函数创建组合约束对象,需要注意的是portfolioConstraints函数涉及11个参数(??portfolioConstraints):
Data <- 100 * LPP2005.RET[, 1:3]
Spec <- portfolioSpec()
setTargetReturn(Spec) <- mean(Data)
Constraints <- "LongOnly"
defaultConstraints <- portfolioConstraints(Data, Spec, Constraints)
创建了组合约束对象之后我们可以利用str函数或者print函数呈现组合约束对象结构:
str(defaultConstraints, width = 65, strict.width = "cut")
## Formal class 'fPFOLIOCON' [package "fPortfolio"] with 11 slots
## ..@ stringConstraints : chr "LongOnly"
## ..@ minWConstraints : Named num [1:3] 0 0 0
## .. ..- attr(*, "names")= chr [1:3] "SBI" "SPI" "SII"
## ..@ maxWConstraints : Named num [1:3] 1 1 1
## .. ..- attr(*, "names")= chr [1:3] "SBI" "SPI" "SII"
## ..@ eqsumWConstraints : num [1:2, 1:4] 3.60e-02 -1.00 4.07e-0..
## .. ..- attr(*, "dimnames")=List of 2
## .. .. ..$ : chr [1:2] "Return" "Budget"
## .. .. ..$ : chr [1:4] "ceq" "SBI" "SPI" "SII"
## ..@ minsumWConstraints: logi [1, 1] NA
## ..@ maxsumWConstraints: logi [1, 1] NA
## ..@ minBConstraints : Named num [1:3] -Inf -Inf -Inf
## .. ..- attr(*, "names")= chr [1:3] "SBI" "SPI" "SII"
## ..@ maxBConstraints : Named num [1:3] 1 1 1
## .. ..- attr(*, "names")= chr [1:3] "SBI" "SPI" "SII"
## ..@ listFConstraints : list()
## ..@ minFConstraints : num(0)
## ..@ maxFConstraints : num(0)
print(defaultConstraints)
##
## Title:
## Portfolio Constraints
##
## Lower/Upper Bounds:
## SBI SPI SII
## Lower 0 0 0
## Upper 1 1 1
##
## Equal Matrix Constraints:
## ceq SBI SPI SII
## Return 0.03604 4.066e-05 0.08418 0.02389
## Budget -1.00000 -1.000e+00 -1.00000 -1.00000
2.多头约束
多头约束可以用字符“LongOnly”表示,正如上面的代码所示。多头约束是默认状态下的约束,它要求所有的权重在0-1之间。
3.无限卖空约束
卖空约束用“Short”表示,该约束的界限为(-,+),例如:
shortConstraints <- "Short"
portfolioConstraints(Data, Spec, shortConstraints)
##
## Title:
## Portfolio Constraints
##
## Lower/Upper Bounds:
## SBI SPI SII
## Lower -Inf -Inf -Inf
## Upper Inf Inf Inf
##
## Equal Matrix Constraints:
## ceq SBI SPI SII
## Return 0.03604 4.066e-05 0.08418 0.02389
## Budget -1.00000 -1.000e+00 -1.00000 -1.00000
4.Box约束
对于卖空来说,可以利用minW和maxW函数可以设置权重的上下限构建Box约束。当然如果设置权重参数在0-1之间即同多头约束。例如:
box.1 <- "minW[1:3] = 0.1"
box.2 <- "maxW[c(1, 3)] = c(0.5, 0.6)"
box.3 <- "maxW[2] = 0.4"
boxConstraints <- c(box.1, box.2, box.3)
portfolioConstraints(Data, Spec, boxConstraints)
##
## Title:
## Portfolio Constraints
##
## Lower/Upper Bounds:
## SBI SPI SII
## Lower 0.1 0.1 0.1
## Upper 0.5 0.4 0.6
##
## Equal Matrix Constraints:
## ceq SBI SPI SII
## Return 0.03604 4.066e-05 0.08418 0.02389
## Budget -1.00000 -1.000e+00 -1.00000 -1.00000
5.Group约束
Group约束涉及到的命令有“eqsumW”、“minsumW”和“maxsumW”,这里eqsumW设置的是一组资产的总权重,minsumW和maxsumW设置权重上下界。例如:
group.1 <- "eqsumW[c(\"SPI\", \"SII\")]=0.6"
group.2 <- "minsumW[c(2, 3)]=0.2"
group.3 <- "maxsumW[1:nAssets]=0.7"
groupConstraints <- c(group.1, group.2, group.3)
portfolioConstraints(Data, Spec, groupConstraints)
##
## Title:
## Portfolio Constraints
##
## Lower/Upper Bounds:
## SBI SPI SII
## Lower 0 0 0
## Upper 1 1 1
##
## Equal Matrix Constraints:
## ceq SBI SPI SII
## Return 0.03604 4.066e-05 0.08418 0.02389
## Budget -1.00000 -1.000e+00 -1.00000 -1.00000
## eqsumW 0.60000 0.000e+00 1.00000 1.00000
##
## Lower Matrix Constraints:
## avec SBI SPI SII
## lower 0.2 0 1 1
##
## Upper Matrix Constraints:
## avec SBI SPI SII
## upper 0.7 1 1 1
6.协方差风险预算约束
协方差风险预算约束需要我们向portfolioConstraints函数中增加自定义的协方差风险预算的上下界minB和maxB。协方差风险的上下界赋值需要对所有的资产进行赋值,例如:
budget.1 <- "minB[1:nAssets]=-Inf"
budget.2 <- "maxB[c(1, 2:nAssets)]=c(0.5, rep(0.6, times=2))"
budgetConstraints <- c(budget.1, budget.2)
portfolioConstraints(Data, Spec, budgetConstraints)
##
## Title:
## Portfolio Constraints
##
## Lower/Upper Bounds:
## SBI SPI SII
## Lower 0 0 0
## Upper 1 1 1
##
## Equal Matrix Constraints:
## ceq SBI SPI SII
## Return 0.03604 4.066e-05 0.08418 0.02389
## Budget -1.00000 -1.000e+00 -1.00000 -1.00000
##
## Lower/Upper Cov Risk Budget Bounds:
## SBI SPI SII
## Lower -Inf -Inf -Inf
## Upper 0.5 0.6 0.6
7.非线性约束
非线性约束的函数主要有”listF“、”minF“、”maxF“,其中listF表示非线性函数,其他两个函数定义上下界。例如,如果需要控制投资组合的最大回撤: 首先需要写出计算最大回撤的函数,该函数记为maxdd
maxdd <- function(x, ...) min(drawdown(x, ...))
然后需要定义非线性约束的上下界:
nonlin.1 <- "listF=list(maxdd=maxdd)"
nonlin.2 <- "minF=-0.04"
nonlin.3 <- "maxF=0"
nonlinConstraints <- c(nonlin.1, nonlin.2, nonlin.3)
portfolioConstraints(Data, Spec, nonlinConstraints)
##
## Title:
## Portfolio Constraints
##
## Lower/Upper Bounds:
## SBI SPI SII
## Lower 0 0 0
## Upper 1 1 1
##
## Equal Matrix Constraints:
## ceq SBI SPI SII
## Return 0.03604 4.066e-05 0.08418 0.02389
## Budget -1.00000 -1.000e+00 -1.00000 -1.00000
##
## Non-Linear Function Constraints:
## maxdd
## Lower -0.04
## Upper 0.00
8.综合约束
顾名思义就是将上述各种约束方法综合起来一起运用于投资组合:
# 模拟案例数据
Data <- 100 * LPP2005.RET[, 1:6]
# 模拟投资组合
Spec <- portfolioSpec()
# 设定目标收益
setTargetReturn(Spec) <- mean(Data)
# 设定Box约束
box.1 <- "minW[1:6] = 0.1"
box.2 <- "maxW[c(1:3, 5)] = c(rep(0.5, 3), 0.6)"
box.3 <- "maxW[4] = 0.4"
# 合并所有单独的约束
boxConstraints <- c(box.1, box.2, box.3)
# 设定Group约束
group.1 <- "eqsumW[c(2, 3, 5)]=0.2"
group.2 <- "minsumW[c(2, 4)]=0.2"
group.3 <- "maxsumW[c(4:6, 2)]=0.6"
groupConstraints <- c(group.1, group.2, group.3)
# 设定协方差风险预算约束
budget.1 <- "minB[1:nAssets]=-Inf"
budget.2 <- "maxB[c(1:3, 4:nAssets)]=rep(c(0.5, 0.6), each=3)"
budgetConstraints <- c(budget.1, budget.2)
# 设定非线性约束
maxdd <- function(x, ...) min(drawdown(x, ...))
nonlin.1 <- "listF=list(maxdd=maxdd)"
nonlin.2 <- "minF=-0.04"
nonlin.3 <- "maxF=0"
nonlinConstraints <- c(nonlin.1, nonlin.2, nonlin.3)
# 合并所有的约束
Constraints <- c(boxConstraints, groupConstraints, budgetConstraints, nonlinConstraints)
# 完成组合约束设定
portfolioConstraints(Data, Spec, Constraints)
##
## Title:
## Portfolio Constraints
##
## Lower/Upper Bounds:
## SBI SPI SII LMI MPI ALT
## Lower 0.1 0.1 0.1 0.1 0.1 0.1
## Upper 0.5 0.5 0.5 0.4 0.6 1.0
##
## Equal Matrix Constraints:
## ceq SBI SPI SII LMI MPI ALT
## Return 0.04308 4.066e-05 0.08418 0.02389 0.005532 0.05905 0.08577
## Budget -1.00000 -1.000e+00 -1.00000 -1.00000 -1.000000 -1.00000 -1.00000
## eqsumW 0.20000 0.000e+00 1.00000 1.00000 0.000000 1.00000 0.00000
##
## Lower Matrix Constraints:
## avec SBI SPI SII LMI MPI ALT
## lower 0.2 0 1 0 1 0 0
##
## Upper Matrix Constraints:
## avec SBI SPI SII LMI MPI ALT
## upper 0.6 0 1 0 1 1 1
##
## Lower/Upper Cov Risk Budget Bounds:
## SBI SPI SII LMI MPI ALT
## Lower -Inf -Inf -Inf -Inf -Inf -Inf
## Upper 0.5 0.5 0.5 0.6 0.6 0.6
##
## Non-Linear Function Constraints:
## maxdd
## Lower -0.04
## Upper 0.00