작성자: admin 작성일시: 2016-07-10 19:10:56 조회수: 294 다운로드: 44
카테고리: 금융 공학 태그목록:

VaR and CVA

VaR: Values at Risk

  • 특정한 확률적 신뢰도 하에서
  • 특정 시간 내에 발생할 수 있는
  • 화폐로 환산한
  • 손실 가능 금액

예를 들어 99%-30일 VaR 가 5만달러이면 "30일 후에 발생할 손실은 99%의 확률로 5만 달러 이내"라는 뜻

In:
import numpy as np
import numpy.random as npr
import matplotlib.pyplot as plt
npr.seed(0)

몬테카를로 시뮬레이션

경우 1: 블랙-숄즈-머튼 모형

  • 확률 방정식 $$ dS_t = r S_t dt + \sigma S_t dZ_t $$

  • 오일러 이산화 $$ S_T = S_0 \text{exp} \left( (r-0.5\sigma^2)\Delta T + \sigma\sqrt{\Delta T} z_t \right) $$

In:
S0 = 100
r = 0.05
sigma = 0.25
T = 30 / 365.
I = 10000
ST = S0 * np.exp((r - 0.5 * sigma ** 2) * T 
             + sigma * np.sqrt(T) * npr.standard_normal(I))
In:
R_gbm = np.sort(ST - S0)
In:
plt.hist(R_gbm, bins=50)
plt.xlabel('absolute return')
plt.ylabel('frequency')
plt.grid(True)
plt.show()
In:
percs = [0.01, 0.1, 1., 2.5, 5.0, 10.0]
var = np.percentile(R_gbm, percs)
print("%16s %16s" % ('Confidence Level', 'Value-at-Risk'))
print(33 * "-")
for pair in zip(percs, var):
    print("%16.2f %16.3f" % (100 - pair[0], -pair[1]))
Confidence Level    Value-at-Risk
---------------------------------
           99.99           21.463
           99.90           19.115
           99.00           15.098
           97.50           12.824
           95.00           10.904
           90.00            8.758

경우 2: 머튼의 점프 확산 모형

  • 확률 방정식 $$ dS_t = (r-r_J) S_t dt + \sigma S_t dZ_t + J_t S_t dN_t $$

  • 오일러 이산화 $$ S_T = S_0 \left( \exp \left(r - r_J - 0.5\sigma^2)\Delta T + \sigma \sqrt{\Delta T} z_t^{(1)} \right) + \left( \exp \left( \mu_J + \delta z_t^{(2)} \right) - 1 \right)y \right) $$

In:
S0 = 100.
r = 0.05
sigma = 0.2
lamb = 0.75
mu = -0.6
delta = 0.25
T = 1.0
In:
M = 50
In:
dt = 30. / 365 / M
rj = lamb * (np.exp(mu + 0.5 * delta ** 2) - 1)
S = np.zeros((M + 1, I))
S[0] = S0
sn1 = npr.standard_normal((M + 1, I))
sn2 = npr.standard_normal((M + 1, I))
poi = npr.poisson(lamb * dt, (M + 1, I))
for t in range(1, M + 1, 1):
    S[t] = S[t - 1] * (np.exp((r - rj - 0.5 * sigma ** 2) * dt
                       + sigma * np.sqrt(dt) * sn1[t])
                       + (np.exp(mu + delta * sn2[t]) - 1)
                       * poi[t])
    S[t] = np.maximum(S[t], 0)
In:
R_jd = np.sort(S[-1] - S0)
In:
plt.hist(R_jd, bins=50)
plt.xlabel('absolute return')
plt.ylabel('frequency')
plt.grid(True)
plt.show()
In:
percs = [0.01, 0.1, 1., 2.5, 5.0, 10.0]
var = np.percentile(R_jd, percs)
print("%16s %16s" % ('Confidence Level', 'Value-at-Risk'))
print(33 * "-")
for pair in zip(percs, var):
    print("%16.2f %16.3f" % (100 - pair[0], -pair[1]))
Confidence Level    Value-at-Risk
---------------------------------
           99.99           86.759
           99.90           73.959
           99.00           56.001
           97.50           46.267
           95.00           28.788
           90.00            6.448
