如何在R上从价格时间序列中创建一个由300只同等权重股票组成的投资组合,并对投资组合进行回溯测试



我有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

正如我所说,有很多不同的方式,以及你必须做出的许多决定(交易成本、重新平衡的频率等(;但我希望这个例子能让你开始。

最新更新