2013-03-19 2 views
1

이것은 다른 여러 질문과 유사하지만 여전히 작동하도록 관리하지 못했습니다. 롤링 기능 (TGR 패키지의 runMAD)을 일련의 금융 정보 (거래 가격 및 거래량)에 적용하려고 시도하고 있지만 롤링 작업은 모두 일중이어야합니다 (즉, 다음 날이나 전날 일).xts 객체 목록에 롤링 함수 적용

데이터는 두 개의 열 (가격 및 볼륨)이있는 xts 개체로 저장됩니다. 이 객체를 하루에 나누어서 하루에 xts 객체의 목록을 만들었습니다. 나는 runMAD 함수를 매일 적용하고 4 열 (원래의 두 가격 및 볼륨 열, 그리고 나서 xts 객체)의 목록을 반환 할 수 있기를 바랬습니다. runMAD 가격을위한 두 가지 새로운 모델, runMAD 볼륨). 그러나 lapply은 일 수와 동일한 길이의 목록 만 반환 할 수 있으므로 일일 평균과 같은 기능이 작동하지만 롤링 기능을 사용하여 하루에 여러 결과가 나올 수있는 방법을 모를 수 있습니다. 궁극적으로, 가격 및 볼륨의 각 행을 테스트하여 중앙값에서의 편차가 각각의 롤링 MAD보다 3 배 큰지 확인하고 싶습니다. 그런 인스턴스는 변수 (xts 인덱스 포함)에 저장됩니다.

sample data: 
2011-01-02 09:11:00  20.20  20000 
2011-01-02 10:42:00  20.40  50000 
2011-01-02 12:33:00  20.90  5000 
2011-01-02 12:33:00  20.90  10000 
2011-01-02 13:25:00  20.90  10000 
2011-01-02 15:36:00  20.90  50000 
2011-01-02 15:39:00  20.90  50000 
2011-01-02 16:12:00  20.90  15000 
2011-01-02 16:33:00  20.90  50000 
2011-01-02 17:04:00  20.90  50000 
2011-01-02 17:05:00  20.90  50000 
2011-01-02 18:26:00  20.90  10000 
2011-01-03 09:21:00  20.20  20000 
2011-01-03 11:19:00  20.40  50000 
2011-01-03 17:33:00  20.90  5000 
2011-01-06 12:33:00  20.90  10000 
2011-01-06 13:25:00  20.90  10000 
2011-01-06 15:36:00  20.90  50000 
2011-01-06 15:39:00  20.90  50000 
2011-01-06 16:20:00  20.90  15000 
2011-01-06 16:20:00  20.90  50000 
2011-01-06 17:24:00  20.90  50000 
2011-01-06 17:55:00  20.90  50000 
2011-01-06 18:49:00  20.90  10000 

[EDIT : GSEE의 의견에 따라, 여기에 데이터의 확대 (& 고정) 샘플 dput이다]

