R xts to.period для пользовательских ежедневных периодов агрегации
Мне было интересно, если это возможно для агрегирования пользовательских периодов.
Я пытался использовать to.period(x,"day",3,OHLC=FALSE)
агрегировать, но это не сработало, так как оно только вернуло последний период.
Например пусть x
быть 2-х дневным объектом XTS с данными OHLC.
Open High Low Close Volume
1999-11-18 30.65656 33.68852 26.95082 28.80369 66392936
1999-11-19 28.93002 28.97213 26.82449 27.45615 16173015
Могут ли какие-либо инструменты XTS позволить мне объединить в одну строку?
поэтому результаты, которые я хочу, будут выглядеть так:
Open High Low Close Volume
1999-11-19 30.65656 33.68852 26.82449 27.45615 82565951
где открытие - это открытие первых дней, максимум - максимум двух дней, минимум - минимум двух дней, а закрытие - закрытие последних дней. Объем - это просто сумма объема за два дня. Я хотел бы, чтобы это решение было обобщенным и масштабируемым, поскольку я хочу сделать это для всего объекта N x M xts. Я уточню k
, В приведенном выше случае k=2
.... так что каждые 2 дня я собираю в один.
1 ответ
С помощью OHLC=TRUE
может дать вам часть пути.
AAPL1 <- to.period(AAPL,"days",k = 2,OHLC=TRUE)
head(AAPL1)
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
# 2007-01-04 86.29 86.58 81.90 85.66 521395000 11.14619
# 2007-01-05 85.77 86.20 84.40 85.05 208685400 11.06681
# 2007-01-08 85.96 86.53 85.28 85.47 199276700 11.12147
# 2007-01-10 86.45 97.80 85.15 97.00 1575544600 12.62176
# 2007-01-12 95.94 96.78 93.23 94.62 688235800 12.31207
# 2007-01-16 95.68 97.25 95.45 97.10 311019100 12.63477
Но путь to.period
расчет каждые 2 дня может быть нежелателен (некоторые периоды агрегации по-прежнему возвращают 1 бар данных из-за таких проблем, как выходные и т. д.). Если скорость вас не беспокоит, вы можете создать столбики с нуля в R (to.period
быстрее с использованием кода C под капотом). Такой подход может дать вам гораздо больше гибкости при сборе данных.
getSymbols("AAPL")
head(AAPL, 12)
#AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
#2007-01-03 86.29 86.58 81.90 83.80 309579900 10.90416
#2007-01-04 84.05 85.95 83.82 85.66 211815100 11.14619
#2007-01-05 85.77 86.20 84.40 85.05 208685400 11.06681
#2007-01-08 85.96 86.53 85.28 85.47 199276700 11.12147
#2007-01-09 86.45 92.98 85.15 92.57 837324600 12.04533
#2007-01-10 94.75 97.80 93.45 97.00 738220000 12.62176
#2007-01-11 95.94 96.78 95.10 95.80 360063200 12.46562
#2007-01-12 94.59 95.06 93.23 94.62 328172600 12.31207
#2007-01-16 95.68 97.25 95.45 97.10 311019100 12.63477
#2007-01-17 97.56 97.60 94.82 94.95 411565000 12.35501
#2007-01-18 92.10 92.11 89.05 89.07 591151400 11.58990
#2007-01-19 88.63 89.65 88.12 88.50 341118400 11.51573
# You want to aggregate every 2 full trading days of data, so have the endpoints of each aggregation period simply increment by 2.
ep2d <- seq(0, NROW(ep), by = 2)
m2 <- period.apply(AAPL,INDEX=ep2d,FUN=
function(x) {
xts(x = matrix(c(coredata(Op(x))[1], max(coredata(Hi(x))), min(coredata(Lo(x))), coredata(Cl(x))[NROW(x)],
sum(coredata(Vo(x)))), nrow =1), order.by= index(x)[NROW(x)],
dimnames = list(NULL, c("Open", "High", "Low", "Close", "Volume")))
})
head(m2)
# Open High Low Close Volume
# 2007-01-04 86.29 86.58 81.90 85.66 521395000
# 2007-01-08 85.77 86.53 84.40 85.47 407962100
# 2007-01-10 86.45 97.80 85.15 97.00 1575544600
# 2007-01-12 95.94 96.78 93.23 94.62 688235800
# 2007-01-17 95.68 97.60 94.82 94.95 722584100
# 2007-01-19 92.10 92.11 88.12 88.50 932269800