如何使用正则表达式解析 R 中的 OCC 选项符号?

How can I use regex to parse an OCC Option Symbol in R?

OCC期权符号由4部分组成:

AAPL220121C00145000
TSLA220121C01050000
HD220121C00400000
  1. 标的股票或 ETF 的根代码,以空格填充至 6 个字符
  2. 到期日期,6 位数字,格式为 "%Y-%m-%d"
  3. 看跌或看涨期权类型,P 或 C
  4. 行权价,为价格x 1000,前面补0至8位

例如 AAPL220121C00145000 表示 AAPLcall01/21/2022 到期,行使价为 5.00.

我想把这些OCC放入data.table如下

Symbol   ExpDate    Type   Strike
AAPL     2022-01-21   call    145
TSLA     2022-01-21   call   1050
HD       2022-01-21   call    400

我尝试了以下但似乎有一些问题 -

library(data.table)
read.table(text=gsub("(?=[A-Za-z])((\d{2})(\d{2})(\d{2}))([PC])(\d{8})", "\1,\2,\3,\4", "AAPL220121C00145000"),
colClasses = c("character", "date", "character", "numeric"), sep=",", stringsAsFactors = FALSE)

有人可以仅使用正则表达式以上述格式帮助创建 data.table 吗?

    library(dplyr)

df %>% mutate(stock = substring(option, 1, 4)) %>% 
mutate(Strike = as.integer(substring(option, 12, 16))) %>% 
mutate(Type = ifelse(substring(option, 11, 11) == 'C', 'CALL', 'PUT')) %>%
mutate(ExpDate = ymd(substring(option, 5, 10))) 
               option stock Strike Type    ExpDate
1 AAPL220121C00145000  AAPL    145 CALL 2022-01-21
2 TSLA220121C01050000  TSLA   1050 CALL 2022-01-21

您的查询涉及多个问题。我专注于一种将字符串拆分为固定宽度部分的简单方法。

以后你可能会解决剩下的问题。

library(iotools)
v <- c(4,6,1,8)
iotools::dstrfw(
  mystrings, 
  col_types = c("character", "character", "character", "numeric"), 
  widths = v)

#     V1     V2 V3      V4
# 1 AAPL 220121  C  145000
# 2 TSLA 220121  C 1050000

日期部分无法一次性处理,因为 iotools 仅支持日期的 %Y-%m-%d 格式(使用 fasttime 包)。数字部分可以很容易地除以 1000,因为它已经作为数字读入(注意前导零被剥离)。

我们可以使用 strcapture 来自 base R

type.convert(strcapture("([A-Za-z]+)(\d{2}\d{2}\d{2})([PC])(\d{8})", 
   "AAPL220121C00145000", proto = list(Symbol = "character", 
     ExpDate = "date", Type = "character", Strike = "numeric")), as.is = TRUE)
  Symbol ExpDate Type Strike
1   AAPL  220121    C 145000