HSG-MCS-HS21_Julia/Problemsets/jlFiles/OptionsCalculations.jl

105 lines
3.5 KiB
Julia
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
BuildSTree(S,n,u,d)
Build binomial tree, starting at `S` and having `n` steps with up move `u` and down move `d`
# Output
- `STree:: Vector or vectors`: each (sub-)vector is for a time step. `STree[0] = [S]` and `STree[n]` is for time period n.
"""
function BuildSTree(S,n,u,d)
STree = [fill(NaN,i) for i = 1:n+1] #vector of vectors (of different lengths)
STree = OffsetArray(STree,0:n) #convert so the indices are 0:n
STree[0][1] = S #step 0 is in STree[0], element 1
for i = 1:n #move forward in time
STree[i][1:end-1] = u*STree[i-1] #up move from STree[i-1][1:end]
STree[i][end] = d*STree[i-1][end] #down move from STree[i-1][end]
end
return STree
end
"""
EuOptionPrice(STree,K,y,h,p,isPut=false)
Calculate price of European option from binomial model
# Output
- `Value:: Vector of vectors`: option values at different nodes, same structure as STree
"""
function EuOptionPrice(STree,K,y,h,p,isPut=false) #price of European option
Value = similar(STree) #tree for derivative, to fill
n = length(STree) - 1 #number of steps in STree
if isPut
Value[n] = max.(0,K.-STree[n]) #put, at last time node
else
Value[n] = max.(0,STree[n].-K) #call, at last time node
end
for i = n-1:-1:0 #move backward in time
Value[i] = exp(-y*h)*(p*Value[i+1][1:end-1] + (1-p)*Value[i+1][2:end])
end #p*up + (1-p)*down, discount
return Value
end
"""
AmOptionPrice(STree,K,y,h,p,isPut=false)
Calculate price of American option from binomial model
# Output
- `Value:: Vector of vectors`: option values at different nodes, same structure as STree
- `Exerc::` Vector of vectors`: true if early exercise at the node, same structure as STree
"""
function AmOptionPrice(STree,K,y,h,p,isPut=false) #price of American option
Value = similar(STree) #tree for derivative, to fill
n = length(STree) - 1
Exerc = similar(Value,BitArray) #same structure as STree, but BitArrays, empty
if isPut
Value[n] = max.(0,K.-STree[n]) #put, at last time node
else
Value[n] = max.(0,STree[n].-K) #call, at last time node
end
Exerc[n] = Value[n] .> 0 #exercise
for i = n-1:-1:0 #move backward in time
fa = exp(-y*h)*(p*Value[i+1][1:end-1] + (1-p)*Value[i+1][2:end])
if isPut
Value[i] = max.(K.-STree[i],fa) #put
else
Value[i] = max.(STree[i].-K,fa) #call
end
Exerc[i] = Value[i] .> fa #early exercise
end
return Value, Exerc
end
"""
Φ(x)
Calculate Pr(z<=x) for N(0,1) variable z
"""
function Φ(x)
Pr = cdf(Normal(0,1),x)
return Pr
end
"""
OptionBlackSPs(S,K,m,y,σ,δ=0,PutIt=false)
Calculate Black-Scholes European call or put option price, continuous dividends of δ
"""
function OptionBlackSPs(S,K,m,y,σ,δ=0,PutIt=false)
d1 = ( log(S/K) + (y-δ+0.5*σ^2)*m ) / (σ*sqrt(m))
d2 = d1 - σ*sqrt(m)
c = exp(-δ*m)*S*Φ(d1) - K*exp(-y*m)*Φ(d2)
if PutIt
price = c - exp(-δ*m)*S + exp(-y*m)*K
else
price = c
end
return price
end