2015-01-14 3 views
0

첫 번째 열에 시작 달이 있고 두 번째 열에 월간 수익률 (아래 예제)이있는 n * 2 df가 있습니다. 날짜는 동물원 패키지를 사용하는 1 년 - 월 양식입니다.다른 길이의 계산 반복

각 시작 달 반환부터 시작하여 1 - 12 개월 수익을 계산하고 마지막 12 개 항목을 구성하는 복합 수익과 함께 n * 13 데이터 프레임을 생성하는 데 사용합니다 (단 2 : 1m 반환, Col 3 : 2m return, ... Col 13 : 12m return).

allreturns= function (x) { 
    cumprod(1+x/100)-1 } 

내 질문은 : 수익률을 계산하기 위해

, 나는 간단한 cumprod를 사용하고 반품 열을 아래로가는 길이하여이 기능을 모두 반복 lapply 적용 사용하는 영리한 방법이있다 (cumprod 매월 1:12) 그리고 시작 달까지? 이것은 모든 리턴 값 (for {i for length (sample $ monthlyreturns))과 같은 for 루프를 포함하는 것처럼 보이지만 더 나은 방법으로 수행하는 것이 더 좋을 것 같습니다.

고맙습니다 당신의 도움이!

structure(list(startmonth = structure(c(2005, 2005.08333333333, 
2005.16666666667, 2005.25, 2005.33333333333, 2005.41666666667, 
2005.5, 2005.58333333333, 2005.66666666667, 2005.75, 2005.83333333333, 
2005.91666666667, 2006, 2006.08333333333, 2006.16666666667, 2006.25, 
2006.33333333333, 2006.41666666667, 2006.5, 2006.58333333333, 
2006.66666666667, 2006.75, 2006.83333333333, 2006.91666666667 
), class = "yearmon"), monthlyreturns = c(7.60884596500546, 4.31712970370427, 
1.7181678651832, 4.86275367671624, 8.06177110411227, 8.07952171890065, 
7.45263583026826, 9.86292108893394, 4.06634262995794, 2.36454397207126, 
9.12716506049037, 3.72667369898409, 1.2204843852669, 7.80610600719228, 
0.640116988215595, 6.94793848553672, 1.73743493855, 2.57189674302936, 
4.7653386532329, 1.79362375289202, 7.56623527035117, 2.70907687023282, 
4.45359382545575, 5.50409059040248)), .Names = c("startmonth", 
"monthlyreturns"), row.names = c(NA, 24L), class = "data.frame") 
+0

'for' 루프의 문제점은 무엇입니까? ... 그 외에도 일부 재정 기능을 통해 1 ~ 12 개월의 수익 가치를 계산할 수 있어야합니다 ('CRAN'을 통해 충분히 이용할 수 있음). BTW, 입력의 각 행이 다른 달로 시작하기 때문에 이전 달 동안 출력 열이 0이 되길 원하거나 각 행이 다른 순방향 투영 기간을 다루고 싶습니까? –

+0

plyr가 더 예쁘고 빠릅니다. 미안 해요 : 나는 각 출력 열을 시작 달에 관계없이 앞으로 전달하고 싶습니다. 그래서 2005 년 1 월에 다음 열은 2005 년 2 월까지, 2005 년 2 월에는 2 번째 열은 2005 년 3 월까지입니다. –

+1

'for' 루프와'plyr' 두 가지를 모두 테스트 한 적이 있다면 w/your solution :-)으로 대답하십시오. –

답변

0

내가 당신을 요구하고 있지만, 다음과 같은 뭔가를 할 것입니다 정확히 이해 확실하지 않다? 귀하의 데이터가 반환 매트릭스에 있습니다.

cum_ret <- rollapply(returns[,2], width=12, FUN = function(x) cumprod(1+x/100)-1) 
cum_ret <- data.frame(Date=returns[1:nrow(cum_ret),1], cum_mon_ret=cum_ret) 
dates <- seq(as.Date(cum_ret$Date[1]), by = "month", length.out=nrow(returns)) 
col_lines <- rainbow(nrow(cum_ret)) 
plot(dates[1:12], cum_ret[1,-1], xlim=c(dates[1], tail(dates,1)), col=col_lines[1], type="b", pch=19, , ylab="Cummulative Returns", xaxt="n") 
for(i_plot in 2:nrow(cum_ret)) lines(dates[i_plot:(11 +i_plot)], cum_ret[i_plot,-1], col=col_lines[i_plot], type="b", pch=19) 
axis.Date(1, at=dates, format="%b-%y") 
grid(length(dates) + 1) 

Cummulative (12) 매월 시작되는 달의 수익은

입니다.

enter image description here

+0

코드가 OP의 소스 데이터에서 생성하는 출력을 게시하는 데 도움이됩니다. :-) –