如何将包含Stock Option Data的数据框拆分为与单个期权合约对应的单个数据框

时间:2012-03-14 00:56:18

标签: r

我是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的不同唯一组合
  • 对于上述对象中的每个项目,查询匹配的大数据帧 将结果存储为列表中包含的数据框
  • 最终结果是包含一堆data.frames
  • 的列表
  • 通过saveRDS函数序列化列表,因此我再也不必这样做了。

我熟悉子集化功能,例如

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

但我不确定如何扩展这种类型的语法来实现我的目标。提前谢谢。

2 个答案:

答案 0 :(得分:1)

好像你应该能够使用split

Splits <- c("option.symbol", "strike", "call.put", "expiration")
Options.DF.List <- split(Sample.DS, Sample.DS[,Splits])

答案 1 :(得分:0)

您可以使用dlply包中的plyr,它会返回data.frames列表:

library("plyr")
dlply(Sample.DS, c("option.symbol", "strike", "call.put", "expiration"))