我正试图想出一种方法来创建一个投资组合构建策略,购买上周回报率最高的硬币投资组合,并出售上周回报率最差的硬币投资组。
我有一个每周收盘价的数据集;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