如何使用正则表达式解析 R 中的 OCC 选项符号?
How can I use regex to parse an OCC Option Symbol in R?
OCC期权符号由4部分组成:
AAPL220121C00145000
TSLA220121C01050000
HD220121C00400000
- 标的股票或 ETF 的根代码,以空格填充至 6 个字符
- 到期日期,6 位数字,格式为
"%Y-%m-%d"
- 看跌或看涨期权类型,P 或 C
- 行权价,为价格x 1000,前面补0至8位
例如 AAPL220121C00145000
表示 AAPL
的 call
,01/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
OCC期权符号由4部分组成:
AAPL220121C00145000
TSLA220121C01050000
HD220121C00400000
- 标的股票或 ETF 的根代码,以空格填充至 6 个字符
- 到期日期,6 位数字,格式为
"%Y-%m-%d"
- 看跌或看涨期权类型,P 或 C
- 行权价,为价格x 1000,前面补0至8位
例如 AAPL220121C00145000
表示 AAPL
的 call
,01/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