Apply uniroot on vector
I would like to find the strike for a given delta using black-scholes. I am able to do this using uniroot for a single spot value and volatility value but would like for this to work across a vector of spot values and vector of volatility values. My below example is simplified, once it works I will expand to much bigger vectors...
I have seen there is a previous post using sapply on uniroot for a different problem. Have tried applying here and not getting much luck.
Would you be able to help me figure out how to do this?
Many thanks!
library(rootSolve)
library(ragtop)
CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5 # half a year
Vol <- c(0.07, 0.08, 0.09)
TargetDelta <- 0.5
Lower <- c(100, 102, 104)
Upper <- c(120, 122, 124)
solve.for.strike <- function(Strike) {
BS <- blackscholes(CallPut, Spot, Strike, Rate, T, Vol)
TargetDelta - BS$Delta
}
test <- uniroot(solve.for.strike, lower = Lower, upper = Upper)
Have also tried using uniroot.all but not working:
test <- uniroot.all(solve.for.strike, c(100, 120), lower = 100, upper = 120)
Have now added libraries.
If any guidance would be much appreciated.
r
add a comment |
I would like to find the strike for a given delta using black-scholes. I am able to do this using uniroot for a single spot value and volatility value but would like for this to work across a vector of spot values and vector of volatility values. My below example is simplified, once it works I will expand to much bigger vectors...
I have seen there is a previous post using sapply on uniroot for a different problem. Have tried applying here and not getting much luck.
Would you be able to help me figure out how to do this?
Many thanks!
library(rootSolve)
library(ragtop)
CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5 # half a year
Vol <- c(0.07, 0.08, 0.09)
TargetDelta <- 0.5
Lower <- c(100, 102, 104)
Upper <- c(120, 122, 124)
solve.for.strike <- function(Strike) {
BS <- blackscholes(CallPut, Spot, Strike, Rate, T, Vol)
TargetDelta - BS$Delta
}
test <- uniroot(solve.for.strike, lower = Lower, upper = Upper)
Have also tried using uniroot.all but not working:
test <- uniroot.all(solve.for.strike, c(100, 120), lower = 100, upper = 120)
Have now added libraries.
If any guidance would be much appreciated.
r
1
Functionblackscholes
comes from what package? Not in base R so you should start the script withlibrary(pkgname)
.
– Rui Barradas
Nov 22 '18 at 10:21
add a comment |
I would like to find the strike for a given delta using black-scholes. I am able to do this using uniroot for a single spot value and volatility value but would like for this to work across a vector of spot values and vector of volatility values. My below example is simplified, once it works I will expand to much bigger vectors...
I have seen there is a previous post using sapply on uniroot for a different problem. Have tried applying here and not getting much luck.
Would you be able to help me figure out how to do this?
Many thanks!
library(rootSolve)
library(ragtop)
CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5 # half a year
Vol <- c(0.07, 0.08, 0.09)
TargetDelta <- 0.5
Lower <- c(100, 102, 104)
Upper <- c(120, 122, 124)
solve.for.strike <- function(Strike) {
BS <- blackscholes(CallPut, Spot, Strike, Rate, T, Vol)
TargetDelta - BS$Delta
}
test <- uniroot(solve.for.strike, lower = Lower, upper = Upper)
Have also tried using uniroot.all but not working:
test <- uniroot.all(solve.for.strike, c(100, 120), lower = 100, upper = 120)
Have now added libraries.
If any guidance would be much appreciated.
r
I would like to find the strike for a given delta using black-scholes. I am able to do this using uniroot for a single spot value and volatility value but would like for this to work across a vector of spot values and vector of volatility values. My below example is simplified, once it works I will expand to much bigger vectors...
I have seen there is a previous post using sapply on uniroot for a different problem. Have tried applying here and not getting much luck.
Would you be able to help me figure out how to do this?
Many thanks!
library(rootSolve)
library(ragtop)
CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5 # half a year
Vol <- c(0.07, 0.08, 0.09)
TargetDelta <- 0.5
Lower <- c(100, 102, 104)
Upper <- c(120, 122, 124)
solve.for.strike <- function(Strike) {
BS <- blackscholes(CallPut, Spot, Strike, Rate, T, Vol)
TargetDelta - BS$Delta
}
test <- uniroot(solve.for.strike, lower = Lower, upper = Upper)
Have also tried using uniroot.all but not working:
test <- uniroot.all(solve.for.strike, c(100, 120), lower = 100, upper = 120)
Have now added libraries.
If any guidance would be much appreciated.
r
r
edited Nov 22 '18 at 10:42
Arthur
asked Nov 22 '18 at 10:17
ArthurArthur
114
114
1
Functionblackscholes
comes from what package? Not in base R so you should start the script withlibrary(pkgname)
.
– Rui Barradas
Nov 22 '18 at 10:21
add a comment |
1
Functionblackscholes
comes from what package? Not in base R so you should start the script withlibrary(pkgname)
.
– Rui Barradas
Nov 22 '18 at 10:21
1
1
Function
blackscholes
comes from what package? Not in base R so you should start the script with library(pkgname)
.– Rui Barradas
Nov 22 '18 at 10:21
Function
blackscholes
comes from what package? Not in base R so you should start the script with library(pkgname)
.– Rui Barradas
Nov 22 '18 at 10:21
add a comment |
1 Answer
1
active
oldest
votes
So I have played around and have come up with the following which loops across the vectors. BUT my question is really whether there is a way to apply a solve to the vector to avoid having to loop across each element in the vector?
If there is any more efficient or elegant solution to this than what I have come up with, am very interested.
CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5
Vol <- c(0.07, 0.08, 0.09)
solve.for.strike <- function(Strike, S, V, D) {
BS <- blackscholes(CallPut, S, Strike, 0, T, V)
D - BS$Delta
}
loop.uniroot <- function(i, delta) {
uniroot(solve.for.strike, lower=Spot[i]*0.95, upper=Spot[i]*1.05, S=Spot[i], V=Vol[i], D=delta)$root
}
test3 <- mapply(loop.uniroot, 1:3, delta = 0.5)
test4 <- sapply(1:3, loop.uniroot, delta = 0.5)
Check out the functionvapply
- it is the most efficient of theapply
family (something likevapply(1:3, loop.uniroot, numeric(1), delta = 0.5)
– nate
Nov 22 '18 at 12:51
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53428656%2fapply-uniroot-on-vector%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
So I have played around and have come up with the following which loops across the vectors. BUT my question is really whether there is a way to apply a solve to the vector to avoid having to loop across each element in the vector?
If there is any more efficient or elegant solution to this than what I have come up with, am very interested.
CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5
Vol <- c(0.07, 0.08, 0.09)
solve.for.strike <- function(Strike, S, V, D) {
BS <- blackscholes(CallPut, S, Strike, 0, T, V)
D - BS$Delta
}
loop.uniroot <- function(i, delta) {
uniroot(solve.for.strike, lower=Spot[i]*0.95, upper=Spot[i]*1.05, S=Spot[i], V=Vol[i], D=delta)$root
}
test3 <- mapply(loop.uniroot, 1:3, delta = 0.5)
test4 <- sapply(1:3, loop.uniroot, delta = 0.5)
Check out the functionvapply
- it is the most efficient of theapply
family (something likevapply(1:3, loop.uniroot, numeric(1), delta = 0.5)
– nate
Nov 22 '18 at 12:51
add a comment |
So I have played around and have come up with the following which loops across the vectors. BUT my question is really whether there is a way to apply a solve to the vector to avoid having to loop across each element in the vector?
If there is any more efficient or elegant solution to this than what I have come up with, am very interested.
CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5
Vol <- c(0.07, 0.08, 0.09)
solve.for.strike <- function(Strike, S, V, D) {
BS <- blackscholes(CallPut, S, Strike, 0, T, V)
D - BS$Delta
}
loop.uniroot <- function(i, delta) {
uniroot(solve.for.strike, lower=Spot[i]*0.95, upper=Spot[i]*1.05, S=Spot[i], V=Vol[i], D=delta)$root
}
test3 <- mapply(loop.uniroot, 1:3, delta = 0.5)
test4 <- sapply(1:3, loop.uniroot, delta = 0.5)
Check out the functionvapply
- it is the most efficient of theapply
family (something likevapply(1:3, loop.uniroot, numeric(1), delta = 0.5)
– nate
Nov 22 '18 at 12:51
add a comment |
So I have played around and have come up with the following which loops across the vectors. BUT my question is really whether there is a way to apply a solve to the vector to avoid having to loop across each element in the vector?
If there is any more efficient or elegant solution to this than what I have come up with, am very interested.
CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5
Vol <- c(0.07, 0.08, 0.09)
solve.for.strike <- function(Strike, S, V, D) {
BS <- blackscholes(CallPut, S, Strike, 0, T, V)
D - BS$Delta
}
loop.uniroot <- function(i, delta) {
uniroot(solve.for.strike, lower=Spot[i]*0.95, upper=Spot[i]*1.05, S=Spot[i], V=Vol[i], D=delta)$root
}
test3 <- mapply(loop.uniroot, 1:3, delta = 0.5)
test4 <- sapply(1:3, loop.uniroot, delta = 0.5)
So I have played around and have come up with the following which loops across the vectors. BUT my question is really whether there is a way to apply a solve to the vector to avoid having to loop across each element in the vector?
If there is any more efficient or elegant solution to this than what I have come up with, am very interested.
CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5
Vol <- c(0.07, 0.08, 0.09)
solve.for.strike <- function(Strike, S, V, D) {
BS <- blackscholes(CallPut, S, Strike, 0, T, V)
D - BS$Delta
}
loop.uniroot <- function(i, delta) {
uniroot(solve.for.strike, lower=Spot[i]*0.95, upper=Spot[i]*1.05, S=Spot[i], V=Vol[i], D=delta)$root
}
test3 <- mapply(loop.uniroot, 1:3, delta = 0.5)
test4 <- sapply(1:3, loop.uniroot, delta = 0.5)
answered Nov 22 '18 at 12:29
ArthurArthur
114
114
Check out the functionvapply
- it is the most efficient of theapply
family (something likevapply(1:3, loop.uniroot, numeric(1), delta = 0.5)
– nate
Nov 22 '18 at 12:51
add a comment |
Check out the functionvapply
- it is the most efficient of theapply
family (something likevapply(1:3, loop.uniroot, numeric(1), delta = 0.5)
– nate
Nov 22 '18 at 12:51
Check out the function
vapply
- it is the most efficient of the apply
family (something like vapply(1:3, loop.uniroot, numeric(1), delta = 0.5)
– nate
Nov 22 '18 at 12:51
Check out the function
vapply
- it is the most efficient of the apply
family (something like vapply(1:3, loop.uniroot, numeric(1), delta = 0.5)
– nate
Nov 22 '18 at 12:51
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53428656%2fapply-uniroot-on-vector%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Function
blackscholes
comes from what package? Not in base R so you should start the script withlibrary(pkgname)
.– Rui Barradas
Nov 22 '18 at 10:21