如何在不使用滞后值的情况下创建计算价格变化的新列?

时间:2018-09-19 17:46:22

标签: r zoo

所有人。感谢您抽出宝贵时间来查看我的问题。我很感激。

例如,我遇到R中滞后值的麻烦-我有下表:

Semiannual    Price    Start    End    Multiplier   
  2010 Q1      121      .04     .06         1
  2010 Q2      121      .065    .059       1.083
  2011 Q1      121      .061    .063       1.0338
  2011 Q2      121      .057    .087       0.904

以上是我对于某些投资组合ABC的样本股票数据。本质上,我的投资组合价格为t-0(即121),“开始”列是半年度开始时的开盘价,而“结束”列是半年度中的收盘价。我会在每个半年期结束时进行重新平衡,因此,我需要在整个期间保持价格(或我的基准)一致,这需要我将价格(121)乘以开盘价的百分比变化。新期间/期末的收盘价。所以理想情况下,我的结果应该是:

Semiannual    Price    Start    End    Multiplier   Actual Price
  2010 Q1      121      .04     .06         1         121
  2010 Q2      121      .065    .059       1.083      131.043
  2011 Q1      121      .061    .063       1.0338     135.4723
  2011 Q2      121      .057    .087       0.904      122.4669

但是我一生都无法获得将实际价格的滞后值乘以乘数的代码,因为开始计算时未定义该列。

我希望我有道理...

本质上采用的是实际价格的滞后值*每个季度的乘数,但第一季度本身就是自身(121)。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

无需查看先前的行... 可以使用cumprod()计算乘数,我将其称为temp_multiplier ..之后,价格计算就很容易..之后删除临时乘数。

df <- read.table(text="Semiannual    Price    Start    End    Multiplier   
2010-Q1      121      .04     .06         1
2010-Q2      121      .065    .059       1.083
2011-Q1      121      .061    .063       1.0338
2011-Q2      121      .057    .087       0.904", header = T)

library( tidyverse )

df %>% mutate ( temp_Multiplier = cumprod( Multiplier ),
                Actual_price = temp_Multiplier * Price ) %>%
  select ( -temp_Multiplier )

#   Semiannual Price Start   End Multiplier Actual_price
# 1    2010-Q1   121 0.040 0.060     1.0000     121.0000
# 2    2010-Q2   121 0.065 0.059     1.0830     131.0430
# 3    2011-Q1   121 0.061 0.063     1.0338     135.4723
# 4    2011-Q2   121 0.057 0.087     0.9040     122.4669