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

105 lines
3.5 KiB
Julia
Raw Normal View History

"""
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