【问题标题】:How to create on R a portfolio of 300 equally weighted stocks from a price time series and backtest the portfolio?如何在 R 上从价格时间序列中创建 300 只等权重股票的投资组合并回测投资组合?
【发布时间】:2021-06-15 00:57:48
【问题描述】:

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

你能帮我吗?我尝试关注其他帖子,但在创建投资组合时似乎不起作用,因此无法进行一些回测

【问题讨论】:

    标签: r portfolio back-testing


    【解决方案1】:

    有不同的软件包可以帮助您运行回测。哪个最合适(以及您是否要使用包)将取决于您要运行的回测的细粒度。

    这是一个示例,使用 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
    

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

    【讨论】:

      猜你喜欢
      • 2020-11-28
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2018-01-04
      • 2019-09-30
      • 1970-01-01
      相关资源
      最近更新 更多