2013-03-19 4 views
1

Это похоже на несколько других вопросов, но мне все еще не удалось заставить его работать. Я пытаюсь применить функцию качения (runMAD от пакета TTR) к ряду финансовой информации (торговая цена и объем), но операция прокатки должна быть внутридневной (то есть не пересекаться на следующий день или с предыдущего день).Применить функцию прокатки к списку объектов xts

Данные хранятся как объект xts с двумя столбцами (цена и объем). Я разделил этот объект на день, чтобы создать список объектов xts днем, надеясь, что я смогу применить функцию runMAD в течение каждого дня и вернуть список объектов xts с четырьмя столбцами (два оригинальных столбца цены и объема, а затем два новых для runMAD-цены и runMAD-volume). Кажется, однако, что lapply может возвращать только список длин, равный количеству дней, поэтому работа, подобная ежедневному средству, будет работать, но не будет уверенной, как получить функции прокатки для работы, которые вызывают множество результатов в день. В конечном счете, я хотел бы протестировать каждую строку цены и объема, чтобы увидеть, является ли ее отклонение от медианы, скажем, в 3 раза больше, чем его текущая MAD. Такие экземпляры затем сохраняются в переменной (с индексом 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 может быть больше, чем количество сделок в определенный день, и в таких случаях я хотел бы игнорировать (NA) в тот день - или, если возможно, уменьшить размер окна runMAD динамически до номера торгов в тот день.

ул моих данных:

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 

Я 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 в дни, где есть меньше наблюдений, чем длина окна, я сохраняю только дни с достаточными наблюдениями:

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 (х, п, накопленный = кумулятивный): (список) объект не может быть принужден к тип '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 час) вместо движущегося окна торгов.

Независимо от того, является ли окно временем или основано на наблюдении, я бы хотел создать объект xts, содержащий все наблюдения, для которых отклонение значения (цены или объема) от медианного окна определенного окна, разделенное на MAD (в середине окна), превышает определенный порог (например, 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

Смежные вопросы