减去所有对排列 R 中的列数据

ott*_*000 1 r tidy quantitative-finance dplyr

我的数据框中有每小时的价格数据,我需要减去所有排列才能找到金融交易的最佳配对。每列(不包括价格日期、时间)都可以被视为该股票在特定价格日期和时间的收盘价。这是数据:

test <- data.frame(pricedate = as.Date('2019-12-18'), hour = c(1,2,3,4,5), A = c(3,5,6,4,2), B = c(5,3,2,6,7), C = c(1,2,3,6,9))
Run Code Online (Sandbox Code Playgroud)

我想获得所有排列组合之间差异的新数据框(或表)。因此,“A减B”与“B减A”不同。我不需要从自身中减去一列。结果表看起来像这样:


Pricedate      Hour        A-B    A-C   B-A    B-C   C-A   C-B 

2019-12-18      1          -2      2     2      4     -2    -4
2019-12-18      2           2      3    -2      1     -3    -1
.
.
.
Run Code Online (Sandbox Code Playgroud)

我相信我需要数据保持这种形式,因为我想在此之后用 R 计算一些财务统计数据。

Jon*_*ing 5

这是一个 tidyverse 方法。首先,我们转换为更长的形式,其中每列 A:C 都表示在一个新行中,并且它来自哪一列的指定位于名为“col”的新列中。然后我们将该表连接到其自身,因此每一行都与共享相同日期和时间的所有行组合在一起。

然后我们计算差异,过滤掉行本身相减的行,将两个列标题合并为一个识别列,然后转换回宽格式。

library(tidyverse)

test_longer <- test %>%
  pivot_longer(A:C, names_to = "col", values_to = "val")

test_longer %>%
  left_join(test_longer, 
            suffix = c("1", "2"),
            by = c("pricedate", "hour")) %>%
  filter(col1 != col2) %>%
  mutate(dif = val1 - val2) %>%
  unite("col", c(col1, col2), sep = "-") %>%
  select(-c(val1, val2)) %>%
  pivot_wider(names_from = col, values_from = dif)


# A tibble: 5 x 8
  pricedate   hour `A-B` `A-C` `B-A` `B-C` `C-A` `C-B`
  <date>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2019-12-18     1    -2     2     2     4    -2    -4
2 2019-12-18     2     2     3    -2     1    -3    -1
3 2019-12-18     3     4     3    -4    -1    -3     1
4 2019-12-18     4    -2    -2     2     0     2     0
5 2019-12-18     5    -5    -7     5    -2     7     2
Run Code Online (Sandbox Code Playgroud)