In:
percs = list(np.arange(0.0, 10.1, 0.1))
gbm_var = np.percentile(R_gbm, percs)
jd_var = np.percentile(R_jd, percs)
In:
plt.plot(percs, gbm_var, 'b', lw=1.5, label='GBM')
plt.plot(percs, jd_var, 'r', lw=1.5, label='JD')
plt.legend(loc=4)
plt.xlabel('100 - confidence level [%]')
plt.ylabel('value-at-risk')
plt.grid(True)
plt.ylim(ymax=0.0)
plt.show()

위 결과에서 보듯이 현실적인 점프 확산 모형에서 보이는 테일 리스크(tail-risk)를 블랙-숄즈-머튼 모형에서는 포착하지 못한다.

CVA: Credit Value Adjustments

  • 거래 상대방이 부도(default)를 내는 경우를 감안한 기대 손실
  • 부도 확률(default probability)과 손실 수준(loss level, loss given default)을 감안한 위험 측도

블랙-숄즈-머튼 모형에 의한 주가 몬테카를로 시뮬레이션

In:
S0 = 100.
r = 0.05
sigma = 0.2
T = 1.
I = 100000
ST = S0 * np.exp((r - 0.5 * sigma ** 2) * T 
             + sigma * np.sqrt(T) * npr.standard_normal(I))
In:
plt.hist(ST, bins=50)
plt.xlabel('absolute return')
plt.ylabel('frequency')
plt.grid(True)
plt.show()

부도 모형

  • 부도 확률 1% 포아송 분포
  • 손실 수준 50%
In:
L = 0.5
p = 0.01
D = npr.poisson(p * T, I)
D = np.where(D > 1, 1, D)

자산에 대한 CVaR/CVA 계산

  • 부도가 없을 경우의 자산 가치
In:
np.exp(-r * T) * 1 / I * np.sum(ST)
Out:
100.03341817963384
  • 부도로 인한 위험 (Credit VaR)
In:
plt.hist(L * D * ST, bins=50)
plt.xlabel('absolute return')
plt.ylabel('frequency')
plt.grid(True)
plt.ylim(0,100)
plt.show()
In:
CVaR = np.exp(-r * T) * 1 / I * np.sum(L * D * ST)
CVaR
Out:
0.5095593715934863
  • 부도를 감안한 자산 가치
In:
plt.hist(ST, bins=100, alpha=0.6)
plt.hist((1 - L * D) * ST, bins=100, alpha=0.3, color="r")
plt.xlabel('absolute return')
plt.ylabel('frequency')
plt.grid(True)
plt.show()
In:
S0_CVA = np.exp(-r * T) * 1 / I * np.sum((1 - L * D) * ST)
S0_CVA
Out:
99.523858808040359
In:
S0_adj = S0 - CVaR
S0_adj
Out:
99.490440628406517
  • 부도 횟수는 100,000 번의 시뮬레이션 중 1017회 = 1.017%
In:
np.count_nonzero(L * D * ST)
Out:
1017
  • 부도로 인한 손실 분포
In:
plt.hist(L * D * ST, bins=50)
plt.xlabel('loss')
plt.ylabel('frequency')
plt.grid(True)
plt.ylim(ymax=175)
plt.show()

콜옵션에 대한 CVaR/CVA 계산

  • 부도가 없을 경우의 콜옵션 가치
In:
K = 100.
hT = np.maximum(ST - K, 0)
C0 = np.exp(-r * T) * 1 / I * np.sum(hT)
C0
Out:
10.505357338886624
  • 부도로 인한 위험 (Credit VaR)
In:
CVaR = np.exp(-r * T) * 1 / I * np.sum(L * D * hT)
CVaR
Out:
0.054740534082970513
  • 부도를 감안한 콜옵션 가치
In:
C0_CVA = np.exp(-r * T) * 1 / I * np.sum((1 - L * D) * hT)
C0_CVA
Out:
10.450616804803651
In:
np.count_nonzero(L * D * hT)  # number of losses
Out:
561
In:
np.count_nonzero(D)  # number of defaults
Out:
1017
In:
I - np.count_nonzero(hT)  # zero payoff
Out:
44187
In:
plt.hist(L * D * hT, bins=50)
plt.xlabel('loss')
plt.ylabel('frequency')
plt.grid(True)
plt.ylim(ymax=350)
plt.show()

콜옵션의 경우에는 CVaR 값이 기초 자산의 경우보다 훨씬 낮아진다.

  • 0.5 -> 0.05

질문/덧글

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