Black-Sholes Equation¶
★만기가 기초자산의 만기가격과 같은 파생상품(델타원)의 현재 가치 구하기¶
원문 : https://sine-qua-none.tistory.com/100¶
$$ f(0,S_0) = e^{-rT}\mathbb{E}^{\mathbb{Q}}\left(f(T,S_T)\right)\\ f(T,S_T) = S_T $$시뮬레이션¶
$$ f(0,S_0) = e^{-rT}\mathbb{E}^{\mathbb{Q}}\left(S_T\right)=S_0e^{-dT}\\ $$의 가격 구하기
1. $S_T$ 표본(sample) 여러 개 생성하기¶
$$ S_T = S_0 exp \left(\left(r-d-\frac{1}{2}\sigma^2 \right)T + \sigma W_T \right)\\ W_T \sim \mathcal{N}\left(0,\sqrt{T}^2\right)\\ z \text{ : 정규화된 확률변수(z-score)}\\ z = \frac{확률변수 – 평균}{표준편차} = \frac{W_T – 0}{\sqrt{T}}, z \sim \mathcal{N}\left(0,1\right) \tag{1}\\ W_T = \sqrt{T}z\\ $$$$ S_T = S_0 exp \left(\left(r-d-\frac{1}{2}\sigma^2 \right)T + \sigma \sqrt{T}z \right) \tag{2} \\ $$따라서 $S_T$의 샘플은 표준정규분포를 따르는 $N$개의 난수 $z_1,z_2,\dots,z_N$을 생성 하고 이에 대응하는 $$ S_T^{(1)},S_T^{(2)},\dots,S_T^{(N)} \tag{3} $$ 을 생성 할 수 있다.
2. 표본 평균 구하기¶
$$ \bar{S} = \frac{1}{N}\left(S_T^{(1)},\dots,S_T^{(N)}\right) $$표본평균 $\bar{S}$는 $N$이 커지면 큰 수의 법칙에 의해 모평균 $\mathbb{E}^{\mathbb{Q}}\left(S_T\right)$에 가까워 진다. $$ \mathbb{E}^{\mathbb{Q}}\left(S_T\right) \approx \frac{1}{N}\left(S_T^{(1)},\dots,S_T^{(N)}\right) \tag{4} $$
3. 할인 팩터 $e^{-rT}$를 곱하여 결과 산출¶
$$ f(0,S_0) = e^{-rT}\mathbb{E}^{\mathbb{Q}}\left(S_T\right) = e^{-rT}\frac{1}{N}\sum^N_{i=1}S_T^{(i)}\\ $$In [6]:
using StatsPlots
using Distributions
using StatsBase
using Random
using Dates
In [1]:
versioninfo()
Julia Version 1.8.3 Commit 0434deb161e (2022-11-14 20:14 UTC) Platform Info: OS: Linux (x86_64-linux-gnu) CPU: 28 × Intel(R) Xeon(R) CPU E5-2690 v4 @ 2.60GHz WORD_SIZE: 64 LIBM: libopenlibm LLVM: libLLVM-13.0.1 (ORCJIT, broadwell) Threads: 1 on 28 virtual cores Environment: LD_LIBRARY_PATH = /usr/local/cuda/lib64:/usr/local/lib
In [118]:
function test_BSEquation(;S_0=100,σ=0.3,r=0.02,d=0.01,T=1,N=1_000,seed=nothing)
# S_0 : 초기 주가
# σ : 주가변동성
# r : 무위험 수익율
# d : 배당율
# T : 만기년
# N : samples
!isnothing(seed) && Random.seed!(seed)
drift = (r - d - 0.5*σ^2)*T
diffusion = σ*√T
# S_T Samples
S_T = S_0*exp.(drift .+ diffusion * randn(N))
S_T_cum_mean = exp(-r*T)*cumsum(S_T) ./ [1:N...]
S_T_sim = exp(-r*T)*mean(S_T)
S_T_exac = exp(-d*T)*S_0
display("Simulation : $(round(S_T_sim,digits=4))")
display("Exact Solution : $(round(S_T_exac,digits=4))")
display("S_T cummean : $(round(S_T_cum_mean[end],digits=4))")
plot(S_T_cum_mean,label="simulation")
hline!([S_T_exac],label="exact")
end
Out[118]:
test_BSEquation (generic function with 1 method)
In [129]:
seed = Int(floor(datetime2unix(now())))
test_BSEquation(N=20_000,seed=seed)
"Simulation : 99.2216"
"Exact Solution : 99.005"
"S_T cummean : 99.2216"
Out[129]:
In [ ]: