2014-02-19 4 views
2

Я моделирую разработку книги заказов с течением времени. У меня есть первоначальная форма портфеля заказов в XTS, а затем последующие обновления глубины также в XTS:Рекурсивный цикл через xts

Начальная форма портфеля заказов выглядит следующим образом (все записи имеют одинаковое время):

      BID.price  size 
2014-02-11 23:59:42.494426 508.1000  10.0000000 
2014-02-11 23:59:42.494426 509.1200   8.0000000 
2014-02-11 23:59:42.494426 509.1000  10.0000000 

и последующие глубины udpates выглядеть следующим образом:

      BID. price  size 
2014-02-12 04:57:51.191514 508.1000  -10.00000000 
2014-02-12 04:57:51.640302 514.0000   10.00000000 

Что мне нужно, чтобы это:

1) для каждой строки обновлений сравните цену с портфель заказов:

1а) Если уровень цен обновления в портфель заказов уже, отрегулировать размер соответственно, так что в приведенном выше примере будет выглядеть следующим образом:

      BID.price  size 
2014-02-12 04:57:51.191514 509.1200   8.0000000 
2014-02-12 04:57:51.291514 509.1000  10.0000000 

(уровень цен 508,10000 был удален, и время было обновлено)

1b) Если обновление глубины не в портфеле заказов еще добавить новый уровень призового с заданным размером, так что пример будет выглядеть так:

      BID.price  size 
2014-02-12 04:57:51.640302 509.1200   8.0000000 
2014-02-12 04:57:51.640302 509.1000   10.0000000 
2014-02-12 04:57:51.640302 514.0000   10.00000000 

(новый уровень цен 5 14 и время было скорректировано).

Есть ли какой-либо удобный и быстрый способ, как это сделать, избегая петли переполнения по глубине xts?

Спасибо!

+0

1- Я не думаю, что вы можете избежать цикла for здесь. Во всяком случае, попробуйте добавить то, что вы попробовали, и также поместите свои данные в удобочитаемый формат (теперь трудно использовать. – agstudy

+0

@agstudy: ok, и jsut, чтобы уточнить, что вы подразумеваете под читаемым форматом? Вложенные данные поступают непосредственно из R. –

+0

Вы должны использовать 'dput (head (your_data)', а также у вас действительно есть объект xts? Я имею в виду, вам нужен временной ряд здесь, посмотрите, что вам просто нужен последний день, Возможно достаточно простого файла data.frame (ставка, размер). – agstudy

ответ

2

Я думаю, что нет необходимости использовать объект xts здесь, так как индекс одинаковый для всех наблюдений, а правый идентификатор здесь - это переменная ставки. Поэтому я объясняю свое решение, используя 1 простой data.frame, как показано выше:

DT     ## the day before 
    day bid size 
1 1 508.10 10 
2 1 509.12 8 
3 1 509.10 10 
DT1    ## the current or last day 
    day bid size 
1 2 508.1 -10 
2 2 514.0 10 

Теперь с помощью merge мы имеем почти решение:

dtm 
    bid day.x size.x day.y size.y 
1 508.10  1  10  2 -10 
2 509.10  1  10 NA  NA 
3 509.12  1  8 NA  NA 
4 514.00 NA  NA  2  10 

Теперь мы просто должны регулировать размер и удалять ставки с нулевым позиции. I cerate здесь промежуточная% +% функция для обработки отсутствующих значений.

## compute size 
"%+%" <- function(x,y) 
    ifelse(is.na(x), 
      ifelse(is.na(y),NA,y), 
      ifelse(is.na(y),x,NA)) 
## remove numm poistion(size==0) 
subset(transform(dtm,size=size.x%+%size.y,day=max(day.y,na.rm=T)), 
     size !=0,select=c(day,bid,size)) 

day bid size 
2 2 509.10 10 
3 2 509.12 8 
4 2 514.00 10 

Я думаю, что вы можете получить больше succicent и синтаксис раствора сахара здесь с помощью data.table.

+0

Благодарим за предложение! Я попробую и дам вам знать. Мне все же нужно иметь результаты как xts, но я думаю, что могу сделать это в самом конце. –

+0

@SteefGregor технически да, вы можете сохранить весь свой снимок в временном ряду. – agstudy

+0

Ваше решение сработало, спасибо! И, как вы сказали в вышеприведенном комментарии, я не могу использовать представление одной строки, поскольку длина вектора постоянно изменяется. –

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