dput(head(sample.data,200)) 
structure(c(23.48, 19.08, 22.43, 21.75, 19.78, 19.76, 23.11, 23.31, 19.58, 19.28, 23.68, 23.47, 22.13, 23.17, 24.53, 22.79, 20.28, 19.73, 22.05, 19.23, 22.40, 23.43, 20.40, 23.58, 19.94, 19.58, 21.70, 20.65, 21.69, 24.09, 22.21, 21.42, 19.48, 24.20, 23.37, 24.68, 21.64, 23.24, 23.59, 19.61, 21.89, 23.21, 19.47, 24.77, 19.64, 19.61, 21.07, 24.68, 20.20, 23.37, 24.47, 22.55, 19.64, 22.73, 23.94, 21.31, 19.69, 19.51, 21.27, 20.47, 23.67, 23.42, 20.56, 20.60, 22.23, 22.16, 20.78, 21.47, 24.82, 19.34, 19.08, 24.92, 24.12, 20.46, 21.67, 22.25, 19.16, 22.47, 24.00, 23.32, 21.13, 23.67, 20.35, 20.80, 23.48, 21.22, 21.51, 21.91, 24.06, 22.17, 24.23, 22.43, 24.94, 20.99, 24.93, 22.48, 21.74, 19.18, 21.14, 21.89, 20.23, 24.80, 22.81, 20.96, 24.30, 21.11, 23.69, 23.20, 20.09, 23.09, 21.56, 20.93, 22.97, 24.53, 23.96, 19.33, 24.63, 19.27, 19.57, 21.40, 24.04, 22.37, 24.95, 21.37, 24.01, 20.42, 21.82, 19.06, 23.08, 20.37, 21.28, 19.87, 21.84, 20.95, 20.89, 24.59, 19.18, 24.26, 20.64, 22.12, 20.85, 24.31, 22.55, 24.32, 19.90, 24.58, 24.13, 21.55, 21.06, 20.84, 20.68, 23.47, 19.67, 21.82, 23.31, 19.67, 19.45, 24.56, 20.06, 24.46, 19.89, 21.57, 20.21, 24.20, 20.53, 19.91, 23.67, 22.95, 21.18, 21.57, 20.01, 19.36, 20.65, 19.75, 22.12, 19.79, 21.07, 24.77, 21.46, 20.64, 21.94, 19.81, 23.58, 22.48, 21.03, 19.37, 19.46, 22.68, 24.56, 21.40, 21.94, 23.27, 21.26, 20.34, 23.39, 21.97, 22.25, 22.40, 23.44, 24.38, 5900, 2400, 3100, 1200, 5100, 5700, 3400, 4900, 3900, 6400, 2600, 2200, 2800, 6200, 1100, 2500, 3500, 5900, 6600, 5100, 1800, 4200, 4500, 1200, 6200, 1400, 2800, 2400, 1500, 900, 2900, 3200, 5800, 3500, 4500, 4500, 4500, 6800, 5000, 4900, 5300, 6100, 3400, 1500, 6200, 1500, 5400, 5800, 800, 6300, 5000, 3400, 5500, 5600, 2100, 3700, 4400, 3100, 4600, 2700, 2700, 2700, 2600, 1200, 1700, 2900, 5300, 4900, 2600, 3100, 4000, 6000, 2500, 3000, 6500, 3600, 5900, 2300, 1600, 1300, 4800, 3800, 4000, 1500, 5600, 5500, 1500, 3100, 1300, 3200, 1500, 1400, 1400, 4600, 5300, 5600, 1200, 1500, 6100, 2200, 6700, 1700, 4000, 6200, 2700, 1100, 4500, 5400, 1600, 2600, 5700, 4100, 7000, 2300, 2600, 5100, 4500, 1900, 2400, 2600, 6900, 2100, 3500, 3600, 2900, 900, 2800, 2200, 4900, 1700, 3000, 800, 2500, 6100, 3300, 6500, 2600, 6200, 900, 4000, 6600, 6400, 1000, 4800, 6900, 4000, 2800, 1200, 6200, 2700, 1300, 1200, 2800, 1300, 5900, 4000, 3900, 5300, 2400, 4700, 6900, 2900, 6200, 3300, 6900, 2200, 1800, 5500, 2000, 6400, 3500, 5300, 5000, 6700, 4500, 3200, 1700, 3300, 5000, 5800, 4900, 2100, 1200, 5200, 1000, 900, 2600, 1000, 5500, 3400, 1600, 4700, 1500, 5900, 6900, 3700, 4900, 5700, 900, 2400), class = c("xts", "zoo"), .indexCLASS = c("POSIXlt", 
"POSIXt"), .indexTZ = "", tclass = c("POSIXlt", "POSIXt"), tzone = "", index = structure(c(1325584080, 1325594940, 1325594940, 1325604600, 1325759100, 1325762520, 1325762520, 1325769300, 1325769300, 1325848080, 1325864880, 1326128220, 1326196500, 1326196500, 1326196500, 1326196500, 1326196500, 1326196500, 1326209700, 1326279480, 1326283620, 1326288300, 1326288300, 1326289680, 1326289680, 1326289680, 1326292320, 1326294060, 1326294600, 1326297600, 1326387000, 1326456720, 1326467160, 1326711600, 1326723000, 1326724260, 1326809940, 1326814860, 1326885960, 1326885960, 1326889980, 1326894000, 1326895200, 1326895200, 1326898080, 1326986700, 1326987240, 1326992100, 1327072140, 1327328040, 1327328040, 1327328040, 1327417920, 1327423140, 1327424820, 1327425240, 1327483200, 1327496520, 1327570320, 1327570320, 1327575420, 1327588680, 1327588980, 1327595880, 1327595880, 1327595880, 1327664820, 1327674720, 1327680660, 1327680780, 1327680780, 1327683960, 1327914300, 1327914300, 1327915260, 1327918140, 1327924860, 1327924920, 1327924980, 1327924980, 1327927680, 1328013360, 1328014200, 1328025000, 1328025000, 1328026740, 1328089440, 1328091360, 1328091360, 1328110620, 1328111340, 1328111340, 1328112420, 1328113800, 1328193540, 1328194080, 1328194140, 1328196720, 1328274360, 1328274420, 1328278320, 1328519280, 1328520120, 1328520600, 1328520600, 1328524140, 1328527980, 1328531580, 1328540880, 1328540880, 1328547600, 1328547660, 1328547720, 1328547780, 1328607060, 1328608080, 1328618760, 1328623380, 1328623380, 1328625720, 1328631480, 1328717760, 1328717880, 1328793000, 1328797980, 1329132840, 1329210480, 1329215400, 1329215820, 1329215820, 1329219480, 1329223140, 1329300900, 1329301620, 1329315240, 1329315240, 1329388740, 1329389700, 1329390000, 1329390000, 1329390180, 1329391860, 1329391860, 1329391860, 1329402120, 1329467700, 1329467700, 1329469080, 1329469080, 1329471300, 1329477000, 1329477000, 1329489840, 1329732660, 1329732660, 1329733080, 1329745980, 1329745980, 1329750120, 1329750120, 1329750780, 1329753780, 1329753780, 1329753900, 1329754080, 1329754260, 1329755520, 1329755520, 1329755820, 1329755880, 1329755880, 1329756000, 1329815040, 1329815040, 1329826380, 1329840000, 1329841200, 1329841200, 1329842220, 1329901080, 1329901200, 1329901200, 1329901680, 1329901680, 1329902040, 1329902100, 1329902100, 1329902100, 1329902340, 1329902340, 1329902340, 1329902520, 1329902880, 1329902880, 1329906720, 1329906840, 1329908460, 1329910980, 1329911880, 1329914400), tzone = "", tclass = c("POSIXlt", "POSIXt")), .Dim = c(200L, 2L), .Dimnames = list(NULL, c("sample.dataprice", "sample.datavol"))) 

