작성자: admin 작성일시: 2016-08-23 16:47:57 조회수: 101 다운로드: 24
카테고리: 금융 공학 태그목록:

옵션 Greek

옵션의 가치 $V$는 기본적으로 현재 시각 $t$에서의 기초 자산의 현재 가격 $S$, 만기까지의 남은 시간 $T-t$, 변동성 $\sigma$, 이자율 $r$ 등에 의해 결정되는 함수이다.

$$ V = V(t, S, \sigma, r) $$

따라서 이들 변수나 파라미터가 변하면 옵션의 가치도 변화한다. 이러한 변화의 정도 즉 민감도(sensitivity)는 그리스 알파벳(vega는 그리스 알파벳이 아니지만 관례적으로 Greek이라고 한다.)으로 나타내는 것이 일반적이므로 옵션의 Greek 이라고 한다. 많이 사용하는 Greek은 다음과 같다.

변수/파라미터 Greek 정의
시간 $t$ theta $\Theta$ $\dfrac{\partial V}{\partial t}$
주가 $S$ delta $\Delta$ $\dfrac{\partial V}{\partial S}$
변동성 $\sigma$ vega V $\dfrac{\partial V}{\partial \sigma}$
이자율 $r$ rho $\rho$ $\dfrac{\partial V}{\partial r}$

유러피안 바닐라 콜 옵션의 Greek

유러피안 바닐라 콜 옵션의 경우에는 블랙-숄즈-머튼 공식에 의해 옵션의 가치 및 Greek이 다음과 같이 closed-form 형태로 주어진다.

옵션 가치

$$ V = SN(d_1)-Ke^{-r(T-t)}N(d_2) $$

여기에서 $N$ 은 다음과 같은 표준 정규 분포(standard normal distribution)의 누적 밀도 함수(cumulative density function)이고

$$ N(y) = \dfrac{1}{\sqrt{2\pi}} \int_{-\infty}^y e^{-\frac{z^2}{2}} \; dz $$

$d_1$, $d_2$ 는 다음과 같이 정의된다.

\begin{eqnarray} d_1 &=& \dfrac{1}{\sigma \sqrt{(T-t)}} \Big( \log \dfrac{S}{K} + \big(r + \dfrac{\sigma^2}{2}\big)(T-t) \Big) \\ d_2 &=& \dfrac{1}{\sigma \sqrt{(T-t)}} \Big( \log \dfrac{S}{K} + \big(r - \dfrac{\sigma^2}{2}\big)(T-t) \Big) \\ \end{eqnarray}
In [58]:
def call_value(S, T, sigma, r, K):
    if T == 0:
        return np.maximum(S - K, 0)
    d1 = ((np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)))
    d2 = ((np.log(S / K) + (r - 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)))
    value = (S * sp.stats.norm.cdf(d1, 0, 1) - K * np.exp(-r * T) * sp.stats.norm.cdf(d2, 0, 1))
    return value
In [59]:
r = 0.05
sigma = 0.20
K = 100

maturities = np.linspace(0, 0.5, 7)
prices = np.linspace(80, 120, 101)
T, S = np.meshgrid(maturities, prices)
V = np.zeros_like(S)
for i, s in enumerate(prices):
    for j, t in enumerate(maturities):
        V[i, j] = call_value(s, t, sigma, r, K)

plt.plot(prices, V)
plt.xlabel('prices')
plt.ylabel('European call value')
plt.legend(["%d month" % i for i in range(13)], loc=2)
plt.show()

Theta

$$ \Theta = \dfrac{\partial V}{\partial t} = -\frac{\sigma S N'(d_1) }{2 \sqrt{(T-t)}} - rKe^{-r (T-t)}\Phi(d_2) $$
In [60]:
def call_theta(S, T, sigma, r, K):
    d1 = ((np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)))
    d2 = ((np.log(S / K) + (r - 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)))
    theta = -(S * sigma * sp.stats.norm.pdf(d1, 0, 1)/(2 * np.sqrt(T)) - r * K * np.exp(-r * T) * sp.stats.norm.cdf(d2, 0, 1))
    return theta
In [68]:
r = 0.05
sigma = 0.20
K = 100

maturities = np.linspace(0, 0.5, 7)
prices = np.linspace(80, 120, 101)
T, S = np.meshgrid(maturities, prices)
X = np.zeros_like(S)
for i, s in enumerate(prices):
    for j, t in enumerate(maturities):
        X[i, j] = call_theta(s, t, sigma, r, K) / 12.0

plt.plot(prices, X)
plt.title("Call Theta")
plt.xlabel('prices')
plt.ylabel('European call theta')
plt.legend(["%d month" % i for i in range(13)], loc=2)
plt.show()

Delta

$$ \Delta = \dfrac{\partial V}{\partial S} = N(d_1) $$
In [62]:
def call_delta(S, T, sigma, r, K):
    if T == 0:
        return int(S > K)
    d1 = ((np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)))
    delta = sp.stats.norm.cdf(d1, 0, 1)
    return delta
In [69]:
r = 0.05
sigma = 0.20
K = 100

maturities = np.linspace(0, 0.5, 7)
prices = np.linspace(80, 120, 101)
T, S = np.meshgrid(maturities, prices)
X = np.zeros_like(S)
for i, s in enumerate(prices):
    for j, t in enumerate(maturities):
        X[i, j] = call_delta(s, t, sigma, r, K)

plt.plot(prices, X)
plt.title("Call Delta")
plt.xlabel('prices')
plt.ylabel('European call delta')
plt.legend(["%d month" % i for i in range(13)], loc=2)
plt.show()

Vega

$$ V = \dfrac{\partial V}{\partial \sigma}= S N'(d_1) \sqrt{(T-t)} $$
In [64]:
def call_vega(S, T, sigma, r, K):
    if T == 0:
        return 0
    d1 = ((np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)))
    vega = S * sp.stats.norm.pdf(d1, 0, 1) * np.sqrt(T)
    return vega
In [70]:
r = 0.05
sigma = 0.20
K = 100

maturities = np.linspace(0, 0.5, 7)
prices = np.linspace(80, 120, 101)
T, S = np.meshgrid(maturities, prices)
X = np.zeros_like(S)
for i, s in enumerate(prices):
    for j, t in enumerate(maturities):
        X[i, j] = call_vega(s, t, sigma, r, K) * 0.01

plt.plot(prices, X)
plt.title("Call Vega")
plt.xlabel('prices')
plt.ylabel('European call vega')
plt.legend(["%d month" % i for i in range(13)], loc=2)
plt.show()

Rho

$$ \rho = \dfrac{\partial V}{\partial r} = K (T-t) e^{-r(T-t)}N(d_2) $$
In [66]:
def call_rho(S, T, sigma, r, K):
    d2 = ((np.log(S / K) + (r - 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)))
    rho = K * T * np.exp(-r * T) * sp.stats.norm.cdf(d2, 0, 1)
    return rho
In [72]:
r = 0.05
sigma = 0.20
K = 100

maturities = np.linspace(0, 0.5, 7)
prices = np.linspace(80, 120, 101)
T, S = np.meshgrid(maturities, prices)
X = np.zeros_like(S)
for i, s in enumerate(prices):
    for j, t in enumerate(maturities):
        X[i, j] = call_rho(s, t, sigma, r, K) * 0.01

plt.plot(prices, X)
plt.title("Call Rho")
plt.xlabel('prices')
plt.ylabel('European call rho')
plt.legend(["%d month" % i for i in range(13)], loc=2)
plt.show()

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!