2

特定の日に戦略ポートフォリオを再配分したい:

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

RSI が 30 を下回っているため、最初の 4 つの資産をポートフォリオに均等に加重して購入し、翌月の初日まで (その後の 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

資産を購入しないことを選択した場合。

全体の問題は、特定の日付、つまり毎月の初め (毎週または 3 週間ごとでもよい) にポートフォリオの自動再割り当てをエレガントにコーディングする方法です。ポートフォリオのリターンは、再配分日に指標条件 (ここでは RSI < 30) を満たす資産のみで構成される必要があります。

4

1 に答える 1