波動性

R中滾動波動的回測

  • May 13, 2018

所以我是 R 的新手。我想對 3 隻股票 SPY、EEM、AGG 的策略進行回測。

使用庫(RiskPortfolios),我可以計算

optimalPortfolio(Sigma = Sigma, 
                control = list(type = 'invvol',constraint = 'lo')) 

這給了我在股票價格可用的整個時間段內的反向波動率。

如果我想根據過去 20 個交易日的波動率計算 inv vol 權重怎麼辦?

我還想每月使用基於過去 20 個交易日波動率的新權重來重新平衡投資組合,而不是在整個時間內保持相同的權重。我聽說我可以用包(PerformanceAnalytics)做到這一點,但我不知道怎麼做。

這是一個草圖,如何使用btest PMwR 包中的函式完成這樣的回測。該軟體包不在 CRAN 上,但可從 https://github.com/enricoschumann/PMwR獲得。(披露:我是包作者。)

的主要輸入btest是一個計算目標投資組合的函式,無論是作為實際頭寸還是作為權重。在您的情況下,它可能如下所示:

inv_vol <- function() {

   ## get prices for last 20 days
   ## and compute returns
   R <- returns(Close(n = 20))

   optimalPortfolio(Sigma = cov(R),
                    control = list(type = 'invvol',
                                   constraint = 'lo'))    
}

我應該在這裡警告我從未使用過這個RiskPortfolios包。如果您真的只想要與反向 vol 成比例的投資組合權重,您可以編寫如下函式:

inv_vol2 <- function() {

   ## get prices for last 20 days
   ## and compute returns
   R <- returns(Close(n = 20))

   w <- 1/apply(R, 2, sd)
   w/sum(w)
}

這將是完整的範例。我先準備一些數據。我無法AAG從雅虎獲得你的股票價格數據,所以我替換了它。只需插入您的價格:它們應該儲存為動物園系列prices並且沒有缺失值。

library("PMwR")
library("RiskPortfolios")
library("tseries")
library("zoo")

start <- as.Date("2017-1-1")
ticker <- c("SPY", "EEM", "IUSB")

temp <- list()
for (t in ticker)
   temp[[t]] <- get.hist.quote(t, start = start,
                               quote = "AdjClose")

prices <- do.call(merge, temp)
colnames(prices) <- ticker
head(prices)

##                 SPY      EEM     IUSB
## 2017-01-03 220.0632 34.74012 48.47526
## 2017-01-04 221.3724 35.00487 48.50420
## 2017-01-05 221.1965 35.38727 48.60073
## 2017-01-06 221.9879 35.24019 48.52351
## 2017-01-09 221.2552 35.21078 48.56213
## 2017-01-10 221.2552 35.41669 48.55247

通過將數據和inv_vol函式傳遞給btest.

res <- btest(list(coredata(prices)),
            signal = inv_vol,
            do.rebalance = "lastofmonth",
            b = 20,  ## burnin
            convert.weights = TRUE, 
            initial.cash = 100,
            include.data = TRUE,
            timestamp = index(prices))

訪問結果:

## summary stats
summary(as.NAVseries(res))
## ---------------------------------------------------------
## 31 Jan 2017 ==> 11 May 2018   (323 data points, 0 NAs)
##         100         108.488
## ---------------------------------------------------------
## High                  111.86  (26 Jan 2018)
## Low                    99.35  (09 Mar 2017)
## ---------------------------------------------------------
## Return (%)               6.6  (annualised)
## ---------------------------------------------------------
## Max. drawdown (%)        4.2
## _ peak                111.86  (26 Jan 2018)
## _ trough              107.11  (08 Feb 2018)
## _ underwater now (%)     3.0
## ---------------------------------------------------------
## Volatility (%)           3.5  (annualised)
## _ upside                 3.2
## _ downside               2.1
## ---------------------------------------------------------
## 
## Monthly returns  ▂▁▂▃█▅▃ 
## 
##      Jan  Feb Mar  Apr May Jun Jul Aug  Sep Oct Nov Dec  YTD
## 2017      0.0 0.8  1.0 1.1 0.3 1.6 0.9 -0.1 1.2 0.6 0.9  8.5
## 2018 2.1 -2.2 0.4 -0.9 0.6                              -0.1



## trades
journal(res)
##     instrument   timestamp        amount      price
## 1          SPY  2017-02-28   0.158031858  231.03508
## 2          EEM  2017-02-28   0.464671930   37.25028
## 3         IUSB  2017-02-28   0.938666713   48.90283
## [....]
##
## 48 transactions  

## raw equity series (zoo series)
as.zoo(as.NAVseries(res))

引用自:https://quant.stackexchange.com/questions/39759