aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/analytics/index.py98
-rw-r--r--python/analytics/option.py38
-rw-r--r--python/analytics/portfolio.py24
-rw-r--r--python/analytics/scenarios.py6
-rw-r--r--python/tests/test_cds.py9
-rw-r--r--python/tests/test_index.py22
-rw-r--r--python/tests/test_scenarios.py4
-rw-r--r--python/tests/test_swaption.py8
8 files changed, 104 insertions, 105 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py
index 58cada76..f27bef6d 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -53,11 +53,11 @@ class Index(object):
""" minimal class to represent a credit index """
__slots__ = ['fixed_rate', 'notional', '_start_date', '_end_date',
'recovery', '_version', '_fee_leg', '_default_leg',
- '_trade_date', '_yc', '_sc', '_risky_annuity', '_spread',
+ '_value_date', '_yc', '_sc', '_risky_annuity', '_spread',
'_price', 'name', 'issue_date', '_quote_is_price',
'_direction', 'currency', '_step_in_date', '_accrued',
- '_value_date', '_dl_pv', '_pv', '_clean_pv',
- '_original_clean_pv', '_original_trade_date',
+ '_cash_settle_date', '_dl_pv', '_pv', '_clean_pv',
+ '_original_clean_pv', '_trade_date',
'index_type', 'series', 'tenor', '_observed']
def __init__(self, start_date, end_date, recovery, fixed_rate,
notional=10e6, quote_is_price=False, issue_date=None):
@@ -80,7 +80,7 @@ class Index(object):
self._fee_leg = FeeLeg(self._start_date, end_date, True, 1., 1.)
self._default_leg = ContingentLeg(self._start_date, end_date, True)
- self._trade_date = None
+ self._value_date = None
self._yc, self._sc = None, None
self._risky_annuity = None
self._spread, self._price = None, None
@@ -88,9 +88,9 @@ class Index(object):
self.issue_date = issue_date
self._quote_is_price = quote_is_price
self._direction = -1.
- for attr in ['currency', '_step_in_date', '_value_date', '_accrued',
+ for attr in ['currency', '_step_in_date', '_cash_settle_date', '_accrued',
'_dl_pv', '_pv', '_clean_pv', '_original_clean_pv',
- '_original_trade_date', 'index_type', 'series', 'tenor']:
+ '_trade_date', 'index_type', 'series', 'tenor']:
setattr(self, attr, None)
self._observed = WeakSet()
@@ -148,16 +148,16 @@ class Index(object):
raise ValueError("Direction needs to be either 'Buyer' or 'Seller'")
def _update(self):
- self._sc = SpreadCurve(self.trade_date, self._yc, self.start_date,
- self._step_in_date, self._value_date,
+ self._sc = SpreadCurve(self.value_date, self._yc, self.start_date,
+ self._step_in_date, self._cash_settle_date,
[self.end_date], np.array([self._spread]), np.zeros(1),
np.array([self.recovery]))
- self._risky_annuity = self._fee_leg.pv(self.trade_date, self._step_in_date,
- self._value_date, self._yc,
+ self._risky_annuity = self._fee_leg.pv(self.value_date, self._step_in_date,
+ self._cash_settle_date, self._yc,
self._sc, False)
self._dl_pv = self._default_leg.pv(
- self.trade_date, self._step_in_date, self._value_date,
+ self.value_date, self._step_in_date, self._cash_settle_date,
self._yc, self._sc, self.recovery)
self._pv = self._dl_pv - self._risky_annuity * self.fixed_rate * 1e-4
self._clean_pv = self._pv + self._accrued * self.fixed_rate * 1e-4
@@ -209,16 +209,16 @@ class Index(object):
if self._price is None or math.fabs(val-self._price) > 1e-6:
self._clean_pv = (100 - val) / 100
self._sc = SpreadCurve(
- self.trade_date, self._yc, self.start_date,
- self._step_in_date, self._value_date,
+ self.value_date, self._yc, self.start_date,
+ self._step_in_date, self._cash_settle_date,
[self.end_date], array.array('d',[self.fixed_rate*1e-4]),
array.array('d', [self._clean_pv]),
array.array('d', [self.recovery]))
self._risky_annuity = self._fee_leg.pv(
- self.trade_date, self._step_in_date, self._value_date,
+ self.value_date, self._step_in_date, self._cash_settle_date,
self._yc, self._sc, False)
self._dl_pv = self._default_leg.pv(
- self.trade_date, self._step_in_date, self._value_date,
+ self.value_date, self._step_in_date, self._cash_settle_date,
self._yc, self._sc, self.recovery)
self._pv = self._clean_pv - self._accrued * self.fixed_rate * 1e-4
self._spread = self._clean_pv / (self._risky_annuity - self._accrued) \
@@ -250,13 +250,13 @@ class Index(object):
@property
def theta(self):
- old_pv, old_trade_date = self.clean_pv, self.trade_date
+ old_pv, old_value_date = self.clean_pv, self.value_date
with warnings.catch_warnings():
warnings.simplefilter("ignore")
- self.trade_date = self.trade_date + relativedelta(days=1)
+ self.value_date = self.value_date + relativedelta(days=1)
carry = self.notional * self._direction * self.fixed_rate * 1e-4/360
roll_down = self.clean_pv - old_pv
- self.trade_date = old_trade_date
+ self.value_date = old_value_date
return carry + roll_down
@property
@@ -265,7 +265,7 @@ class Index(object):
# for rh in self._helpers:
# rh.quote += 1e-4
# self._yc = ql_to_jp(self._ql_yc)
- helpers = rate_helpers(self.currency, evaluation_date=self.trade_date)
+ helpers = rate_helpers(self.currency, evaluation_date=self.value_date)
for rh in helpers:
rh.quote += 1e-4
ql_yc = YC(helpers)
@@ -301,32 +301,32 @@ class Index(object):
return self._risky_annuity - self._accrued
@property
- def trade_date(self):
- if self._trade_date is None:
- raise AttributeError('Please set trade_date first')
+ def value_date(self):
+ if self._value_date is None:
+ raise AttributeError('Please set value_date first')
else:
- return self._trade_date
+ return self._value_date
- @trade_date.setter
- def trade_date(self, d):
+ @value_date.setter
+ def value_date(self, d):
if isinstance(d, datetime.datetime):
d = d.date()
self.start_date = previous_twentieth(d)
self._yc = get_curve(d, self.currency)
# use the rolled forward curve if we price something in the future
- if self._yc.base_date < d:
- self._yc = self._yc.expected_forward_curve(d)
- self._trade_date = d
- self._step_in_date = self.trade_date + datetime.timedelta(days=1)
+ # if self._yc.base_date < d:
+ # self._yc = self._yc.expected_forward_curve(d)
+ self._value_date = d
+ self._step_in_date = d + datetime.timedelta(days=1)
self._accrued = self._fee_leg.accrued(self._step_in_date)
- self._value_date = pd.Timestamp(self._trade_date) + 3* BDay()
+ self._cash_settle_date = pd.Timestamp(self._value_date) + 3* BDay()
if self._spread is not None:
self._update()
self.notify()
def reset_pv(self):
self._original_clean_pv = self._clean_pv
- self._original_trade_date = self._trade_date
+ self._trade_date = self._value_date
@property
def pnl(self):
@@ -334,7 +334,7 @@ class Index(object):
raise ValueError("original pv not set")
else:
## TODO: handle factor change
- days_accrued = (self.trade_date - self._original_trade_date).days / 360
+ days_accrued = (self.value_date - self._trade_date).days / 360
return - self._direction * self.notional * self.factor * \
(self._clean_pv - self._original_clean_pv -
days_accrued * self.fixed_rate * 1e-4)
@@ -347,7 +347,7 @@ class Index(object):
self._observed.add(obj)
def mark(self):
- if self.trade_date == datetime.date.today():
+ if self.value_date == datetime.date.today():
with init_bbg_session(BBG_IP) as session:
security = self.name + " Corp"
field = "PX_LAST"
@@ -356,14 +356,14 @@ class Index(object):
else:
run = _engine.execute("""SELECT * FROM index_quotes
WHERE index=%s AND series=%s AND tenor=%s AND date=%s""",
- (self.index_type, self.series, self.tenor, self.trade_date))
+ (self.index_type, self.series, self.tenor, self.value_date))
rec = run.fetchone()
self.spread = rec.closespread
@property
def factor(self):
for lastdate, factor, _ in self._version:
- if lastdate >= self.trade_date:
+ if lastdate >= self.value_date:
return factor
else:
return 1
@@ -371,13 +371,13 @@ class Index(object):
@property
def version(self):
for lastdate, _, version in self._version:
- if lastdate >= self.trade_date:
+ if lastdate >= self.value_date:
return version
else:
return None
@classmethod
- def from_name(cls, index=None, series=None, tenor=None, trade_date=datetime.date.today(),
+ def from_name(cls, index=None, series=None, tenor=None, value_date=datetime.date.today(),
notional=10_000_000, redcode=None, maturity=None):
if all([index, series, tenor]):
sql_str = "SELECT indexfactor, lastdate, maturity, coupon, " \
@@ -409,7 +409,7 @@ class Index(object):
return None
else:
recovery = 0.4 if index_type in ['IG', 'EU'] else 0.3
- instance = cls(trade_date, maturity, recovery, coupon, notional,
+ instance = cls(value_date, maturity, recovery, coupon, notional,
index_type == "HY", df.issue_date[0])
instance._version = tuple((ld.date(), factor / 100, version) for ld, factor, version in \
df[['lastdate', 'indexfactor', 'version']].itertuples(index=False))
@@ -428,7 +428,7 @@ class Index(object):
instance.currency = "USD"
else:
instance.currency = "EUR"
- instance.trade_date = trade_date
+ instance.value_date = value_date
return instance
@classmethod
@@ -452,10 +452,10 @@ class Index(object):
instance.name = rec.security_desc
instance.currency = rec.currency
instance.direction = rec.protection
- instance.trade_date = rec.trade_date
+ instance.value_date = rec.trade_date
instance.pv = rec.upfront
instance._original_clean_pv = instance._clean_pv
- instance._original_trade_date = rec.trade_date
+ instance._trade_date = rec.trade_date
instance.index_type = index_type
instance.series = rec.series
instance.tenor = rec.tenor
@@ -488,8 +488,8 @@ class Index(object):
s += build_table(rows, format_strings, "{:<20}{:>19}\t\t{:<20}{:>15}")
s += ["",
colored("Calculator", attrs = ['bold'])]
- rows = [["Valuation Date", self.trade_date],
- ["Cash Settled On", self._value_date]]
+ rows = [["Valuation Date", self.value_date],
+ ["Cash Settled On", self._cash_settle_date]]
format_strings = [[None, '{:%m/%d/%y}'],
[None, '{:%m/%d/%y}']]
s += build_table(rows, format_strings, "{:<20}\t{:>15}")
@@ -524,8 +524,8 @@ class ForwardIndex(object):
@classmethod
def from_name(cls, index_type, series, tenor, forward_date,
- trade_date=datetime.date.today(), notional=10e6):
- index = Index.from_name(index_type, series, tenor, trade_date, notional)
+ value_date=datetime.date.today(), notional=10e6):
+ index = Index.from_name(index_type, series, tenor, value_date, notional)
return cls(index, forward_date)
@property
@@ -552,12 +552,12 @@ class ForwardIndex(object):
return hash(tuple(getattr(self, k) for k in ForwardIndex.__slots__ if k != '__weakref__'))
def _update(self, *args):
- if self.index.trade_date > self.forward_date:
- return
+ if self.index.value_date > self.forward_date:
+ raise ValueError("Option expired")
if self.index._sc is not None:
step_in_date = self.forward_date + datetime.timedelta(days=1)
- a = self.index._fee_leg.pv(self.index.trade_date, step_in_date,
- self.index.trade_date, self.index._yc, self.index._sc, False)
+ a = self.index._fee_leg.pv(self.index.value_date, step_in_date,
+ self.index.value_date, self.index._yc, self.index._sc, False)
Delta = self.index._fee_leg.accrued(step_in_date)
q = self.index._sc.survival_probability(self.forward_date)
self._forward_annuity = a - Delta * self.df * q
diff --git a/python/analytics/option.py b/python/analytics/option.py
index f21f683f..4257b4e9 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -104,7 +104,7 @@ class BlackSwaption(ForwardIndex):
if rec is None:
return ValueError("trade_id doesn't exist")
if index is None:
- index = Index.from_name(redcode=rec.security_id, maturity=rec.maturity, trade_date=rec.trade_date)
+ index = Index.from_name(redcode=rec.security_id, maturity=rec.maturity, value_date=rec.trade_date)
index.ref = rec.index_ref
instance = cls(index, rec.expiration_date, rec.strike, rec.swaption_type.lower(),
direction="Long" if rec.buysell else "Short")
@@ -243,7 +243,7 @@ class BlackSwaption(ForwardIndex):
if self._original_pv is None:
raise ValueError("original pv not set")
else:
- if self.index.trade_date > self.forward_date: #TODO: do the right thing
+ if self.index.value_date > self.forward_date: #TODO: do the right thing
return 0 - self._original_pv
else:
return self.pv - self._original_pv
@@ -268,7 +268,7 @@ class BlackSwaption(ForwardIndex):
if self._T:
return self._T
else:
- return ((self.exercise_date - self.index.trade_date).days + 0.25)/365
+ return ((self.exercise_date - self.index.value_date).days + 0.25)/365
@property
def gamma(self):
@@ -330,7 +330,7 @@ class BlackSwaption(ForwardIndex):
s = ["{:<20}{}".format(self.index.name, self.option_type),
"",
"{:<20}\t{:>15}".format("Trade Date", ('{:%m/%d/%y}'.
- format(self.index.trade_date)))]
+ format(self.index.value_date)))]
rows = [["Ref Sprd (bp)", self.index.spread, "Coupon (bp)", self.index.fixed_rate],
["Ref Price", self.index.price, "Maturity Date", self.index.end_date]]
format_strings = [[None, "{:.2f}", None, "{:,.2f}"],
@@ -448,7 +448,7 @@ def _get_keys(df, models=["black", "precise"]):
yield (quotedate, source, option_type)
class QuoteSurface():
- def __init__(self, index_type, series, tenor='5yr', trade_date=datetime.date.today()):
+ def __init__(self, index_type, series, tenor='5yr', value_date=datetime.date.today()):
self._quotes = pd.read_sql_query(
"SELECT quotedate, index, series, ref, fwdspread, expiry, " \
"swaption_quotes.*, quote_source " \
@@ -459,7 +459,7 @@ class QuoteSurface():
"ORDER BY quotedate DESC",
_engine,
parse_dates=['quotedate', 'expiry'],
- params=(trade_date, index_type.upper(), series))
+ params=(value_date, index_type.upper(), series))
self._quotes.loc[(self._quotes.quote_source == "GS") & (self._quotes['index'] =="HY"),
["pay_bid", "pay_offer", "rec_bid", "rec_offer"]] *=100
if self._quotes.empty:
@@ -468,7 +468,7 @@ class QuoteSurface():
dt.tz_convert('America/New_York').
dt.tz_localize(None))
self._quotes = self._quotes.sort_values('quotedate')
- self.trade_date = trade_date
+ self.value_date = value_date
def list(self, source=None):
"""returns list of quotes"""
@@ -481,8 +481,8 @@ class QuoteSurface():
return r
class VolSurface(QuoteSurface):
- def __init__(self, index_type, series, tenor='5yr', trade_date=datetime.date.today()):
- super().__init__(index_type, series, tenor, trade_date)
+ def __init__(self, index_type, series, tenor='5yr', value_date=datetime.date.today()):
+ super().__init__(index_type, series, tenor, value_date)
self._surfaces = {}
def __getitem__(self, surface_id):
@@ -491,7 +491,7 @@ class VolSurface(QuoteSurface):
quotes = self._quotes[(self._quotes.quotedate == quotedate) &
(self._quotes.quote_source == source)]
quotes = quotes.assign(moneyness=quotes.strike / quotes.fwdspread,
- time=((quotes.expiry - self.trade_date).dt.days + 0.25) / 365)
+ time=((quotes.expiry - self.value_date).dt.days + 0.25) / 365)
spline = lambda df: CubicSpline(np.log(df.moneyness), df.vol, bc_type="natural")
h = quotes.sort_values('moneyness').groupby('time').apply(spline)
self._surfaces[surface_id] = MyInterp(h.index.values, h.values)
@@ -552,9 +552,9 @@ def _calibrate(index, quotes, option_type, **kwargs):
return _calibrate_sabr(index, quotes, option_type, kwargs['beta'])
class ModelBasedVolSurface(VolSurface):
- def __init__(self, index_type, series, tenor='5yr', trade_date=datetime.date.today()):
- super().__init__(index_type, series, tenor, trade_date)
- self._index = Index.from_name(index_type, series, tenor, trade_date, notional=1.)
+ def __init__(self, index_type, series, tenor='5yr', value_date=datetime.date.today()):
+ super().__init__(index_type, series, tenor, value_date)
+ self._index = Index.from_name(index_type, series, tenor, value_date, notional=1.)
self._surfaces = {}
self._quotes = self._quotes.assign(
pay_mid=self._quotes[['pay_bid', 'pay_offer']].mean(1) * 1e-4,
@@ -619,18 +619,18 @@ def _forward_annuity(expiry, index):
step_in_date = expiry + datetime.timedelta(days=1)
expiry_settle = pd.Timestamp(expiry) + 3* BDay()
df = index._yc.discount_factor(expiry_settle)
- a = index._fee_leg.pv(index.trade_date, step_in_date,
- index.trade_date, index._yc, index._sc, False)
+ a = index._fee_leg.pv(index.value_date, step_in_date,
+ index.value_date, index._yc, index._sc, False)
Delta = index._fee_leg.accrued(step_in_date)
q = index._sc.survival_probability(expiry)
return a - Delta * df * q
class ProbSurface(QuoteSurface):
- def __init__(self, index_type, series, tenor='5yr', trade_date=datetime.date.today()):
- super().__init__(index_type, series, tenor, trade_date)
+ def __init__(self, index_type, series, tenor='5yr', value_date=datetime.date.today()):
+ super().__init__(index_type, series, tenor, value_date)
self._surfaces = {}
- self._index = Index.from_name(index_type, series, tenor, trade_date)
+ self._index = Index.from_name(index_type, series, tenor, value_date)
def __getitem__(self, surface_id):
if surface_id not in self._surfaces:
@@ -638,7 +638,7 @@ class ProbSurface(QuoteSurface):
quotes = self._quotes[(self._quotes.quotedate == quotedate) &
(self._quotes.quote_source == source)]
self._index.ref = quotes.ref.iat[0]
- quotes = quotes.assign(time=((quotes.expiry - self.trade_date).dt.days + 0.25) / 365,
+ quotes = quotes.assign(time=((quotes.expiry - self.value_date).dt.days + 0.25) / 365,
pay_mid=quotes[['pay_bid','pay_offer']].mean(1),
rec_mid=quotes[['rec_bid','rec_offer']].mean(1),
forward_annuity=quotes.expiry.apply(_forward_annuity,
diff --git a/python/analytics/portfolio.py b/python/analytics/portfolio.py
index bea0f5cd..fd73e0e5 100644
--- a/python/analytics/portfolio.py
+++ b/python/analytics/portfolio.py
@@ -33,14 +33,14 @@ class Portfolio:
self.trades = trades
self.indices = [t for t in trades if isinstance(t, Index)]
self.swaptions = [t for t in trades if isinstance(t, BlackSwaption)]
- trade_dates = set(index.trade_date for index in self.indices)
+ value_dates = set(index.value_date for index in self.indices)
self._keys = [(index.index_type, index.series, index.tenor) for index in self.indices]
for swaption in self.swaptions:
- trade_dates.add(swaption.index.trade_date)
- self._trade_date = trade_dates.pop()
- if len(trade_dates) >= 1:
+ value_dates.add(swaption.index.value_date)
+ self._value_date = value_dates.pop()
+ if len(value_dates) >= 1:
warn("not all instruments have the same trade date, picking {}".
- format(self._trade_date))
+ format(self._value_date))
self._vs = {}
@property
@@ -64,18 +64,18 @@ class Portfolio:
t.reset_pv()
@property
- def trade_date(self):
- return self._trade_date
+ def value_date(self):
+ return self._value_date
- @trade_date.setter
- def trade_date(self, d):
+ @value_date.setter
+ def value_date(self, d):
#we try to keep everybody in sync
for index in self.indices:
- index.trade_date = d
+ index.value_date = d
if len(self.indices) == 0:
for swaption in self.swaptions:
- self.swaption.trade_date = d
- self._trade_date = d
+ self.swaption.value_date = d
+ self._value_date = d
def mark(self, source_list=[], option_type=None, model="black", surface_id=None):
#add None so that we always try everything
diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py
index 65f77563..52aadcfd 100644
--- a/python/analytics/scenarios.py
+++ b/python/analytics/scenarios.py
@@ -28,7 +28,7 @@ def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock,
r = []
for date in date_range:
- swaption.index.trade_date = date.date()
+ swaption.index.value_date = date.date()
if vol_time_roll: T = swaption.T
for s in spreads:
swaption.ref = s
@@ -46,7 +46,7 @@ def run_index_scenarios(index, date_range, spread_shock, params=['pnl']):
r = []
for date in date_range:
- index.trade_date = date.date()
+ index.value_date = date.date()
for s in spreads:
index.spread = s
r.append([date, s] + [getattr(index, p) for p in params])
@@ -86,7 +86,7 @@ def run_portfolio_scenarios(portf, date_range, spread_shock, vol_shock,
with MaybePool(nproc) as pool:
pmap = pool.map if pool else map
for date in date_range:
- portf.trade_date = date.date()
+ portf.value_date = date.date()
if vol_time_roll:
t = [swaption.T for swaption in portf.swaptions]
for s in spreads:
diff --git a/python/tests/test_cds.py b/python/tests/test_cds.py
index 26ec809e..defafd64 100644
--- a/python/tests/test_cds.py
+++ b/python/tests/test_cds.py
@@ -11,7 +11,7 @@ from yieldcurve import YC, ql_to_jp
class TestUpfront(unittest.TestCase):
index = Index.from_name("ig", 26, "5yr",
- trade_date = datetime.date(2016, 9, 21))
+ value_date=datetime.date(2016, 9, 21))
index.notional = 50e6
index.spread = 70
@@ -19,19 +19,18 @@ class TestUpfront(unittest.TestCase):
self.assertAlmostEqual(-self.index.pv, 685292.81, 2)
def test_cdsone(self):
- settings = Settings()
- settings.evaluation_date = Date.from_datetime(self.index.trade_date)
+ Settings().evaluation_date = Date.from_datetime(self.index.value_date)
yc = YC()
jp_yc = ql_to_jp(yc)
fee_dirty = self.index.notional * (
- upfront_charge(self.index.trade_date, self.index._value_date,
+ upfront_charge(self.index.value_date, self.index._cash_settle_date,
self.index.start_date,
self.index._step_in_date, self.index.start_date,
self.index.end_date, self.index.fixed_rate*1e-4,
jp_yc, 70e-4, self.index.recovery,
False))
fee_clean = self.index.notional * (
- upfront_charge(self.index.trade_date, self.index._value_date,
+ upfront_charge(self.index.value_date, self.index._cash_settle_date,
self.index.start_date,
self.index._step_in_date, self.index.start_date,
self.index.end_date, self.index.fixed_rate*1e-4,
diff --git a/python/tests/test_index.py b/python/tests/test_index.py
index edf15a4c..59dbfe88 100644
--- a/python/tests/test_index.py
+++ b/python/tests/test_index.py
@@ -11,7 +11,7 @@ import pickle
class TestPickle(unittest.TestCase):
index = Index.from_name("ig", 26, "5yr",
- trade_date=datetime.date(2016, 7, 1))
+ value_date=datetime.date(2016, 7, 1))
index.notional = 50e6
index.spread = 75
@@ -21,29 +21,29 @@ class TestPickle(unittest.TestCase):
class TestStrike(unittest.TestCase):
index = Index.from_name("ig", 26, "5yr",
- trade_date = datetime.date(2016, 7, 1))
- index.notional = 50e6
+ value_date=datetime.date(2016, 7, 1))
+ index.notional = 50_000_000.
index.spread = 75
exercise_date = datetime.date(2016, 8, 19)
def test_pv(self):
self.assertAlmostEqual(self.index.clean_pv,
- g(self.index, self.index.spread, self.index.trade_date) *
+ g(self.index, self.index.spread, self.index.value_date) *
self.index.notional)
def test_strike(self):
"""strike price equals clean_pv using expected forward yield curve"""
strike = g(self.index, self.index.spread, self.exercise_date) * self.index.notional
old_yc = self.index._yc
- self.index.trade_date = self.exercise_date
+ self.index.value_date = self.exercise_date
self.index._yc = old_yc.expected_forward_curve(self.exercise_date)
self.index._update()
self.assertAlmostEqual(self.index.clean_pv, strike)
def test_strike_vec(self):
- self.index.trade_date = datetime.date(2016, 8, 19)
- r = pv_vec(np.array([70, 75])*1e-4, self.index._yc, self.index.trade_date,
- self.index._value_date, self.index.start_date, self.index.end_date,
+ self.index.value_date = datetime.date(2016, 8, 19)
+ r = pv_vec(np.array([70, 75])*1e-4, self.index._yc, self.index.value_date,
+ self.index._cash_settle_date, self.index.start_date, self.index.end_date,
self.index.recovery, self.index.fixed_rate * 1e-4)
self.index.notional = 1
self.index.spread = 70
@@ -57,8 +57,8 @@ class TestStrike(unittest.TestCase):
class TestForwardIndex(unittest.TestCase):
index = Index.from_name("ig", 26, "5yr",
- trade_date = datetime.date(2016, 7, 1))
- index.notional = 50e6
+ value_date=datetime.date(2016, 7, 1))
+ index.notional = 50_000_000.
index.spread = 75
exercise_date = datetime.date(2016, 8, 19)
fi = ForwardIndex(index, exercise_date)
@@ -71,7 +71,7 @@ class TestForwardIndex(unittest.TestCase):
def test_forward_pv(self):
"""default adjusted forward price for trade_date equals clean pv"""
- fi = ForwardIndex(self.index, self.index.trade_date)
+ fi = ForwardIndex(self.index, self.index.value_date)
self.assertAlmostEqual(fi.forward_pv, self.index.clean_pv / self.index.notional)
if __name__=="__main__":
diff --git a/python/tests/test_scenarios.py b/python/tests/test_scenarios.py
index 4e695864..d079b1c9 100644
--- a/python/tests/test_scenarios.py
+++ b/python/tests/test_scenarios.py
@@ -12,13 +12,13 @@ class TestSenarios(unittest.TestCase):
option1 = BlackSwaption.from_tradeid(7, option_delta)
option2 = BlackSwaption.from_tradeid(8, option_delta)
portf = Portfolio([option1, option2, option_delta])
- date_range = pd.bdate_range(option_delta.trade_date, pd.Timestamp('2017-05-17') - BDay(), freq = '5B')
+ date_range = pd.bdate_range(option_delta.value_date, pd.Timestamp('2017-05-17') - BDay(), freq = '5B')
def test_portfolio(self):
""" check that run_portfolio_scenarios match the sum of the individual pieces"""
vol_shock = np.arange(-0.15, 0.3, 0.01)
spread_shock = np.arange(-0.2, 0.3, 0.01)
- vs = BlackSwaptionVolSurface("IG", 28, trade_date=self.option_delta.trade_date)
+ vs = BlackSwaptionVolSurface("IG", 28, value_date=self.option_delta.value_date)
vol_surface = vs[vs.list(source="BAML")[-1]]
df = run_portfolio_scenarios(self.portf, self.date_range,
spread_shock, vol_shock, vol_surface)
diff --git a/python/tests/test_swaption.py b/python/tests/test_swaption.py
index 36e08b1a..1f5b808a 100644
--- a/python/tests/test_swaption.py
+++ b/python/tests/test_swaption.py
@@ -8,7 +8,7 @@ from analytics import Index, Swaption, BlackSwaption
class TestPutCallParity(unittest.TestCase):
index = Index.from_name("ig", 27, "5yr",
- trade_date = datetime.date(2016, 10, 25))
+ value_date= datetime.date(2016, 10, 25))
index.spread = 74
exercise_date = datetime.date(2017, 3, 15)
strike = 82.5
@@ -43,7 +43,7 @@ class TestPutCallParity(unittest.TestCase):
def test_hy(self):
index = Index.from_name("hy", 27, "5yr",
- trade_date=datetime.date(2016, 11, 8))
+ value_date=datetime.date(2016, 11, 8))
index.price = 103.875
exercise_date = datetime.date(2017, 3, 15)
strike = 102.5
@@ -55,12 +55,12 @@ class TestBreakeven(unittest.TestCase):
exercise_date = datetime.date(2017, 3, 15)
hyindex = Index.from_name("hy", 27, "5yr",
- trade_date=datetime.date(2016, 11, 16))
+ value_date=datetime.date(2016, 11, 16))
hyindex.price = 103.75
hystrike = 102.5
igindex = Index.from_name("ig", 27, "5yr",
- trade_date=datetime.date(2016, 11, 18))
+ value_date=datetime.date(2016, 11, 18))
igindex.spread = 76.5
igstrike = 80