본문으로 이동

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

Coffee Wiki
편집 요약 없음
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

2025년 5월 7일 (수) 10:00 판

디지털금융(Digital Finance)은 경영학전공 4학년을 대상으로 재무관리, 투자론 및 기업재무 등 재무금융 분야 교과목에서 배운 이론을 기초적인 파이썬(Python) 프로그래밍 언어를 활용하여 실무적으로 숙달, 응용하는 강좌이다.

파이썬 기초

  • while 반복문

def savings_fixed(cf, r, t):

 total = 0.0
 i = 1
 while(i <= t):
   total += cf * (1 + r) ** i
   i += 1
 return total

초기값을 0.0으로 하고 (0.0으로 해야 정수로 인식할 수 있다.) whlie 반복문을 이용해서 현금흐름(cf)이 같은 경우에 사용할 수 있다. i값을 t보다 작거나 같은 값을 넣어주면서 fv 미래가치의 합을 구하는 코드이다.

  • for 반복문

def savings_free(cfs, r):

 total = 0.0
 for cf in cfs:
   total = (total + cf) * (1 + r)
 return total

초기값을 0.0으로 하고 for 반복문을 이용해서 현금흐름이 각 연도마다 다른 경우에 사용할 수 있다. cf 변수에 cfs 값을 넣어주면서 반복적으로 계산을 하여 fv 미래가치의 합을 구하는 코드이다. by 60180852

화폐의 시간가치

  • 연금

def annuity(cf, r, t):

 return cf * (1 - 1 / (1 + r) ** t) / r

def annuity2(cf, r, t):

 return cf/r - cf/r /(1+r) ** t

두 연금 코드는 같은 답을 도출하는데 밑에 코드를 먼저 이해하면 쉽게 이해할 수 있다. cf/r 는 영구연금을 구하는 방식이고 cf/r /(1+r) ** t 해당 부분은 t년후에 영구연금을 구하는 방식이다. 예를 들어 3년 연금을 구하는 방법은 영구연금에서 x4년차부터 시작하는 영구연금을 (1+r)**t로 할인하고 차감하는 방식이다.


  • 실습

def pv(cf, r,t):

 return cf / (1+r) ** t

def npv(r, cfs):

 total = 0.0
 for i, cf in enumerate(cfs):
   total += pv(cf,r,i)
 return total

def irr(cfs):

 rate = 0.0
 while(rate < 1.0):
   rate += 0.0001
   value = npv(rate, cfs)
   if(abs(value) <= 0.0001):
     print(rate)
rate = [] 
value = [] 
cfs = [-59, 155, -100]
for i in range(1, 100): 
 rate.append(i / 100) 
 value.append(npv(i / 100, cfs))

print(rate) print(value)

간단하게 설명해보면 해당 코드를 이용해서 npv값이 0이되는 rate를 찾는 과정을 나타내고 이를 그래프로 보여 주기 위해 rate와 vlaue를 찾아가는 과정이다. pv , npv, irr 코드를 저장하고 for 반복문에 append를 사용했는데 append()는 리스트에 새로운 값을 하나씩 추가할 때 사용하는 코드입니다. append를 이용해서 0.01~0.99 까지 값을 반복적으로 넣어주면서 해당 값을 찾아주는 코드입니다. by 60180852

채권

  • 채권의 가격

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