【问题标题】:Computing stock returns from stock prices of multiple companies using a double for-Loop (without using a package)使用双 for 循环从多家公司的股票价格计算股票收益(不使用包)
【发布时间】:2023-04-01 02:36:01
【问题描述】:



我有一个包含多列(每列代表一家公司)和多行(由股票价格组成)的矩阵

我想在不使用包裹的情况下计算退货!

我尝试使用双 for 循环,但它不起作用,我收到错误:

“Portf_Returns[i, j] 中的错误

# Trying to compute Returns in a matrix of stock Prices with double for-loop
ClosingPrices <- sample(10,30,10) # I generate some random stock prices

Portf_ClosingPrices <- matrix(ClosingPrices,nrow = 10, ncol = 3) # 3 companies (3 colums) and 10 stock prices for each company

Portf_Returns <- NULL
i <- 1
j <- 1
for (j in 1:3) {
  for (i in 1:9) {
    Portf_Returns[i,j] <- Portf_ClosingPrices[i+1,j] / Portf_ClosingPrices[i,j] - 1
  }
}
Portf_Returns

【问题讨论】:

    标签: r stock


    【解决方案1】:

    您需要初始化矩阵以返回值:

    ClosingPrices <- sample(10,30,10) # I generate some random stock prices
    
    Portf_ClosingPrices <- matrix(ClosingPrices,nrow = 10, ncol = 3) # 3 companies (3 colums) and 10 stock prices for each company
    
    Portf_Returns <- matrix(NA,10,3)
    
    for (j in 1:3) {
      for (i in 1:9) {
        Portf_Returns[i,j] <- Portf_ClosingPrices[i+1,j] / Portf_ClosingPrices[i,j] - 1
      }
    }
    Portf_Returns
    
                [,1]       [,2]       [,3]
     [1,] -0.7500000  7.0000000 -0.8333333
     [2,]  2.0000000 -0.6250000  2.0000000
     [3,] -0.5000000  2.0000000  2.0000000
     [4,]  1.0000000  0.0000000  0.0000000
     [5,]  0.6666667 -0.7777778 -0.2222222
     [6,] -0.6000000  2.0000000  0.2857143
     [7,] -0.7500000  0.5000000 -0.8888889
     [8,]  2.0000000 -0.5555556  7.0000000
     [9,]  2.0000000  0.2500000 -0.1250000
    [10,]         NA         NA         NA
    

    【讨论】:

    • 非常感谢 StupidWolf,回复速度真快。因此,仅通过“Portf_Returns
    • 是的,你不能将值插入到没有维度的 NULL 中。希望这是有道理的。您可以通过执行 Portf_Returns = Portf_Returns[-nrow(Portf_Returns),] 或简单地从 Portf_Returns 开始删除最后一行
    【解决方案2】:

    您可以使用nested sapply,它在第一阶段计算每一行的回报,然后移动到另一列。您无需指定输出矩阵的维度。

    sapply(1:3, function(j) sapply(2:10, function(i) Portf_ClosingPrices[,j][i] / Portf_ClosingPrices[,j][i-1] - 1)) -> Portf_Returns
    
                [,1]       [,2]       [,3]
     [1,] -0.8000000  3.0000000  0.0000000
     [2,]  0.0000000  0.0000000 -0.3333333
     [3,]  3.5000000  0.1250000 -0.6666667
     [4,] -0.1111111 -0.4444444  2.5000000
     [5,]  0.2500000  0.0000000  0.4285714
     [6,] -0.5000000  0.8000000 -0.1000000
     [7,]  0.8000000 -0.5555556  0.0000000
     [8,] -0.1111111 -0.2500000 -0.5555556
     [9,]  0.2500000  2.3333333  1.0000000
    

    将 3 替换为 ncol(Portf_ClosingPrices),将 10 替换为 nrow(Portf_ClosingPrices),您就拥有了完全动态的效果。

    【讨论】:

    • 完美!!非常感谢。
    【解决方案3】:

    另一种选择是:

    exp(diff(log(Portf_ClosingPrices))) - 1
    

    输出:

                [,1]       [,2]       [,3]
     [1,]  1.0000000 -0.6000000 -0.3000000
     [2,]  1.0000000  2.5000000 -0.4285714
     [3,] -0.5000000  0.0000000  0.0000000
     [4,]  1.0000000 -0.7142857  0.2500000
     [5,] -0.7500000  1.0000000  0.2000000
     [6,]  9.0000000  0.2500000 -0.1666667
     [7,] -0.3000000 -0.8000000  0.0000000
     [8,] -0.1428571  5.0000000 -0.4000000
     [9,]  0.1666667 -0.3333333  2.0000000
    

    【讨论】:

      猜你喜欢
      • 2019-08-14
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      相关资源
      最近更新 更多