基于投资组合变化的概率数据矩阵

时间:2018-10-02 18:53:36

标签: r probability portfolio

我有一个像这样的大面板数据的数据框

Date        Firms   Portfolio
2007-02-01    A      1
2007-02-01    B      1
2007-02-01    C      2
2007-02-01    D      2
2007-02-01    E      3
2007-02-01    F      3

2007-03-01    C      1
2007-03-01    B      1
2007-03-01    A      2
2007-03-01    F      2
2007-03-01    E      3
2007-03-01    D      3

每个期间都有固定数量的投资组合(上例中为三个)。现在,我想创建一个逻辑概率矩阵。

            port1   port2   port3
port1        0.5    0.5      0
port2        0.5    0       0.5
port3        0      0.5     0.5

如果考虑期间1的投资组合1,则组合为A和B。但是在期间2中,投资组合1的价格为B和C,这意味着下一个期间50%的股票(仅B)保留在投资组合1中。投资组合1的其他50%的股票流向投资组合2,因为股票A在2007-03-01期间位于投资组合2中。投资组合3在第二个周期(2007-03-01)中具有E和D,这意味着投资组合1中没有股票。因此,我们将port1-port3单元格分配为0。类似地,我希望在其他两个投资组合列中分配概率。

现在,如果此过程持续100个周期,我们将有99个这样的矩阵。但是我需要一个矩阵来表示这99个矩阵的平均值。

1 个答案:

答案 0 :(得分:0)

这是使用dplyrtidyr的一种方法:

library(dplyr); library(tidyr)
a <- data %>%

  # First get long-format listing of all Date-Firms shifts
  arrange(Date, Firms) %>%
  group_by(Firms) %>% 
  mutate(to = lead(Portfolio)) %>%
  rename(from = Portfolio) %>%
  ungroup() %>%

  # What share of that month's moves with that to & from?
  group_by(Date, from, to) %>%
  tally() %>%
  mutate(share = n / sum(n)) %>%
  ungroup() 

a表将以“长”格式保存所有概率矩阵,其中Datetofrom的每个现有组合都会排成一行。要获得所有矩阵的平均值(每一个矩阵都是a共享一个日期的所有行),我们可以取所有往返组合的平均值。

a_summary <- a %>%
  group_by(from, to) %>%
  summarize(avg = mean(share, na.rm = T)) %>%
  ungroup() %>%
  spread(from, avg, fill = 0)

> a_summary
# A tibble: 4 x 4
     to   `1`   `2`   `3`
  <int> <dbl> <dbl> <dbl>
1     1   0.5  0.75   0  
2     2   0.5  0      0.5
3     3   0    0.5    0.5
4    NA   1    1      1  

样本数据(添加了第三期):

data <- read.table(header = T, text = "
  Date        Firms   Portfolio
  2007-02-01    A      1
  2007-02-01    B      1
  2007-02-01    C      2
  2007-02-01    D      2
  2007-02-01    E      3
  2007-02-01    F      3

  2007-03-01    C      1
  2007-03-01    B      1
  2007-03-01    A      2
  2007-03-01    F      2
  2007-03-01    E      3
  2007-03-01    D      3

  2007-04-01    A      1
  2007-04-01    B      1
  2007-04-01    C      2
  2007-04-01    D      2
  2007-04-01    E      3
  2007-04-01    F      1")