디지털금융: 두 판 사이의 차이

편집 요약 없음
71번째 줄: 71번째 줄:


= 채권 =
= 채권 =
*채권의 가격
def bondprice(ytm, face, maturity, coupon, freq = 'annual'):
  if freq == 'annual':
    m = 1
  elif freq == 'semi-annual':
    m = 2
  elif freq == 'quarterly':
    m = 4
  elif freq == 'monthly':
    m = 12
  elif freq == 'daily':
    m = 365
  else:
    m = 0
  try:
    return face * coupon * (1 - 1 / (1 + ytm / m) ** (maturity * m)) / ytm + face / (1 + ytm / m) ** (maturity * m)
  except ZeroDivisionError:
    return print("Error: freq should be either 'annual', 'semi-annual', 'quarterly', 'monthly', or 'daily'.")
bondprice(0.1,1000,5,0.03,'annual')
일단 m을 구하는 과정을 코드로 작성해야 하는데 coupon*face (표시이자)를 1년마다 주는지 반년마다 주는지 분기마다 주는지를 if 함수를 통해 구하는 과정이다. 이렇게 구해진 m을 가져와서 채권의 가격을 구한다.
변수가 많아서 헷갈릴 수 있지만 결국에는 연금공식을 이용한 풀이이다. 거기에 만기에 받을 face를 pv화 하는 코드를 더해주면 된다.
* 가중평균만기 (duration)
def pv(r, cf, t):
  return cf / (1 + r) ** t
def duration(ytm, face, maturity, coupon, freq = 'annual'):
  if freq == 'annual':
    m = 1
  elif freq == 'semi-annual':
    m = 2
  elif freq == 'quarterly':
    m = 4
  elif freq == 'monthly':
    m = 12
  elif freq == 'daily':
    m = 365
  else:
    m = 0
  try:
    n = maturity * m
    val = pv(ytm / m, face, n) * maturity
    total = pv(ytm / m, face, n)
    for i in range(1, n + 1):
      val += pv(ytm / m, face * coupon / m, i) * (i / m)
      total += pv(ytm / m, face * coupon / m, i)
  except ZeroDivisionError:
    return print("Error: freq should be either 'annual', 'semi-annual', 'quarterly', 'monthly', or 'daily'.")
  return val / total
듀레이션을 구하는 과정은 분수 부분은 각 pv현금흐름을 * 해당 t를 곱합 값이다. 일단 val변수를 설정을 하고 for 반복문을 통해 각 사업년도에 현금흐름 * t를 더해주는 반복문을 설정하면 된다.
분모 부분은 tatal 변수를 설정하고 채권의 가격을 구하는 과정이라고 생각하면 된다. val/tatal를 마지막에 작성해주면서 가중평균만기를 구해주는 코드를 작성하면 된다.  by 60180852