【问题标题】:Filtering option data in R [closed]在R中过滤选项数据[关闭]
【发布时间】:2015-06-25 05:37:21
【问题描述】:

我有这样的数据数据

Date           Closing_price    strike_Price  Underlying_Value
01-01-2015     12                120           109     
01-01-2015     10                110           109
01-01-2015     5                 130           109
01-01-2015     3                 140           109
01-01-2015     15                100           109
01-01-2015     25                90            109

我想要的只是那些执行价格刚好高于基础价值且略低于基础价值的行。如果Underlying_Valuestrike_Price 匹配,那么我只想要单行。

期望的输出:(在这种情况下)

 01-01-2015     10                110           109
 01-01-2015     15                100           109

同样,我有不同日期的数据。 Underlying_Value 仅随日期而异。我想为每个日期过滤此类数据并将它们保存为数据框(在单个对象中,而不是为每个日期单独保存)。

我设法编写了代码,但花费了太多时间。观测 82000 大约需要 3 分钟。

我想知道,他们有什么有效的方法吗?

我做了什么:

1) 首先在数据集 df1$money 中创建另一个变量

它成功了,但它花费了太多时间......

我的确切代码是:

atmoney <- function(data) {

Date.i <- unique(data$Date)

len <- length(Date.i)

data$money <- (data$Underlying.Value-data$Strike.Price)/data$Strike.Price

at.first.row <- data[1,]

for(i in 1:len) {

data.f <- data[data$Date==Date.i[i],]

data.f.1 <- data.f[data.f$money >=0,]

data.at.1 <- data.f.1[data.f.1$money==min(data.f.1$money),]

data.f.2 <- data.f[data.f$money <= 0,]

data.at.2 <- data.f.2[data.f.2$money == max(data.f.2$money),]

at.first.row <- rbind(at.first.row,data.at.1, data.at.2)


}

desired_data <- at.first.row[-1,] #removed first row
}

【问题讨论】:

  • 刚刚高于和低于的阈值是多少?
  • 如果阈值为10。然后subset(df1, abs(strike_Price - Underlying_Value)&lt;10) 对于多个日期,library(dplyr); df1 %&gt;% group_by(Date) %&gt;% filter(abs(strike_Price - Underlying_Value) &lt;10)
  • 谢谢,但没有阈值。
  • 你需要做一个基线来比较。无论如何,我向您展示了一个根据样本数据获得预期结果的选项。
  • 我做了什么,我在回答 1 帖子中提到了。问题是它花费了太多时间。我有大约 5 年的数据,每个日期大约有 700 个观察值。我的方法大约需要 3 分钟。

标签: r filter


【解决方案1】:

您可能需要一个截止值来过滤。使用上面的例子,如果我使用10 作为截止限制

 subset(df1, abs(strike_Price - Underlying_Value)<10)
 #        Date Closing_price strike_Price Underlying_Value
 #2 01-01-2015            10          110              109
 #5 01-01-2015            15          100              109

对于多个日期,上述方法也可以

使用data.table

 library(data.table)
 setDT(df1)[abs(strike_Price - Underlying_Value)<10]
 #         Date Closing_price strike_Price Underlying_Value
 #1: 01-01-2015            10          110              109
 #2: 01-01-2015            15          100              109

更新

根据编辑,也许你可以试试

 library(data.table)
 setDT(df1)[, money:=(Underlying_Value-strike_Price)/Underlying_Value]
 indx1 <- df1[money <0, .I[which.max(money)], Date]$V1
 indx2 <- df1[money >= 0, .I[which.min(money)], Date]$V1
 df1[c(indx1,indx2)][,money:=NULL]
 #            Date Closing_price strike_Price Underlying_Value
 #1: 01-01-2015            10          110              109
 #2: 01-01-2015            15          100              109

【讨论】:

  • 谢谢,但没有阈值级别。我想要每个日期的罢工价格刚好高于基础价值且低于基础价值的行。我所做的是我在数据中创建了另一个变量。过程是这样的: 1) df1$money
  • @Neeraj 你可以在你的帖子中更新它。你做的方式也是有标准的。没有在您的原始帖子中提及这一点,我不知道其他人将如何提出解决方案。所以,我使用了一个阈值。
  • @Neeraj 您的标准令人困惑。您说首先选择货币大于 0 的行并选择具有最小值的行,然后选择最大值。
  • 是的,你是对的。如您所知,我只想要每个日期的执行价格刚好高于和低于 Underlying_Value 的那些行。我没有找到直接的方法,所以我创建了另一个变量。当您创建 abs(执行价格 - 基础价值)时,然后在阈值水平内选择,即 10。我所做的是相同的。通过创建它单独的变量但不是绝对的。因为,有些是正值,有些是负值,我使用 max 和 min 函数从中选择合适的值。通过使用循环,我设法为所有日期做了。
  • 你是绝对正确的兄弟。但是当我使用循环并应用于具有多个日期的大量数据时,这个函数需要很多时间。
【解决方案2】:

我在您的示例中添加了第二个日期,以说明多个日期。这为您提供了每天的最小值。您可以将公式调整为您需要的公式。

  library(dplyr)

  df1pos <-df1 %>% mutate(diff = (Strike_Price - Underlying_Value)) %>% group_by(Date) %>% filter( diff > 0) %>%  filter(diff == min(diff))
  df1neg <- df1 %>% mutate(diff = (Strike_Price - Underlying_Value)) %>% group_by(Date) %>% filter( diff < 0) %>%  filter(diff == max(diff))
  dftotal <- union(df1pos, df1neg)

  dftotal

  Date Closing_price Strike_Price Underlying_Value diff
  1 01-01-2015            15          100              109   -9
  2 02-01-2015            15          100              108   -8
  3 01-01-2015            10          110              109    1
  4 02-01-2015            10          110              108    2

我假设 group by 需要扩展,以显示不同的股票。但是从您的示例中并不清楚。

【讨论】:

  • 非常感谢......这正是医生的命令......它很快,最重要的是不需要任何循环和功能......
  • @Neeraj 这类似于data.tabledata.table 应该同样或更快
  • 其实我不知道包data.table。我从 R 中的 inbuild 包中尝试最多。但现在我已经学习了包 dplyr。它非常棒且易于使用。一个问题:您似乎是 R 方面的专家,那么您为什么不使用 R 中提供的基本包编写自己的函数,而不是使用外部包?每买一个新包装,我都会感到脖子痛。
猜你喜欢
  • 2017-01-03
  • 2018-09-17
  • 1970-01-01
  • 2010-10-03
  • 2021-09-03
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2016-09-02
相关资源
最近更新 更多