为什么不能解决。QP和Portfolio.optim产生相同的结果?

詹姆斯·皮克诺(James Picerno)

Portfolio.optim {tseries}的文档说,solve.QP {quadprog}用于生成解决方案,以找到使夏普比率最大化的相切组合。这意味着结果应该与两个函数相同。我可能会忽略一些东西,但是在这个简单的示例中,我得到了相似但不完全相同的解决方案,它们使用Portfolio.optim和Solve.QP估算最佳投资组合权重。结果不应该一样吗?如果是这样,我在哪里出错?这是代码:

library(tseries)
library(quadprog)


# 1. Generate solution with solve.QP via: comisef.wikidot.com/tutorial:tangencyportfolio

# create artifical data
set.seed(1)
nO     <- 100     # number of observations
nA     <- 10      # number of assets
mData  <- array(rnorm(nO * nA, mean = 0.001, sd = 0.01), dim = c(nO, nA))
rf     <- 0.0001     # riskfree rate (2.5% pa)
mu     <- apply(mData, 2, mean)    # means
mu2    <- mu - rf                  # excess means

# qp
aMat  <- as.matrix(mu2)
bVec  <- 1
zeros <- array(0, dim = c(nA,1))
solQP <- solve.QP(cov(mData), zeros, aMat, bVec, meq = 1)

# rescale variables to obtain weights
w <- as.matrix(solQP$solution/sum(solQP$solution))

# 2. Generate solution with portfolio.optim (using artificial data from above)
port.1 <-portfolio.optim(mData,riskless=rf)
port.1.w <-port.1$pw
port.1.w <-matrix(port.1.w)

# 3. Compare portfolio weights from the two methodologies:

compare <-cbind(w,port.1$pw)

compare

             [,1]        [,2]
 [1,]  0.337932967 0.181547633
 [2,]  0.073836572 0.055100415
 [3,]  0.160612441 0.095800361
 [4,]  0.164491490 0.102811562
 [5,]  0.005034532 0.003214622
 [6,]  0.147473396 0.088792283
 [7,] -0.122882875 0.000000000
 [8,]  0.127924865 0.067705050
 [9,]  0.026626940 0.012507530
[10,]  0.078949672 0.054834759
托尼托诺夫

处理此类情况的唯一方法是浏览源代码。就您而言,可通过访问tseries:::portfolio.optim.default

现在,为了找到这两个调用之间的区别,我们可以通过定义等效的辅助函数来缩小问题的范围:

foo <- function(x, pm = mean(x), covmat = cov(x), riskless = FALSE, rf = 0) 
{
  x <- mData
  pm <- mean(x)
  covmat <- cov(x)
  k <- dim(x)[2]
  Dmat <- covmat
  dvec <- rep.int(0, k)
  a1 <- colMeans(x) - rf
  a2 <- matrix(0, k, k)
  diag(a2) <- 1
  b2 <- rep.int(0, k)
  Amat <- t(rbind(a1, a2))
  b0 <- c(pm - rf, b2)
  solve.QP(Dmat, dvec, Amat, bvec = b0, meq = 1)$sol
}

identical(portfolio.optim(mData, riskless=TRUE, rf=rf)$pw,
          foo(mData, riskless=TRUE, rf=rf))
#[1] TRUE

这样,您可以看到1)riskless=rf不是预期的方式,riskless=TRUE, rf=rf是正确的方式2)Amat和bvec有一些区别。

我不是投资组合优化方面的专家,所以我不知道这些附加约束背后的解释是什么,以及它们是否应该放在第一位,但是至少您可以看到是什么导致了差异。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TRUNCATE和DELETE会产生相同的结果吗?

来自分类Dev

CryptoJS和openssl_decrypt不会产生相同的结果

来自分类Dev

