我有这样的数据数据
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_Value
和strike_Price
匹配,那么我只想要单行。
期望输出:(在这种情况下)
01-01-2015 10 110 109
01-01-2015 15 100 109
同样,我有各种日期的数据。 Underlying_Value
仅在不同日期之间有所不同。我希望为每个日期过滤这样的数据并将它们保存为数据框(在单个对象中,而不是分别用于每个日期)。
我设法编写代码,但这花费了太多时间。对于观察82000,大约时间是3分钟。
我想知道,他们是否有效?
我做了什么:
1)首先在数据集中创建另一个变量df1 $ money&lt ;-(df1 $ Underlying_Value-df1 $ Strike_Price)/ df1 $ Underlying_Value, 2)使用循环,首先选择行,其中df1 $ money大于0并且选择行具有df1 $ money的最小值,而不是df1 $ money小于0,我选择的行具有df1 $ money的最大vaule。
它奏效了,但是花了太多时间......
我的确切代码是:
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
}
答案 0 :(得分:2)
您可能需要一个截止值来过滤。使用上面的示例,如果我使用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 :(得分:0)
我在您的示例中添加了第二个日期,以说明多个日期。这为您提供了每天的最低价值。您可以将公式调整为您需要的公式。
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
我认为该组需要延长,以显示不同的股票。但是你的例子并不清楚。