我有300只股票(例如,这里我向您展示了5只(,我如何创建一个同等权重的投资组合,然后对其进行回溯测试?
Book1
# A tibble: 3,385 x 6
...1 AAA BBB CCC DDD EEE
<dttm> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2007-02-08 00:00:00 100 100 100 100 100
2 2007-02-09 00:00:00 100. 100. 100. 100. 101.
3 2007-02-12 00:00:00 100. 100. 100. 100. 101.
4 2007-02-13 00:00:00 99.9 99.9 100. 99.9 100.
5 2007-02-14 00:00:00 100. 100. 99.9 100. 99.9
6 2007-02-15 00:00:00 100. 100. 99.9 100. 99.5
7 2007-02-16 00:00:00 100. 100. 100. 100. 100.
8 2007-02-20 00:00:00 100. 100. 99.9 100. 100.
9 2007-02-21 00:00:00 101. 100. 100. 100. 101.
10 2007-02-22 00:00:00 101. 101. 100. 100. 102.
# ... with 3,375 more rows
你能帮我吗?我试着关注其他帖子,但在创建投资组合时似乎不起作用,因此无法进行一些的回溯测试
有不同的包可以帮助您运行回溯测试。哪一个是最合适的(以及您是否想要使用包(将取决于您想要运行的反测试的细粒度。
这里有一个例子,使用PMwR
包(我维护它(。首先,我使用Kenneth French网站上的数据创建了一个由五项资产组成的数据集。
library("PMwR")
library("NMOF")
P <- French(tempdir(),
"5_Industry_Portfolios_daily_CSV.zip",
frequency = "daily",
price.series = TRUE)
head(P)
## Cnsmr Manuf HiTec Hlth Other
## 1926-06-30 1.000000 1.000000 1.000000 1.000000 1.000000
## 1926-07-01 0.999200 1.002200 0.998900 1.009700 1.002100
## 1926-07-02 1.003796 1.009115 1.001997 1.011013 1.003202
## 1926-07-06 1.006507 1.011941 1.005203 1.013338 1.001296
## 1926-07-07 1.006406 1.013054 1.006409 1.016682 1.002798
## 1926-07-08 1.008821 1.013966 1.010234 1.025934 1.006709
这五个序列现在存储在一个名为P
的数据帧中。对同等权重的投资组合进行回溯测试可能如下所示:
bt <- btest(prices = list(as.matrix(P)),
timestamp = as.Date(row.names(P)),
signal = function(k) rep(1/k, k),
do.signal = "lastofquarter",
initial.cash = 100,
convert.weights = TRUE,
k = 5)
结果:
journal(bt)
## instrument timestamp amount price
## 1 Cnsmr 1926-09-30 18.13189758568 1.1082127
## 2 Manuf 1926-09-30 19.15734113773 1.0465962
## 3 HiTec 1926-09-30 19.00858248070 1.0538398
## 4 Hlth 1926-09-30 18.63527183032 1.0685114
## 5 Other 1926-09-30 18.75046122697 1.0696270
## 6 Cnsmr 1926-12-31 -0.15078058427 1.1441818
## 7 Manuf 1926-12-31 -0.03046886314 1.0757494
## ....
summary(as.NAVseries(bt))
## ---------------------------------------------------------
## 30 Jun 1926 ==> 29 Jan 2021 (24,916 data points, 0 NAs)
## 100 1528568
## ---------------------------------------------------------
## High 1590130.44 (20 Jan 2021)
## Low 43.43 (08 Jul 1932)
## ---------------------------------------------------------
## Return (%) 10.7 (annualised)
## ---------------------------------------------------------
## Max. drawdown (%) 82.3
## _ peak 245.20 (03 Sep 1929)
## _ trough 43.43 (08 Jul 1932)
## _ recovery (13 Jun 1944)
## _ underwater now (%) 3.9
## ---------------------------------------------------------
## Volatility (%) 18.1 (annualised)
## _ upside 14.4
## _ downside 11.5
## ---------------------------------------------------------
##
## Monthly returns ▁▁▆█▁▁▁
##
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec YTD
## 1926 0.0 0.0 0.0 -2.4 3.4 2.2 3.1
## 1927 1.2 4.0 1.2 1.5 5.5 -1.2 8.0 1.9 5.0 -2.2 6.0 1.7 37.2
## 1928 0.1 -1.7 9.7 3.5 3.4 -4.2 1.0 8.4 1.7 1.2 10.5 0.7 38.8
## 1929 5.5 -0.2 -0.2 1.6 -5.5 9.2 5.1 7.6 -5.7 -18.8 -11.3 1.7 -14.1
## 1930 5.0 3.2 6.7 -2.3 -1.1 -14.6 4.6 2.1 -11.4 -8.0 -2.6 -7.3 -24.9
## 1931 7.2 10.0 -4.7 -8.0 -12.5 13.1 -4.9 0.1 -28.8 8.0 -8.8 -11.2 -39.4
## ....
## 2020 -0.5 -8.0 -12.7 13.4 5.0 1.6 5.4 6.6 -3.2 -2.2 12.3 4.4 20.6
## 2021 0.0 0.0
正如我所说,有很多不同的方式,以及你必须做出的许多决定(交易成本、重新平衡的频率等(;但我希望这个例子能让你开始。