SHARE
TWEET

Plotting option strategies with R

mjaniec Feb 15th, 2014 298 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ## description available at: http://reakkt.com
  2.  
  3. rm(list = ls()) # clear all
  4.  
  5. ### sample strategies
  6.  
  7. # ## Put Hedging
  8. #
  9. # assetsN <- 2
  10. #
  11. # current.price <- 40
  12. #
  13. # assets.mat <- matrix(NA,assetsN,5)
  14. # colnames(assets.mat) <- c("trans","type","strike","price","amount")
  15. #
  16. # assets.mat[1,] <- c("buy", "base", 40, 0, 1) # buy underlying
  17. # assets.mat[2,] <- c("buy", "put",  35, 2, 1) # hedge with a OTM put
  18. #
  19. # price.range <- c(10,80)
  20. # price.step  <- 1
  21.  
  22. ## Sell short base
  23.  
  24. assetsN <- 2
  25.  
  26. current.price <- 40
  27.  
  28. assets.mat <- matrix(NA,assetsN,5)
  29. colnames(assets.mat) <- c("trans","type","strike","price","amount")
  30.  
  31. assets.mat[1,] <- c("sell", "base", 40, 0, 1) # sell underlying
  32. assets.mat[2,] <- c("buy", "call",  35, 2, 1) # hedge with a ITM call
  33.  
  34. price.range <- c(10,80)
  35. price.step  <- 1
  36.  
  37. # ## Bull Call Spread
  38. # # http://www.theoptionsguide.com/bull-call-spread.aspx
  39. #
  40. # assetsN <- 2
  41. #
  42. # current.price <- 42
  43. #
  44. # assets.mat <- matrix(NA,assetsN,5)
  45. # colnames(assets.mat) <- c("trans","type","strike","price","amount")
  46. #
  47. # assets.mat[1,] <- c("buy",  "call",  40, 3, 1) # ITM call
  48. # assets.mat[2,] <- c("sell", "call",  45, 1, 1) # OTM call
  49. #
  50. # price.range <- c(35,50)
  51. # price.step  <- 1
  52.  
  53. # ## Call Backspread
  54. # #  http://www.theoptionsguide.com/call-backspread.aspx
  55. #
  56. # assetsN <- 2
  57. #
  58. # current.price <- 43
  59. #
  60. # assets.mat <- matrix(NA,assetsN,5)
  61. # colnames(assets.mat) <- c("trans","type","strike","price","amount")
  62. #
  63. # assets.mat[1,] <- c("sell",  "call",  40,  4, 1) # ITM call
  64. # assets.mat[2,] <- c("buy",   "call",  45,  2, 2) # OTM call
  65.  
  66. # ## Condor
  67. # # http://www.theoptionsguide.com/condor.aspx
  68. #
  69. # assetsN <- 4
  70. #
  71. # current.price <- 45
  72. #
  73. # assets.mat <- matrix(NA,assetsN,5)
  74. # colnames(assets.mat) <- c("trans","type","strike","price","amount")
  75. #
  76. # assets.mat[1,] <- c("buy",  "call",  35,  11, 1)
  77. # assets.mat[2,] <- c("buy",  "call",  55,  1, 1)
  78. # assets.mat[3,] <- c("sell", "call",  40,  7, 1)
  79. # assets.mat[4,] <- c("sell", "call",  50,  2, 1)
  80.  
  81. # ## some other strategy
  82. # assetsN <- 3
  83. #
  84. # assets.mat <- matrix(NA,assetsN,5)
  85. # colnames(assets.mat) <- c("trans","type","strike","price","amount")
  86. #
  87. # assets.mat[1,] <- c("sell",  "put",  500,  5,  1)
  88. # assets.mat[2,] <- c("sell",  "put",  700,  10, 1)
  89. # assets.mat[3,] <- c("buy",  "call", 1000,  15, 1)
  90.  
  91. ###
  92.  
  93. if (!exists("price.range")) {
  94.  
  95.   price.range <- range(as.numeric(assets.mat[,"strike"]))*c(0.8,1.2)
  96.   price.step  <- 0.1
  97.  
  98. }
  99.  
  100. x <- seq(price.range[1],price.range[2],price.step)
  101.  
  102. options.val <- matrix(NA,assetsN,length(x))
  103.  
  104. ###
  105.  
  106. OptionVal <- function(x,trans,type,strike,premium,amount=1) {
  107.  
  108.   strike  <- as.numeric(strike)
  109.   premium <- as.numeric(premium)
  110.   amount  <- as.numeric(amount)
  111.  
  112.   if (trans=="buy" && type=="base")   value <- x-strike-premium
  113.  
  114.   if (trans=="sell" && type=="base")  value <- strike-x-premium
  115.  
  116.   if (trans=="buy" && type=="call")   value <- max(x-strike,0)-premium
  117.  
  118.   if (trans=="sell" && type=="call")  value <- premium-max(x-strike,0)
  119.  
  120.   if (trans=="buy" && type=="put")    value <- max(strike-x,0)-premium
  121.  
  122.   if (trans=="sell" && type=="put")   value <- premium-max(strike-x,0)
  123.  
  124.   return( amount*value )
  125.  
  126. }
  127.  
  128. for (i in 1:assetsN)
  129.  
  130.   options.val[i,] <- sapply( x, function(x)
  131.    
  132.                                   OptionVal(x,
  133.                                             assets.mat[i,"trans"],
  134.                                             assets.mat[i,"type"],
  135.                                             assets.mat[i,"strike"],
  136.                                             assets.mat[i,"price"],
  137.                                             assets.mat[i,"amount"]) )
  138.  
  139. options.all <- colSums(options.val)
  140.  
  141. # rbind(x,options.all)
  142.  
  143. plot(options.all,
  144.      main="Payoff",ylab="profit/loss",xlab="price",
  145.      type="l",xaxt="n")
  146. if (!is.null(current.price)) abline(v=which(x==current.price),col="Green",lwd=2)
  147. abline(v=sapply(as.numeric(assets.mat[,"strike"]), function(s) which(x==s)),col="Blue",lty="dotted")
  148. abline(h=0,col="Red",lty="dashed")
  149. axis(1,seq(0,length(x),length.out=5),round(seq(min(x),max(x),length.out=5)))
  150.  
  151. assets.mat
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top