이 동일한 시간에 다수의 거래 종종 있으며 그러한 경우에 나는 runMAD이 각각을 별도로 보길 원합니다. 또한, runMAD의 창은 특정 날의 거래 수보다 클 수도 있고, 그런 경우에는 해당 일을 무시하고 싶습니다. 또는 가능하다면 숫자에 동적으로 runMAD의 창 크기를 줄이십시오. 그 날의 거래.

내 데이터의 STR :

str(sample.data)

An ‘xts’ object on 2012-01-03 09:11:00/2012-03-30 18:49:00 containing: 
    Data: num [1:459, 1:2] 22.6 22.5 22.5 22.5 22.8 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:2] "sample.dataprice" "sample.datavol" 
    Indexed by objects of class: [POSIXlt,POSIXt] TZ: 
    xts Attributes: 
NULL 
일에

I split이 다음 runMAD :

sample.data.days <- split.xts(sample.data, f="days") 
require(TTR) 
runMAD(sample.data.days, n=6, stat="median", cumulative=FALSE, constant=1) 
*Error in runMedian(x, n, cumulative = cumulative) : (list) object cannot be coerced to type 'double'* 

보다 적은 수의 관측이 있습니다 일 runMAD을 적용 피하기 위해 시도 창 길이, 나는 충분한 관측을 가진 일만을 지킨다 :

,451,515,
sample.data.days6<- sample.data.days[vapply(sample.data.days, FUN=nrow, FUN.VALUE=0L)>6] 

나는이 시도했다 :

do.call(runMAD, lapply(as.numeric(index(sample.data.days6)), function(x) runMAD(sample.data.days6, constant=1))) 

을하지만 runMedian (X, N, 누적 = 누적)에 오류 (위와 동일한 오류가 발생합니다 : (목록) 객체에 강요 할 수 없다 'double'을 입력하십시오).

대신 일에 침입 목록에 데이터를 넣어, 나는이 시도했습니다 :

apply.daily(sample.data, function(d){ 
    c(runMAD_price = runMAD(d$sample.data[, 1], n=6), 
    runMAD_volume = runMAD(d$sample.data[, 2], n=6), 
) 
}) 
*Error in array(x, c(length(x), 1L), if (!is.null(names(x))) list(names(x), : 'data' must be of a vector type 

이 질문의 약간의 변화가 동일 움직이는 시간 동안 할 수있는 방법을 볼 수있다 창 이동 (예 : 1 시간) 대신 거래 창 이동.

윈도우가 시간 기반인지 관측 기반인지에 관계없이 특정 윈도우의 중앙값에서 값 (가격 또는 볼륨)의 편차를 MAD로 나눈 모든 관측 값을 포함하는 xts 객체를 생성하고 싶습니다 (중간 창에서) 특정 임계 값 (예 : 3) 이상입니다. 관측치의 절반이 동일하면 MAD가 0이 될 것이므로 0을 이전 MAD> 0으로 바꾸고 싶습니다.

+0

재현성있는 데이터를 추가하십시오. 첫 번째 단계는'do.call (rbind, lapply (split, x, "days"), runMAD))'와 같은 일을하는 것이지만, 데이터를 주면 더 쉽게 보여줄 것입니다. – GSee

+0

그러나 샘플에있는 일 중 5 개가 넘는 행은 없습니다. 따라서'runMAD'를 적용하려고 할 때 남은 데이터가 없습니다 – GSee

+0

죄송합니다 GSee, 더 큰 샘플을 가져 오면 바로 게시하겠습니다. – Rothsom

답변

1

sample.data.days 목록을 반복하고 각 요소에 runMAD을 적용해야합니다. 그런 다음 원본 개체와 다시 병합 할 수 있습니다. 예를 들면 다음과 같습니다.

library(TTR) 
data(sample_matrix) 
x <- as.xts(sample_matrix) 
close.months <- split(x$Close,"months") 
mad <- do.call(rbind, lapply(close.months, runMAD, n=6, constant=1)) 
y <- merge(x,Close.MAD=mad) 
+0

고마워요, 이것으로 완벽하게 해결되었습니다. 정말 도움을 주셨습니다! – Rothsom