查找符合条件的相邻行

5

我在R中有一个金融时间序列(目前是xts对象,但我现在还在研究tibble)。

如何找到连续两行匹配条件的概率?

例如,我想知道连续两天的值是否高于平均/中位数值的概率。我知道我可以使用lag将前一天的值延迟到下一行,从而获得这个统计数据,但这似乎非常麻烦和不灵活。

有更好的方法来完成这个任务吗?

xts样本数据:

foo <- xts(x = c(1,1,5,1,5,5,1), seq(as.Date("2016-01-01"), length = 7, by = "days"))

两天连续的值都高于中位数的概率是多少?


1
请提供一个最小化的可重现示例(Reproducible example),具体操作请参考此链接:https://dev59.com/eG025IYBdhLWcg3whGSx。 - Heikki
1
我添加了最小的xts样本数据。 - TommyF
2个回答

1
你可以创建一个新列来标识高于中位数的值,然后只选择连续且高于中位数的值。
> foo <- as_tibble(data.table(x = c(1,1,5,1,5,5,1), seq(as.Date("2016-01-01"), length = 7, by = "days")))

步骤1

创建列以查找高于中位数的值。

> foo$higher_than_median <- foo$x > median(foo$x)

步骤2

使用diff比较该列,

只有当两个连续的值都更高或更低时才采用..c(0, diff(foo$higher_than_median) == 0

然后添加条件,它们必须都更高 foo$higher_than_median == TRUE

完整表达式:

foo$both_higher <- c(0, diff(foo$higher_than_median)) == 0 & $higher_than_median == TRUE

第三步

为了找到概率,取 foo$both_higher 的平均值。

mean(foo$both_higher)
[1] 0.1428571

1

这里有一个纯xts解决方案。

如何定义中位数?有几种方法。

在在线时间序列使用中,例如计算移动平均值,您可以在固定的回溯窗口内计算中位数(如下所示),或从起点到现在(锚定窗口计算)。在中位数计算中,您将不会知道当前时间步之后的未来值(避免向前看偏差)。

library(xts)
library(TTR)

x <- rep(c(1,1,5,1,5,5,1, 5, 5, 5), 10)
y <- xts(x = x, seq(as.Date("2016-01-01"), length = length(x), by = "days"), dimnames = list(NULL, "x"))

# Avoid look ahead bias in an online time series application by computing the median over a rolling fixed time window:
nMedLookback <- 5
y$med <- runPercentRank(y[, "x"], n = nMedLookback)
y$isAboveMed <- y$med > 0.5

nSum <- 2
y$runSum2 <- runSum(y$isAboveMed, n = nSum)

z <- na.omit(y)
prob <- sum(z[,"runSum2"] >= nSum) / NROW(z)

当你的中位数在整个数据集上时,这个情况显然是一个更容易的修改。

你认为非xts解决方案更适合金融时间序列吗?从你的用户名来看,你在这方面有一些经验;-) - TommyF
你查过xts代表什么了吗?;) 一般来说,如果使用xts对象,我会始终使用通常基于c实现且快速的xts实用程序。尤其是对于很大的对象,例如具有1e8+行的tick数据,这更为重要。不过,总的来说,对于小数据集,请使用您最熟悉的工具。 - FXQuantTrader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接