import datetime as dtdates = [dt.datetime(2018, 1, 1), dt.datetime(2018, 7, 1), dt.datetime(2019, 1, 1)](dates[1] - dates[0]).days / 365# 0.4958904109589041(dates[2] - dates[1]).days / 365# 0.5041095890410959fractions = [0.0, 0.5, 1.0]# dates 和 fraction 定义(大致)等价import numpy as np# 获取年分数def get_year_deltas(date_list, day_count=365.): """ Return vector of floats with day deltas in years. Initial value normalized to zero. :param date_list: list or array collection of datetime objects :param day_count: float number of days for a year :return: delta_list:array year fractions """ start = date_list[0] delta_list = [(date - start).days / day_count for date in date_list] return np.array(delta_list)import datetime as dtdates = [dt.datetime(2018, 1, 1), dt.datetime(2018, 7, 1), dt.datetime(2019, 1, 1)]get_year_deltas(dates)# array([0. , 0.49589041, 1. ])
我们将焦点放在短期利率折现的最简单情况——也就是短期利率一直保持不变的情况。 许多期权定价模型, 如Black-Scholes-Merton 、 Merton 和 Cox-Ross-Rubinstein 都做出这个假设。我们假定连续折现,因为这是期权定价应用中常见的假设。在这种情况下,在给定未来日期 t 和固定短期利率 r 下,今天的一般折现因子可以由 得出。 当然,在结束日有一个特例。注意,t 和 T 都是年分数。
折现因子也可以解释为分别在 t 和 T 到期的单位零息债券(ZCB)的当日价值。给定两个日期 ,从 t 到 s 的折现因子可以由公式 给出。
固定短期利率下的风险中立折现类
class constant_short_rate(object): """ Class for constant short rate discounting """ def __init__(self, name, short_rate): """ :param name:string name of the object :param short_rate:float(positive) constant rate for discounting """ self.name = name self.short_rate = short_rate if short_rate < 0: raise ValueError('Short rate negative.') def get_discount_factors(self, date_list, dtobjects=True): """ get discount factors given a list/array of datetime objects or year fractions """ if dtobjects is True: dlist = get_year_deltas(date_list) else: dlist = np.array(date_list) dflist = np.exp(self.short_rate * np.sort(-dlist)) return np.array((date_list, dflist)).Timport datetime as dtdates = [dt.datetime(2018, 1, 1), dt.datetime(2018, 7, 1), dt.datetime(2019, 1, 1)]csr = constant_short_rate('csr', 0.05)csr.get_discount_factors(dates)# array([[datetime.datetime(2018, 1, 1, 0, 0), 0.951229424500714],# [datetime.datetime(2018, 7, 1, 0, 0), 0.9755103387657228],# [datetime.datetime(2019, 1, 1, 0, 0), 1.0]], dtype=object)deltas = get_year_deltas(dates)csr.get_discount_factors(deltas, dtobjects=False)# array([[0. , 0.95122942],# [0.49589041, 0.97551034],# [1. , 1. ]])
建立由常量、 列表和曲线组成的市场环境模型的类
# 建立由常量、 列表和曲线组成的市场环境模型的类class market_environment(object): def __init__(self, name, pricing_date): self.name = name self.pricing_date = pricing_date self.constants = {} self.lists = {} self.curves = {} def add_constant(self, key, constant): self.constants[key] = constant def get_constant(self, key): return self.constants[key] def add_list(self, key, list_object): self.lists[key] = list_object def get_list(self, key): return self.lists[key] def add_curve(self, key, curve): self.curves[key] = curve def get_curve(self, key): return self.curves[key] def add_environment(self, env): for key in env.constants: self.constants[key] = env.constants[key] for key in env.lists: self.lists[key] = env.lists[key] for key in env.curves: self.curves[key] = env.curves[key]import datetime as dtdates = [dt.datetime(2018, 1, 1), dt.datetime(2018, 7, 1), dt.datetime(2019, 1, 1)]csr = constant_short_rate('csr', 0.05)me_1 = market_environment('me_1', dt.datetime(2018, 1, 1))me_1.add_list('symbols', ['AAPL', 'MSFT', 'FB'])me_1.get_list('symbols')# ['AAPL', 'MSFT', 'FB']me_2 = market_environment('me_2', dt.datetime(2018, 1, 1))me_2.add_constant('volatility', 0.2)me_2.add_curve('short_rate', csr)me_2.get_curve('short_rate')# <__main__.constant_short_rate at 0x1a226781cc0>me_1.add_environment(me_2)me_1.get_curve('short_rate')# <__main__.constant_short_rate at 0x1a226781cc0>me_1.constants# {'volatility': 0.2}me_1.lists# {'symbols': ['AAPL', 'MSFT', 'FB']}me_1.curves# {'short_rate': <__main__.constant_short_rate at 0x1a226781cc0>}me_1.get_curve('short_rate').short_rate# 0.05
这一章节的内容比较少,这里只记录了一下Python代码 ^_^
联系客服