Как разбить фрейм данных, состоящий из данных опционов на акции, на отдельные фреймы данных, соответствующие индивидуальному контракту опциона - PullRequest
0 голосов
/ 14 марта 2012

Я новичок в R, но не в программировании в целом, но я застрял в вышеуказанном вопросе. У меня есть большой файл .csv, который содержит все данные опций за 2006-2011 годы. Я успешно загрузил этот большой файл в фрейм данных. Тем не менее, это следующий шаг, за который я борюсь. Мне нужно разделить этот фрейм данных на число n фреймов, где n соответствует количеству отдельных опционных контрактов, содержащихся в большем фрейме данных. Например, если в моем исходном фрейме данных содержалась дневная цена опциона 1280, срок действия которого истекает через месяц, и дневная цена опциона 1290, срок действия которого истекает через месяц, я хотел бы получить два отдельных фрейма данных. Ниже приведен результат str() моего большого фрейма данных

 'data.frame':  2215636 obs. of  21 variables:
 $ symbol                    : chr  "SPX" "SPX" "SPX" "SPX" ...
 $ exchange                  : chr  "CBOE" "CBOE" "CBOE" "CBOE" ...
 $ date                      : Date, format: "2006-01-03" "2006-01-03" "2006-01-03" "2006-01-03" ...
 $ adjusted.stock.close.price: num  1269 1269 1269 1269 1269 ...
 $ option.symbol             : chr  "JXAAF" "JXAMF" "JXAAI" "JXAMI" ...
 $ expiration                : Date, format: "2006-01-06" "2006-01-06" "2006-01-06" "2006-01-06" ...
 $ strike                    : int  1230 1230 1245 1245 1260 1260 1275 1275 1290 1290 ...
 $ call.put                  : chr  "C" "P" "C" "P" ...
 $ ask                       : num  40.1 0.25 25.4 0.7 12 2.45 3.1 9.3 0.55 22.2 ...
 $ bid                       : num  38.1 0.05 23.4 0.2 10.5 1.95 2.45 8.3 0.05 20.2 ...
 $ mean.price                : num  39.1 0.15 24.4 0.45 11.25 ...
 $ iv                        : num  0.13 0.128 0.13 0.128 0.13 ...
 $ volume                    : int  10 76 37 145 292 62 113 55 0 5 ...
 $ open.interest             : int  226 762 39 125 482 404 72 1 203 200 ...
 $ stock.price.for.iv        : num  1269 1269 1269 1269 1269 ...
 $ X.                        : chr  "*" "*" "*" "*" ...
 $ delta                     : num  0.99725 -0.00236 0.95624 -0.04179 0.73911 ...
 $ vega                      : num  0.00886 0.00807 0.10122 0.09776 0.35569 ...
 $ gamma                     : num  0.00057 0.00052 0.0065 0.00636 0.02286 ...
 $ theta                     : num  -0.1076 -0.0188 -0.3262 -0.2268 -0.9153 ...
 $ rho                       : num  0.09134 -0.00022 0.08856 -0.00397 0.06901 ...

head(Sample.DS)
  symbol exchange       date adjusted.stock.close.price option.symbol expiration strike call.put   ask   bid
1    SPX     CBOE 2006-01-03                     1268.8         JXAAF 2006-01-06   1230        C 40.10 38.10
2    SPX     CBOE 2006-01-03                     1268.8         JXAMF 2006-01-06   1230        P  0.25  0.05
3    SPX     CBOE 2006-01-03                     1268.8         JXAAI 2006-01-06   1245        C 25.40 23.40
4    SPX     CBOE 2006-01-03                     1268.8         JXAMI 2006-01-06   1245        P  0.70  0.20
5    SPX     CBOE 2006-01-03                     1268.8         JXAAL 2006-01-06   1260        C 12.00 10.50
6    SPX     CBOE 2006-01-03                     1268.8         JXAML 2006-01-06   1260        P  2.45  1.95
  mean.price     iv volume open.interest stock.price.for.iv X.    delta    vega   gamma    theta      rho
1      39.10 0.1298     10           226            1268.75  *  0.99725 0.00886 0.00057 -0.10765  0.09134
2       0.15 0.1283     76           762            1268.75  * -0.00236 0.00807 0.00052 -0.01883 -0.00022
3      24.40 0.1298     37            39            1268.75  *  0.95624 0.10122 0.00650 -0.32616  0.08856
4       0.45 0.1283    145           125            1268.75  * -0.04179 0.09776 0.00636 -0.22676 -0.00397
5      11.25 0.1298    292           482            1268.75     0.73911 0.35569 0.02286 -0.91528  0.06901
6       2.20 0.1283     62           404            1268.75    -0.25833 0.35397 0.02302 -0.81108 -0.02458

так что, возможно, лучший способ выразить это - мне нужно разделить фрейм данных по уникальной комбинации option.symbol, strike, call.put и expiration. Казалось бы, я мог бы использовать a для каждого цикла, но мне сказали, что в R следует избегать циклов и указывать в направлении lapply.

С точки зрения псевдокода, вот как я пытался решить эту проблему:

  • Загрузить большой набор данных
  • Создать матрицу / вектор / список / фрейм данных (не уверен, какой использовать), который содержит различные уникальные комбинации option.symbol, strike, call.put и expiration's
  • Для каждого элемента в вышеприведенном объекте запрашивается большой кадр данных для совпадений сохранить результат как фрейм данных, содержащийся в списке
  • Конечным результатом является список, содержащий набор данных. Рамки
  • сериализует список с помощью функции saveRDS, поэтому мне больше не придется делать это снова.

Я знаком с функциями поднабора, такими как

X<- Options.DF.List[[1]][  which(Options.DF.List[[1]]$date %in% SPX.Put.Purchase.Dates), ]

но я не уверен, как расширить этот тип синтаксиса для достижения моих целей. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Похоже, вы должны просто иметь возможность использовать split.

Splits <- c("option.symbol", "strike", "call.put", "expiration")
Options.DF.List <- split(Sample.DS, Sample.DS[,Splits])
0 голосов
/ 14 марта 2012

Вы можете использовать dlply из пакета plyr, он вернет список data.frames:

library("plyr")
dlply(Sample.DS, c("option.symbol", "strike", "call.put", "expiration"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...