I have a data frame holding information on options like this
> chData
myIdx strike_price date exdate cp_flag strike_price return
1 8355342 605000 1996-04-02 1996-05-18 P 605000 0.002340
2 8355433 605000 1996-04-02 1996-05-18 C 605000 0.002340
3 8356541 605000 1996-04-09 1996-05-18 P 605000 -0.003182
4 8356629 605000 1996-04-09 1996-05-18 C 605000 -0.003182
5 8358033 605000 1996-04-16 1996-05-18 P 605000 0.003907
6 8358119 605000 1996-04-16 1996-05-18 C 605000 0.003907
7 8359391 605000 1996-04-23 1996-05-18 P 605000 0.005695
where cp_flag means that a certain option is either a call or a put. What is a way to make sure that for each date, there is a both a call and a put, and drop the rows for which this does not exist? I can do it with a for loop, but is there a more clever way?
Get the dates that have P’s and those that have C’s, and use intersect to find the dates that have both.
Keep only the rows that have dates appearing in keep_dates.