r-如何计算8年内3000种加密货币的周回报率..很快



我正试图想出一种方法来创建一个投资组合构建策略,购买上周回报率最高的硬币投资组合,并出售上周回报率最差的硬币投资组。

我有一个每周收盘价的数据集;CoinName"yyww";,以及";关闭";。

CoinName   yyww        Close
1       bitcoin 201401 8.549050e+02
2       bullion 201401 2.122034e+00
3   digitalcoin 201401 3.112048e-01
4      dogecoin 201401 2.841800e-04
5     earthcoin 201401 3.090447e-03
6   feathercoin 201401 4.227908e-01
7      freicoin 201401 8.091290e-02
8      goldcoin 201401 4.888827e-02
9  infinitecoin 201401 9.171350e-05
10       ixcoin 201401 1.215353e-01

AFAIK,我可以尝试将";CoinName";到列中,并循环一个x-y/y函数120万次,但我希望有一种更快、更有效的方法来做到这一点

这是一个data.table解决方案。

library(data.table)
dt1 <- 'CoinName   yyww        Close
bitcoin 201401 8.549050e+02
bullion 201401 2.122034e+00
digitalcoin 201401 3.112048e-01
dogecoin 201401 2.841800e-04
earthcoin 201401 3.090447e-03
feathercoin 201401 4.227908e-01
freicoin 201401 8.091290e-02
goldcoin 201401 4.888827e-02
infinitecoin 201401 9.171350e-05
ixcoin 201401 1.215353e-01'
dt1 <- fread(text = dt1, header = TRUE)
dt1[, Returns := (Close - c(0, Close[-.N]))/c(0, Close[-.N]), by = .(CoinName, yyww)]

编辑

下面的代码更通用,它预测了滞后收盘价的默认值
如果用户想要由函数进行返回计算的代码,则该选项是计算Returns2的代码行。这可能是更清晰的代码,由用户选择。

本例中使用的数据是在文章末尾创建的。

returns <- function(x, default = NA_real_) {
n <- length(x)
(x - c(default, x[-n])) / c(default, x[-n])
}
dflt <- 0
dt1[, Returns := (Close - c(dflt, Close[-.N]))/c(dflt, Close[-.N]), by = CoinName]
dt1[, Returns2 := returns(Close, default = dflt), by = CoinName]
dt1
#>           CoinName   yyww         Close    Returns   Returns2
#>    1:      bitcoin 201401 854.905000000        Inf        Inf
#>    2:      bullion 201401   2.122034000        Inf        Inf
#>    3:  digitalcoin 201401   0.311204800        Inf        Inf
#>    4:     dogecoin 201401   0.000284180        Inf        Inf
#>    5:    earthcoin 201401   0.003090447        Inf        Inf
#>   ---                                                        
#> 4086:  feathercoin 202252   0.803213105 -0.5375175 -0.5375175
#> 4087:     freicoin 202252   0.190194680 -0.7134762 -0.7134762
#> 4088:     goldcoin 202252  -0.353006903 -1.1758555 -1.1758555
#> 4089: infinitecoin 202252   2.221135121  0.7175929  0.7175929
#> 4090:       ixcoin 202252   1.094813340 -0.6150876 -0.6150876

创建于2022-10-26,reprex v2.0.2


数据创建代码

dt1 <- 'CoinName   yyww        Close
bitcoin 201401 8.549050e+02
bullion 201401 2.122034e+00
digitalcoin 201401 3.112048e-01
dogecoin 201401 2.841800e-04
earthcoin 201401 3.090447e-03
feathercoin 201401 4.227908e-01
freicoin 201401 8.091290e-02
goldcoin 201401 4.888827e-02
infinitecoin 201401 9.171350e-05
ixcoin 201401 1.215353e-01'
dt1 <- fread(text = dt1, header = TRUE)
set.seed(2022)
tmp <- lapply(1:51, (d) {
dt1$yyww <- dt1$yyww + d
dt1$Close <- dt1$Close + rnorm(nrow(dt1), mean = 1)
dt1
})
tmp <- do.call(rbind, tmp)
tmp <- lapply(1:8, (y) {
tmp$yyww <- tmp$yyww + 100 * y
tmp$Close <- tmp$Close + rnorm(nrow(tmp))
tmp
})
tmp <- do.call(rbind, tmp)
dt1 <- rbind(dt1, tmp)
dim(dt1)
#> [1] 4090    3

创建于2022-10-26,reprex v2.0.2

最新更新