【问题标题】:Iteratively find the returns of a portfolio in R在 R 中迭代地找到投资组合的回报
【发布时间】:2021-04-26 22:48:24
【问题描述】:

问题如下:我有一个数据框,我们称之为DF,它看起来像这样:

    |Symbol |   Date    | volume |price |
    |------------------------------------
    |A      |2014-01-01 | 0      |   5  |
    |A      |2014-01-02 | 3      |   8  |
    |A      |2014-01-03 | 0      |   4  |
    |A      |2014-01-04 | 1      |  12  |
    |B      |2014-01-01 |45      |   9  |
    |B      |2014-01-02 |3       |   6  |
    |B      |2014-01-03 |34      |   7  |
    |B      |2014-01-04 |45      |  34  |
    |C      |2014-01-01 |4       |   5  | 
    |C      |2014-01-02 |9       |   7  |
    |C      |2014-01-03 |3       |   8  |
    |C      |2014-01-04 |0       |   3  | 

我需要为数据框中的每个日期计算价值加权投资组合回报,形成每日一系列回报。

通过以下代码行,我从数据框中提取了与单个日期对应的数据:

DF_1 <- DF[date=="2014-01-01"]

获取下一个数据帧:

    |Symbol |   Date    | volume |price |
    |------------------------------------
    |A      |2014-01-01 | 0      |   5  |
    |B      |2014-01-01 | 45     |   9  |
    |C      |2014-01-01 | 4      |   5  |

然后,我将volume 列的所有值相加:

(TOT_vol <- colSums(DF_1[ , 3, drop = FALSE]))

我创建了两个额外的列:weightR_i

DF_1$weight <- as.numeric(DF_1$volume)/TOT_vol
DF_1$R_i <- apply(DF_1[,c(4,5),drop=FALSE],1,prod)

获取下一个数据框:

    |Symbol |   Date    | volume |price | weight |  R_i |
    |----------------------------------------------------
    |A      |2014-01-01 | 0      |   5  |     0  |   0  |
    |B      |2014-01-01 | 45     |   9  |   0.91 |  8.19|
    |C      |2014-01-01 | 4      |   5  |   0.08 |   0.4|

最后我获得了该特定日期的价值加权回报,使R_i 列中的值变得疯狂:

(RM <- colSums(DF_1[,6,drop=FALSE]))

我的问题是我需要为数据框的所有日期找到 RM 并创建一个包含所有这些每日回报的系列;我是 R 的新手,我知道我必须设置一个 for 循环,但老实说,我不知道该怎么做。

此外,我想知道您是否可以找到一种更简单的方法来执行我所做的查找每日回报的操作。也就是说,无需在我的原始数据框中创建两个新列。

我期待任何帮助。非常感谢!

【问题讨论】:

    标签: r dataframe for-loop return calculated-columns


    【解决方案1】:

    你在找这个吗?

    library(dplyr)
    
    df %>% group_by(Date) %>%
      mutate(weight = volume/sum(volume),
             R_i = weight*price)
    
    # A tibble: 12 x 6
    # Groups:   Date [4]
       Symbol Date       volume price weight    R_i
       <chr>  <chr>       <int> <int>  <dbl>  <dbl>
     1 A      01-01-2014      0     5 0       0    
     2 A      02-01-2014      3     8 0.2     1.6  
     3 A      03-01-2014      0     4 0       0    
     4 A      04-01-2014      1    12 0.0217  0.261
     5 B      01-01-2014     45     9 0.918   8.27 
     6 B      02-01-2014      3     6 0.2     1.2  
     7 B      03-01-2014     34     7 0.919   6.43 
     8 B      04-01-2014     45    34 0.978  33.3  
     9 C      01-01-2014      4     5 0.0816  0.408
    10 C      02-01-2014      9     7 0.6     4.2  
    11 C      03-01-2014      3     8 0.0811  0.649
    12 C      04-01-2014      0     3 0       0 
    

    或者这个

    df %>% group_by(Date) %>%
      mutate(weight = volume/sum(volume),
             R_i = weight*price) %>%
      summarise(RM = sum(R_i))
    
    # A tibble: 4 x 2
      Date          RM
      <chr>      <dbl>
    1 01-01-2014  8.67
    2 02-01-2014  7   
    3 03-01-2014  7.08
    4 04-01-2014 33.5 
    

    输入

    > dput(df)
    structure(list(Symbol = c("A", "A", "A", "A", "B", "B", "B", 
    "B", "C", "C", "C", "C"), Date = c("01-01-2014", "02-01-2014", 
    "03-01-2014", "04-01-2014", "01-01-2014", "02-01-2014", "03-01-2014", 
    "04-01-2014", "01-01-2014", "02-01-2014", "03-01-2014", "04-01-2014"
    ), volume = c(0L, 3L, 0L, 1L, 45L, 3L, 34L, 45L, 4L, 9L, 3L, 
    0L), price = c(5L, 8L, 4L, 12L, 9L, 6L, 7L, 34L, 5L, 7L, 8L, 
    3L)), class = "data.frame", row.names = c(NA, -12L))
    

    【讨论】:

    • 是的!第二个正是我需要的,但我还有一个问题。从这里开始,如何创建包含日期和退货的数据框?非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2018-02-19
    • 2016-10-08
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多