【问题标题】:Rolling changes of values and percentage数值和百分比的滚动变化
【发布时间】:2018-06-14 05:52:38
【问题描述】:

我正在帮助一位朋友完成 R 课程的一些 R 作业(因为课程中涵盖的所有内容和补充材料都无济于事)。

我们有两个数据集。一个包含公司份额的每日离散回报百分比,另一个包含两种货币的每日汇率,比如美元兑瑞士法郎。它看起来像这样:

Date    Mon    Day       Exchangerate     
2000    01     01        1.03405   
2000    01     02        1.02987   
2000    01     03        1.03021   
2000    01     04        1.03456  
2000    01     05        1.03200 

以及每日离散收益:

  Date       Share1     
20000104   -0.03778   
20000105    0.02154   
20000106    0.01345   
20000107   -0.01234   
20000108   -0.01789   

任务是编写一个函数,该函数使用两个矩阵并从瑞士投资者的角度计算每日回报。我们假设初始投资为 1000 美元。

我尝试使用 tidyverse 并使用 dplyr 的 lag 函数计算一天到另一天的总回报和百分比变化,如下面提供的代码所示。

library(tidyverse)
myCHFreturn <- function(matrix1, matrix2) {
total = dplyr::right_join(matrix1, matrix2, by = "date") %>%
dplyr::filter(!is.na(Share1)) %>%
dplyr::select(-c(Date, Mon, Day)) %>%
dplyr::mutate(rentShare1_usd = (1+Share1)*1000,
              rentShare1_usd = dplyr::lag(rentShare1_usd) * (1+Share1),
              rentShare1_chf = rentShare1_usd*Exchangerate,

              rentShare1_chfperc =(rentShare1_chf - dplyr::lag(rentShare1_chf))/dplyr::lag(rentShare1_chf),
              rentShare1_chfperc = rentShare1_chfperc*100)
}

问题在于函数的rentShare1_usd = dplyr::lag(rentShare1_usd) * (1+Share1) 部分依赖于为初始1000 美元投资计算的值。因此,我的看法是,我们需要基于初始投资对变化进行某种类型的滚动计算。但是,我不知道如何在函数中实现这一点,因为我只使用滚动方式。我们想根据变量 Share1 中给出的变化和前一天的投资​​价值来计算每日收益。很感谢任何形式的帮助。

【问题讨论】:

    标签: r tidyverse rollapply rolling-computation


    【解决方案1】:

    至少为您指出解决方案的一部分,任何一天的单位份额价值是相关时间段内从开始日期到该日期的累积乘积 (1 + daily_discrete_return)。以使用每日离散收益表的扩展版本为例:

    df = read.table(text = "Date Share1
    20000104    -0.03778
    20000105    0.02154
    20000106    0.01345
    20000107    -0.01234
    20000108    -0.01789
    20000109    0.02154
    20000110    0.01345
    20000111    0.02154
    20000112    0.02154
    20000113    0.01345", header = TRUE, stringsAsFactors = FALSE)
    
    library(dplyr)
    
    Shares = 1000
    
    df1 = mutate(df, ShareValue = cumprod(1+Share1) * Shares)
    
           Date   Share1 ShareValue
    1  20000104 -0.03778   962.2200
    2  20000105  0.02154   982.9462
    3  20000106  0.01345   996.1668
    4  20000107 -0.01234   983.8741
    5  20000108 -0.01789   966.2726
    6  20000109  0.02154   987.0862
    7  20000110  0.01345  1000.3625
    8  20000111  0.02154  1021.9103
    9  20000112  0.02154  1043.9222
    10 20000113  0.01345  1057.9630
    

    一旦您获得了包含该日期股票价值的表格,您就可以将其连接回您的汇率表格,以计算该日期的瑞士货币等值,并将其扩展以进行百分比变化等.

    【讨论】:

    • 非常感谢!这确实有很大帮助,并且避免了滚动计算。
    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多