Я довольно новичок в R и в настоящее время у меня возникают проблемы с выполнением al oop в R. Насколько мне известно, медленные циклы в R связаны с «плохим программированием». Это, скорее всего, также и здесь (хотя я пытался сделать все возможное).
Я столкнулся с несколькими предложениями, такими как векторизация кадров данных, о том, как сделать циклы более эффективными. Поскольку мои расчеты для заданной строки котировки ставки зависят от ранее подтвержденной котировки ставки (где текущая цитата, в свою очередь, проверяется на основе расчетов), я не мог понять, как сделать возможной векторизацию.
Мои данные состоят из нерегулярно распределенных во времени заявок и предложений. Перед дальнейшей обработкой данных мне нужно отфильтровать тики по аномалиям и выбросам, используя «фильтр выбросов», как это предложено Dacorogna, MM, Müller, UA, Nagler, RJ, Olsen, RB, Pictet, OV (1993 ). Географическая модель для дневной и недельной сезонной волатильности на валютном рынке . (Фильтр предоставлен в их приложении). Для расчета условий мне нужны «текущая» заявка и последняя подтвержденная заявка. На основании этих условий я затем (в) проверяю текущую ставку предложения.
Мой текущий подход: при условии, что первая квота предложения df[1,]
подтверждена. Затем итеративно вычисляют условия (BConditionI, BConditionII, SConditionI, SConditionII, SConditionIII) и, следовательно, проверку (как зафиксировано оператором if) для предложения цены. Если «текущая» заявка не подтверждена, я исключаю соответствующую строку из фрейма данных. В противном случае я сохраняю фрейм данных без изменений. Мое обоснование заключается в том, что изначально или для i+1
предыдущая строка в обновленном фрейме данных автоматически проверялась.
i <- 2
while (i<=nrow(df)){
#for (i in seq(2,nrow(df)) ){
#
*#calculates the distance to previous, validated bid quote*
df$dBidQuoteABS_V[i]<-abs(as.numeric(df$BidQuote[i]-df$BidQuote[i-1]))
df$BConditionI[i]<-ifelse(df$dBidQuoteABS_V[i] < 0.25,1,0)
df$dT[i]<-as.numeric(df$DateTime[i]-df$DateTime[i-1])
df$dT[i]<-df$dT[i]/(24*60*60)
df$BConditionII[i]<-ifelse(df$dBidQuoteABS_V[i]<2*df$spread[i-1]+0.18*df$dT[i],1,0)
df$SConditionI[i]<-ifelse(0.0001<df$spread[i] &df$spread[i]<0.025,1,0)
df$SConditionII[i]<-ifelse(df$dBidQuoteABS_V[i]<1.3+45*df$dT[i],1,0)
df$SConditionIII[i]<-ifelse(df$dBidQuoteABS_V[i]<4,1,0)
if(df$BConditionI[i]==0 |df$BConditionII[i]==0| df$SConditionI[i]==0|df$SConditionII[i]==0|df$SConditionIII[i]==0) {
df<-df[-i, ]
} else{
df<-df
}
rownames(df) <- seq(length=nrow(df))
i <- i+1
}
Однако я скептически отнесся к своему подходу. Выполнение кода занимает много (много) часов. Я также считаю, что существует существенная ошибка: если в предложении ставится цитата в строке k
(где n = общее количество строк в df
и k, k + 1 ..k исключается, строка k-1
будет ранее Подтверждено предложение цены для предложения цены в строке k
? Я пытался принять это во внимание, заменив предыдущий for (i<=nrow(df)){..
на while (i<=nrow(df)){...} ... i<- i+1
. Я не уверен, поможет ли это.
Что я буду sh создавать
Предположим теперь, что котировки ставок в строках 1 и 2 проверены, но предложение ставки в строке 3 недопустимо. Что я хочу
DateTime Bid Quote Ask Quote dBidQuote dT Validated
1. T1 B1 A1 - - YES
2. T2 B2 A2 A2-A1 T2-T1 YES
3. T3 B3 A3 A3-A2 T3-T2 NO #I therefore 'exclude this row in the loop
4. T4 B4 A4 A4-A2 T4-T2 YES #As the previous row is not validated, the differences will be taken wrt. the validated row 3.