我想在特定的日期重新分配一个战略组合:
require(PerformanceAnalytics)
require(TTR)
require(quantmod)获取资产价格并获得每日离散收益。
tickers = c("ABI.BR","AI.PA","AIR.PA","ALV.DE","ASML.AS")
getSymbols(tickers, from="2012-01-01", to="2013-12-01")
close.prices = do.call(merge, lapply(tickers, function(x) Cl(get(x))))
colnames(close.prices) = c("Anheuser-Busch InBev",
"L'Air Liquide","AIRBUS GROUP","Allianz","ASML HLDG")
assets.ret = ROC(close.prices,type="discrete")[-1]现在,我通过将RSI函数应用于每个资产来获得RSI信号。
rsi.fct = function(x) RSI(x, n=20, maType = SMA)
rsi = xts(apply(close.prices, 2, rsi.fct),
order.by=index(rsi.fct(close.prices[,1]) ) )
> tail(rsi)
Anheuser-Busch InBev L'Air Liquide AIRBUS GROUP Allianz ASML HLDG
2013-11-22 51.15171 49.36494 60.25836 61.07143 46.84159
2013-11-25 54.95495 50.82237 63.54717 61.07143 49.63168
2013-11-26 49.65470 52.55102 58.29563 58.18182 48.59023
2013-11-27 54.60575 61.81980 57.94677 62.05674 52.11640
2013-11-28 46.52778 60.76994 57.85061 63.35616 45.70000
2013-11-29 50.99905 61.90476 56.09756 65.49296 48.82479策略如下:当RSI < 30时我购买资产,当RSI >= 30时不购买
ret.mat.rsi = lag(ifelse (rsi < 30, 1, 0))*assets.ret,这是我遇到问题的地方,。来自ret.mat.rsi的返回是每日的返回。假设我想在这个月的第一天查看rsi矩阵。
> rsi[110]
Anheuser-Busch InBev L'Air Liquide AIRBUS GROUP Allianz ASML HLDG
2012-06-01 39.66126 31.1599 30.39443 17.17647 43.85172我想购买我的投资组合中的前4种资产,因为它们的RSI都在30以下,在这个月剩下的时间里(不管是否有进一步的RSI信号),这些头寸将保持不变,直到下个月的第一天:
> rsi[131]
Anheuser-Busch InBev L'Air Liquide AIRBUS GROUP Allianz ASML HLDG
2012-07-02 84.69529 73.87205 66.25561 74.52642 71.65021我不想买任何资产的地方。
现在的整个问题是如何在特定日期,即每个月开始(也可以是每周或每三周)对投资组合进行自动重新分配。投资组合回报只应包括那些在重新分配日期满足指标条件(此处RSI < 30)的资产。
发布于 2014-12-09 13:22:55
我会如何编码你的例子:
require(quantmod)
tickers <- c("ABI.BR","AI.PA","AIR.PA","ALV.DE","ASML.AS")
myEnv <- new.env()
getSymbols(tickers, from="2012-01-01", to="2013-12-01", env=myEnv)
close.prices <- do.call(merge, eapply(myEnv, Cl))
close.prices <- close.prices[,pmatch(tickers,colnames(close.prices))]
colnames(close.prices) <- c("Anheuser-Busch InBev",
"L'Air Liquide","AIRBUS GROUP","Allianz","ASML HLDG")
assets.ret <- ROC(close.prices,type="discrete")[-1]
rsi.fct <- function(x) RSI(x, n=20, maType = SMA)
rsi <- xts(apply(close.prices, 2, rsi.fct), index(close.prices))现在,要回答您的问题,请使用GSee's startpoints function获取每个月的第一个RSI值。startpoints允许您选择任意数量的周、月、季度等作为再平衡期。
startpoints <- function (x, on = "months", k = 1) {
head(endpoints(x, on, k) + 1, -1)
}
# get the signal at the beginning of each month
rsi.signal <- lag(ifelse(rsi < 30, 1, 0))[startpoints(rsi),]
# rsi.signal is monthly; we need a daily series where each day has the
# value from the first day of the month, so we merge with an empty xts
# object that has the daily index and use na.locf to fill the gaps
rsi.signal <- merge(rsi.signal, xts(,index(rsi)), fill=na.locf)
# now calculate returns
rsi.ret <- rsi.signal * assets.rethttps://stackoverflow.com/questions/27375105
复制相似问题