2014-11-12 1 views
2

누군가가 한 기간 동안 얻은 총 수익과 반품의 표준 편차를 찾고 싶습니다. 나는 매우 유망 해 보이는 PerformanceAnalytics 패키지에 함수 apply.fromstart을 발견했습니다. 그러나 나는 그것을 구현하는 데 어려움을 겪고있다. 여기 R : apply.fromstart를 사용하여 반품 및 표준 편차를 계산하십시오.

내가 무엇을 가지고 : 기간 당 반환 등 다양한 데이터를 포함하는 dataframe :
HourlyData

 Time   Position 
2014-08-01 01:00:00  1.01  
2014-08-01 02:00:00  0.99 
2014-08-01 03:00:00  1.01 
2014-08-01 04:00:00  1.02 

다음과 같이 I는, 각 기간의 총 수익을 찾을 싶습니다

Period    TotalReturn 
2014-08-01 01:00:00  1.01  
2014-08-01 02:00:00  1.01*0.99 
2014-08-01 03:00:00  1.01*.099*1.01 
2014-08-01 04:00:00  1.01*.099*1.01*1.02 
내 코드는 현재 읽고

:
apply.fromstart(hourlyData[,2,drop = FALSE],FUN="*",width=1)

나는 그의 반환의 표준 편차를 찾고 싶다. 다음과 같이이 부분에 대한 나의 코드를 읽
apply.fromstart(hourlyData[,2,drop = FALSE],FUN="sd",width=1)

hourlyData$Position의 데이터 유형은 "동물원"

나는 다음과 같은 오류가 점점 오전 : 나는 확인했다 In zoo(NA, order.by = as.Date(time(R))) : some methods for “zoo” objects do not work if the index entries in ‘order.by’ are not unique

을하고, 중복이없는

> structure(list(Period = structure(c(1406844000, 1406847600, 
> 1406851200, 1406854800, 1406858400, 1406862000), class = c("POSIXct", 
> "POSIXt")), Login = c(173908L, 173908L, 173908L, 173908L, 173908L, 
> 173908L), NetExposureUSD = c(2188640, 2188730, 2189230, 2189000, 
> 2188310, 2187710), EquityUSD = c(9303.51, 9237.82, 8582.18, 9074.76, 
> 9929.96, 
> 10743.57), UnrealizedProfitUSD = c(-31.64, -97.33, -752.97, -260.39, 
> 594.81, 1408.42), DepositWithdrawal = c(0, 0, 0, 0, 0, 0), LaggedEquity = structure(c(0, 
> 9303.51, 9237.82, 8582.18, 9074.76, 9929.96), index = 1:6, class = "zoo"), 
>  Return = structure(c(0, -0.00706077598669755, -0.0709734547761268, 
>  0.0573956733603816, 0.0942394068823857, 0.0819348718423841 
> ), index = 1:6, class = "zoo"), Position = structure(c(1, 
>  0.992939224013302, 0.929026545223873, 1.05739567336038, 1.09423940688239, 
>  1.08193487184238), index = 1:6, class = "zoo"), SD = c(NA, 
>  NA, 0.0390979887599392, 0.0641847560185966, 0.0867288719859795, 
>  0.0187573743033249)), .Names = c("Period", "Login", "NetExposureUSD", "EquityUSD", "UnrealizedProfitUSD", 
> "DepositWithdrawal", "LaggedEquity", "Return", "Position", "SD"), 
> row.names = c("2014-08-01 01:00:00", "2014-08-01 02:00:00", 
> "2014-08-01 03:00:00", "2014-08-01 04:00:00", "2014-08-01 05:00:00", 
> "2014-08-01 06:00:00"), class = "data.frame") 
>         Period Login NetExposureUSD EquityUSD UnrealizedProfitUSD DepositWithdrawal LaggedEquity  
> Return Position   SD 2014-08-01 01:00:00 2014-08-01 01:00:00 
> 173908  2188640 9303.51    -31.64     0 
> 0.00 0.000000000 1.0000000   NA 2014-08-01 02:00:00 2014-08-01 02:00:00 173908  2188730 9237.82    -97.33   
> 0  9303.51 -0.007060776 0.9929392   NA 2014-08-01 03:00:00 
> 2014-08-01 03:00:00 173908  2189230 8582.18    
> -752.97     0  9237.82 -0.070973455 0.9290265 0.03909799 2014-08-01 04:00:00 2014-08-01 04:00:00 173908  2189000 9074.76    -260.39     0  8582.18 
> 0.057395673 1.0573957 0.06418476 2014-08-01 05:00:00 2014-08-01 05:00:00 173908  2188310 9929.96    594.81   
> 0  9074.76 0.094239407 1.0942394 0.08672887 2014-08-01 06:00:00 
> 2014-08-01 06:00:00 173908  2187710 10743.57    
> 1408.42     0  9929.96 0.081934872 1.0819349 0.01875737 
: 내 행 이름에 여기

는 dput를 실행 한 결과 (hourlyData)입니다3210
+0

'Reduce ('*', hourlyData $ Position)'를 사용할 수 없습니까? –

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 실행할 때 오류가 발생합니다 : '예상치 않은 줄이기'. 별도의 패키지를 설치해야합니까? – Mike

+0

'Reduce'는 기본 R입니다.'*'와 같이 역 따옴표에 * 넣어야합니다. 그것은 단지 코멘트에 허용하지 않습니다. –

답변

2

첫 번째 원하는 결과를 위해 매우 효율적인 벡터화 된 기본 R 함수 cumprod을 사용하십시오. 두 번째 결과는 간단한 *apply 루프를 사용하여 (덜 효율적으로) 달성 할 수 있지만 제안한

당신이 zoo 클래스를 유지하려는 경우, (sd를 들어

cumprod(hourlyData$Position) 
#   1   2   3   4   5   6 
# 1.0000000 0.9929392 0.9224669 0.9754125 1.0673348 1.1547867 

그렇지 않으면

cumprod(as.numeric(hourlyData$Position)) 
## [1] 1.0000000 0.9929392 0.9224669 0.9754125 1.0673348 1.1547867 

을 @akrun) (대신 vapply을 사용하여 최대 성능을 "압축"합니다.)

vapply(seq_len(nrow(hourlyData)), function(i) sd(hourlyData$Position[1:i]), FUN.VALUE = double(1)) 
# [1] NA 0.004992723 0.039097989 0.052519398 0.063598345 0.063156702 
+1

다시 한번 감사드립니다. – Mike

+1

@David Arenburg의 경우 '비공개'에 대해 [** 여기 **] (http://stackoverflow.com/questions/7474943/surprisingly-low-standard-deviation-in-r/7475664#7475664)를 볼 수 있습니다. - 누적 표준 편차의 '계산'을 적용합니다 (빠름). – Henrik

관련 문제