Что мне нужно, так это выполнить полное внешнее соединение с каким-то умным na.fill/nomatch эффективным способом. Я уже сделал это с помощью цикла, но я хотел бы использовать матричную алгебру или операции data.table для ускорения процесса.
Данные ниже являются образцом информации об открытых ордерах на акции, полное внешнее соединение выполняется между наборами данных открытых ордеров на продажу и открытых ордеров на покупку. Набор данных — это запросы, B — заявки. Оба набора данных хранят атомарные порядки и их совокупные суммы. Задача состоит в том, чтобы сопоставить все ордера Ask с ордерами Bid по совокупному значению и наоборот. Заполните примерные данные:
price = c(11.25,11.26,11.35,12.5,14.2)
amount = c(1.2,0.4,2.75,6.5,15.2)
A <- data.table(ask_price = price, ask_amount = amount, ask_cum_amount = cumsum(amount), cum_value = cumsum(price*amount), ask_avg_price = cumsum(price*amount)/cumsum(amount))
price = c(11.18,11.1,10.55,10.25,9.7)
amount = c(0.15,0.6,10.2,3.5,12)
B <- data.table(bid_price = price, bid_amount = amount, bid_cum_amount = cumsum(amount), cum_value = cumsum(price*amount), bid_avg_price = cumsum(price*amount)/cumsum(amount))
обычное полное внешнее соединение и его результаты:
setkey(A, cum_value)
setkey(B, cum_value)
C <- merge(A,B,all=TRUE)
print(C)
Формула na.fill / nomatch псевдокод для каждой строки (аск или бид), где cum_value не соответствует (имейте в виду, что любое другое поле, кроме cum_value, связано с аском ИЛИ бидом):
avg_price["current NA"] <- cum_value["last non NA"]/cum_value["current NA"] * avg_price["last non NA"] + (1-cum_value["last non NA"]/cum_value["current NA"]) * price["next non NA"]
cum_amount["current NA"] <- cum_value["current NA"] / avg_price["current NA"]
Ожидаемые результаты:
D <- data.table(
cum_value = c(1.677,8.337,13.5,18.004,49.2165,115.947,130.4665,151.822,268.222,346.3065),
ask_price = c(NA,NA,11.25,11.26,11.35,NA,12.5,NA,NA,14.2),
ask_amount = c(NA,NA,1.2,0.4,2.75,NA,6.5,NA,NA,15.2),
ask_cum_amount = c(0.149066666666667,0.741066666666667,1.2,1.6,4.35,9.66496172396059,10.85,12.3126600707381,20.4097766460076,26.05),
ask_avg_price = c(11.25,11.25,11.25,11.2525,11.31414,11.9966331281534,12.02456,12.3305605066459,13.1418390633132,13.29392),
bid_price = c(11.18,11.1,NA,NA,NA,10.55,NA,10.25,9.7,NA),
bid_amount = c(0.15,0.6,NA,NA,NA,10.2,NA,3.5,12,NA),
bid_cum_amount = c(0.15,0.75,1.23858478466587,1.66517233847558,4.6230572556498,10.95,12.3652404387114,14.45,26.45,NA),
bid_avg_price = c(11.18,11.116,10.8995364444444,10.8120940902022,10.6458772362927,10.58877,10.5510685899445,10.50671,10.14072,NA)
)
print(D)
Обратите внимание, что в ожидаемых результатах последний NA по-прежнему является NA, потому что противоположный ордер не может быть сопоставлен, потому что глубины рынка недостаточно для выполнения ордера по любой цене.
Можно ли получить ожидаемые результаты, используя матричную алгебру или операции data.table или любой другой эффективный способ избежать зацикливания на полном наборе данных?
заранее спасибо
avg_price
иprice
, ни один из которых не присутствует ни в одном из вашихdata.table
. Не могли бы вы уточнить? - person Arun   schedule 19.08.2013