为什么使用[与[[]有时会产生相同的结果(而不是不同的结果)?

来自分类Dev

在python正则表达式中,为什么(h)*和(h)+不能产生相同的结果?

来自分类Dev

为什么这两个代码片段会产生相同的结果?

来自分类Dev

为什么这些操作不会产生相同的结果?管道进入。(点)

来自分类Dev

为什么这两个代码片段会产生相同的结果?

来自分类Dev

为什么不同JS对象中的my方法会产生相同的结果?

来自分类Dev

为什么CSS文件不能产生相同的结果,这取决于它们是存储在Web上还是本地存储?

来自分类Dev

d3.json()和JSON.parse()会产生相同的结果吗?

来自分类Dev

在形态学打开和闭合产生相同结果的情况下?

来自分类Dev

GZip在macOS和Linux上无法产生相同的压缩结果

来自分类Dev

Java中的同步-新的ReentrantLock(true)和新的ReentrantLock(false)产生相同的结果吗?

来自分类Dev

为什么在`(?!^)`和`(?<!^)`上产生相同的答案?

来自分类Dev

Python-新手:为什么这个简单的if-elif(C case块的复制)总是产生相同的结果?

来自分类Dev

正则表达式 - 为什么这两个表达式不会产生相同的结果?

来自分类Dev

尝试使用 python 计算 EMA,但我无法弄清楚为什么我的代码总是产生相同的结果

来自分类Dev

为什么类定义总是产生相同的字节码?

来自分类Dev

在C ++和.NET中产生相同的随机数

来自分类Dev

如何解决调用中的嘲笑_开放差异,但不能解决最终结果

来自分类Dev

在两者中同时使用.Include()时,实体框架中的延迟加载和渴望加载会产生相同的结果吗?

来自分类Dev

为什么 "puts 'foo'" 和 puts "foo\n" 在 Ruby 中会产生相同的输出?

来自分类Dev

log和exp matlab函数为什么会产生相反的结果?

来自分类Dev

which.max产生相同的结果

来自分类Dev

随机排列函数产生相同的结果

来自分类Dev

为什么optim()总是给我相同的结果?

来自分类Dev

使用格式说明符%d和%u将类型转换〜0转换为(unsigned int)和(unsigned short),对于short产生相同的结果,但对于int产生不同的结果

来自分类Dev

为什么Datomic在迭代时连续两次产生相同的临时ID?

来自分类Dev

为什么这两个C语句都产生相同的输出

Related 相关文章

  1. 1

    TRUNCATE和DELETE会产生相同的结果吗?

  2. 2

    CryptoJS和openssl_decrypt不会产生相同的结果

  3. 3

    为什么使用[与[[]有时会产生相同的结果(而不是不同的结果)?

  4. 4

    在python正则表达式中,为什么(h)*和(h)+不能产生相同的结果?

  5. 5

    为什么这两个代码片段会产生相同的结果?

  6. 6

    为什么这些操作不会产生相同的结果?管道进入。(点)

  7. 7

    为什么这两个代码片段会产生相同的结果?

  8. 8

    为什么不同JS对象中的my方法会产生相同的结果?

  9. 9

    为什么CSS文件不能产生相同的结果,这取决于它们是存储在Web上还是本地存储?

  10. 10

    d3.json()和JSON.parse()会产生相同的结果吗?

  11. 11

    在形态学打开和闭合产生相同结果的情况下?

  12. 12

    GZip在macOS和Linux上无法产生相同的压缩结果

  13. 13

    Java中的同步-新的ReentrantLock(true)和新的ReentrantLock(false)产生相同的结果吗?

  14. 14

    为什么在`(?!^)`和`(?<!^)`上产生相同的答案?

  15. 15

    Python-新手:为什么这个简单的if-elif(C case块的复制)总是产生相同的结果?

  16. 16

    正则表达式 - 为什么这两个表达式不会产生相同的结果?

  17. 17

    尝试使用 python 计算 EMA,但我无法弄清楚为什么我的代码总是产生相同的结果

  18. 18

    为什么类定义总是产生相同的字节码?

  19. 19

    在C ++和.NET中产生相同的随机数

  20. 20

    如何解决调用中的嘲笑_开放差异,但不能解决最终结果

  21. 21

    在两者中同时使用.Include()时,实体框架中的延迟加载和渴望加载会产生相同的结果吗?

  22. 22

    为什么 "puts 'foo'" 和 puts "foo\n" 在 Ruby 中会产生相同的输出?

  23. 23

    log和exp matlab函数为什么会产生相反的结果?

  24. 24

    which.max产生相同的结果

  25. 25

    随机排列函数产生相同的结果

  26. 26

    为什么optim()总是给我相同的结果?

  27. 27

    使用格式说明符%d和%u将类型转换〜0转换为(unsigned int)和(unsigned short),对于short产生相同的结果,但对于int产生不同的结果

  28. 28

    为什么Datomic在迭代时连续两次产生相同的临时ID?

  29. 29

    为什么这两个C语句都产生相同的输出

热门标签

归档