aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics')
-rw-r--r--python/analytics/credit_default_swap.py37
1 files changed, 21 insertions, 16 deletions
diff --git a/python/analytics/credit_default_swap.py b/python/analytics/credit_default_swap.py
index b6b2a16c..903fe230 100644
--- a/python/analytics/credit_default_swap.py
+++ b/python/analytics/credit_default_swap.py
@@ -50,6 +50,7 @@ class CreditDefaultSwap:
"_original_local_clean_pv",
"_trade_date",
"_factor",
+ "_fx",
)
def __init__(
@@ -186,9 +187,9 @@ class CreditDefaultSwap:
np.array([self.recovery]),
)
+ def _update_pvs(self):
if self._sc is None:
return
-
self._risky_annuity = self._fee_leg.pv(
self.value_date,
self._step_in_date,
@@ -215,6 +216,7 @@ class CreditDefaultSwap:
if self._spread is None or s != self.spread:
self._spread = s * 1e-4
self._update_spread_curve()
+ self._update_pvs()
self.notify()
@property
@@ -226,12 +228,7 @@ class CreditDefaultSwap:
@property
def pv(self):
if not analytics._local:
- return (
- self.notional
- * self._factor
- * self._pv
- * get_fx(self.currency, self.value_date)
- )
+ return self.notional * self._factor * self._pv * self._fx
else:
return self.notional * self._factor * self._pv
@@ -245,7 +242,7 @@ class CreditDefaultSwap:
def accrued(self):
r = -self.notional * self._factor * self._accrued * self.fixed_rate * 1e-4
if not analytics._local:
- r *= get_fx(self.currency, self.value_date)
+ r *= self._fx
return r
@property
@@ -256,13 +253,13 @@ class CreditDefaultSwap:
def clean_pv(self):
r = self.notional * self._factor * self._clean_pv
if not analytics._local:
- r *= get_fx(self.currency, self.value_date)
+ r *= self._fx
return r
@property
def price(self):
if not analytics._local:
- return 100 + (self._price - 100) / get_fx(self.currency, self.value_date)
+ return 100 + (self._price - 100) / self._fx
else:
return self._price
@@ -319,11 +316,14 @@ class CreditDefaultSwap:
with warnings.catch_warnings():
warnings.simplefilter("ignore")
self._update_dates(self.value_date + relativedelta(days=1))
+ self._update_pvs()
carry = -self.notional * self._factor * self.fixed_rate * 1e-4 / 360
if not analytics._local:
- carry *= get_fx(self.currency, old_value_date)
+ carry *= self._fx
roll_down = self.clean_pv - old_pv
+
self._update_dates(old_value_date)
+ self._update_pvs()
return carry + roll_down
@property
@@ -337,12 +337,14 @@ class CreditDefaultSwap:
rh.quote.value += 1e-4
ql_yc = YC(helpers)
self._yc = ql_to_jp(ql_yc)
- self._update_spread_curve() # to force recomputation
+ self._update_spread_curve()
+ self._update_pvs() # to force recomputation
new_pv = self.pv
# for r in self._helpers:
# r.quote -= 1e-4
self._yc = old_yc
self._update_spread_curve()
+ self._update_pvs()
return new_pv - old_pv
@property
@@ -350,12 +352,15 @@ class CreditDefaultSwap:
old_recovery = self.recovery
self.recovery = old_recovery - 0.01
self._update_spread_curve()
+ self._update_pvs()
pv_minus = self.pv
self.recovery = old_recovery + 0.01
self._update_spread_curve()
+ self._update_pvs()
pv_plus = self.pv
self.recovery = old_recovery
self._update_spread_curve()
+ self._update_pvs()
return (pv_plus - pv_minus) / 2
@property
@@ -379,7 +384,9 @@ class CreditDefaultSwap:
return
self._update_dates(d)
self._yc = get_curve(self.value_date, self.currency)
+ self._fx = get_fx(self.value_date, self.currency)
self._update_spread_curve()
+ self._update_pvs()
self.notify()
def _update_dates(self, d):
@@ -392,9 +399,7 @@ class CreditDefaultSwap:
self._cash_settle_date = pd.Timestamp(self._value_date) + 3 * BDay()
def reset_pv(self):
- self._original_clean_pv = self._clean_pv * get_fx(
- self.currency, self.value_date
- )
+ self._original_clean_pv = self._clean_pv * self._fx
self._original_local_clean_pv = self._clean_pv
self._trade_date = self._value_date
@@ -409,7 +414,7 @@ class CreditDefaultSwap:
self.notional
* self._factor
* (
- self._clean_pv * get_fx(self.currency, self.value_date)
+ self._clean_pv * self._fx
- self._original_clean_pv
- days_accrued * self.fixed_rate * 1e-4
)