디지털금융: 두 판 사이의 차이
편집 요약 없음 |
|||
| 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 | |||