Вопрос для начинающих по использованию fOptions: GBSVolatility - PullRequest
1 голос
/ 06 октября 2019

Извините, что беспокою вас, ребята, я довольно новичок в программировании, поэтому мне очень трудно понять большинство опубликованных решений в Интернете. Я попытался найти ответы на мою проблему, но, похоже, не смог найти ни одного.

У меня есть данные с подробностями опций. Он называется gcp5.

> str(gcp5)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   90 obs. of  10 variables:
 $ Expiry Date  : POSIXct, format: "2019-12-20" "2019-12-20" ...
 $ Strike       : num  1210 1215 1220 1225 1230 ...
 $ Open Interest: num  34 87 50 52 115 17 99 62 907 36 ...
 $ Underlying   : num  1209 1209 1209 1209 1209 ...
 $ CallOrPut    : chr  "c" "c" "c" "c" ...
 $ Bid          : num  43.2 44.1 41.9 40 34.8 36.1 31.4 29.6 27.9 28.4 ...
 $ Ask          : num  44.1 44.7 42.7 40.6 35.7 36.7 32.2 30.4 28.6 29 ...
 $ value        : num  1484 3863 2115 2096 4054 ...
 $ time         : num  0.205 0.205 0.205 0.205 0.205 ...
 $ price        : num  43.7 44.4 42.3 40.3 35.2 ...

Я хочу добавить новый столбец с именем vol. Я хочу использовать функцию GBSVolatility (под библиотекой fOptions), чтобы заполнить этот новый столбец. Я использовал команду, как показано ниже, и получил несколько странных сообщений об ошибках. Я не уверен, что не так.

gcp6 <- mutate(gcp5, vol = GBSVolatility(gcp5$price, gcp5$CallOrPut, 
                                          gcp5$Underlying, gcp5$Strike, gcp5$time, 0.03, 0))

#Error in uniroot(.fGBSVolatility, interval = c(-10, 10), price = price,  : 
#f() values at end points not of opposite sign
#In addition: Warning messages:
# 1: In if (is.na(f.lower)) stop("f.lower = f(lower) is NA") :
# the condition has length > 1 and only the first element will be used
#2: In if (is.na(f.upper)) stop("f.upper = f(upper) is NA") :
#  the condition has length > 1 and only the first element will be used

Я понимаю, что у каждого есть свои обязанности в жизни, и им нужно время для их выполнения. Спасибо всем, кто потратил время, пытаясь помочь ответить на мой вопрос. Очень ценю вашу доброту в помощи.

Кроме того (подробности о первой и последней 5 строках данных):

> dput(head(gcp5))                                          
structure(list(`Expiry Date` = structure(c(1576800000, 1576800000, 
1576800000, 1576800000, 1576800000, 1576800000), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), Strike = c(1210, 1215, 1220, 1225, 
1230, 1235), `Open Interest` = c(34, 87, 50, 52, 115, 17), Underlying = c(1209, 
1209, 1209, 1209, 1209, 1209), CallOrPut = c("c", "c", "c", "c", 
"c", "c"), Bid = c(43.2, 44.1, 41.9, 40, 34.8, 36.1), Ask = c(44.1, 
44.7, 42.7, 40.6, 35.7, 36.7), value = c(1484.1, 3862.8, 2115, 
2095.6, 4053.75, 618.8), time = c(0.205479452054795, 0.205479452054795, 
0.205479452054795, 0.205479452054795, 0.205479452054795, 0.205479452054795
), price = c(43.65, 44.4, 42.3, 40.3, 35.25, 36.4)), row.names = c(NA, 
6L), class = c("tbl_df", "tbl", "data.frame"))

> dput(tail(gcp5))                                          
structure(list(`Expiry Date` = structure(c(1576800000, 1576800000, 
1576800000, 1576800000, 1576800000, 1576800000), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), Strike = c(1180, 1185, 1190, 1195, 
1200, 1205), `Open Interest` = c(48, 12, 119, 9, 0, 26), Underlying = c(1209, 
1209, 1209, 1209, 1209, 1209), CallOrPut = c("p", "p", "p", "p", 
"p", "p"), Bid = c(47.9, 59.4, 52.7, 64.3, 72, 69.4), Ask = c(52.4, 
60.1, 56.3, 65.2, 73.5, 70.2), value = c(2407.2, 717, 6485.5, 
582.75, 0, 1814.8), time = c(0.205479452054795, 0.205479452054795, 
0.205479452054795, 0.205479452054795, 0.205479452054795, 0.205479452054795
), price = c(50.15, 59.75, 54.5, 64.75, 72.75, 69.8)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -6L))

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Проблема заключается в GBSVolatility, которая рассчитывает волатильность для одной цены опциона за раз, но при попытке мы передаем полный столбец функции, которую он не может обработать. Есть несколько способов справиться с этим.

Одним из них является использование rowwise, которое будет автоматически передавать аргументы построчно

library(dplyr)
library(fOptions)
library(purrr)

gcp5 %>%
  rowwise() %>%
  mutate(vol = GBSVolatility(price, CallOrPut, Underlying, Strike, time, 0.03, 0))

Однако построчно немного устарело, мы также можем использовать pmap_dbl из purrr

gcp5 %>%
   mutate(vol = pmap_dbl(list(price, CallOrPut, Underlying, Strike, time), 
                 GBSVolatility, r = 0.03, b = 0))

Или в базе R используйте mapply

with(gcp5,mapply(GBSVolatility, price, CallOrPut, Underlying, Strike,time, 0.03, 0))
#[1] 0.2031476937 0.2173287575 0.2180045839 0.2187683891 0.2050072991 0.2196630834
1 голос
/ 06 октября 2019

Я использовал другой метод, чтобы получить то, что я хочу. Но я все еще хотел бы знать, почему мой оригинальный метод неправильный и как использовать мой оригинальный метод вместо моего нового метода. Спасибо всем.

Новый метод, как описано ниже, но не является моим предпочтительным методом, потому что соглашения об именах намного сложнее.

vol <- function(x) GBSVolatility(as.numeric(x["price"]), as.character(x["CallOrPut"]), as.numeric(x["Underlying"]),    
                                 as.numeric(x["Strike"]), as.numeric(x["time"]), r = 0.03, b = 0.00)
gcp6 <- mutate(gcp5, vol = apply(gcp5, 1, vol))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...