aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/index.py17
-rw-r--r--python/analytics/option.py16
-rw-r--r--python/analytics/utils.py2
-rw-r--r--python/yieldcurve.py9
4 files changed, 23 insertions, 21 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py
index e7472a84..efda3cb6 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -1,6 +1,7 @@
-import array
+from __future__ import division
import datetime
import math
+import numpy as np
import pandas as pd
from pyisda.legs import ContingentLeg, FeeLeg
@@ -18,7 +19,7 @@ from yieldcurve import YC, ql_to_jp, roll_yc, rate_helpers
serenitasdb = dbconn('serenitasdb')
-def g(index, spread : float, exercise_date : datetime.date, forward_yc = None):
+def g(index, spread, exercise_date, forward_yc = None):
"""computes the strike clean price using the expected forward yield curve """
if forward_yc is None:
forward_yc = index._yc
@@ -26,13 +27,13 @@ def g(index, spread : float, exercise_date : datetime.date, forward_yc = None):
exercise_date_settle = (pd.Timestamp(exercise_date) + 3* BDay()).date()
sc = SpreadCurve(exercise_date, forward_yc, index.start_date,
step_in_date, exercise_date_settle,
- [index.end_date], array.array('d', [spread * 1e-4]),
+ [index.end_date], np.array([spread * 1e-4]),
index.recovery)
a = index._fee_leg.pv(exercise_date, step_in_date, exercise_date_settle,
forward_yc, sc, True)
return (spread - index.fixed_rate) * a *1e-4
-class Index():
+class Index(object):
""" minimal class to represent a credit index """
def __init__(self, start_date, end_date, recovery, fixed_rate,
notional = 10e6):
@@ -122,7 +123,7 @@ class Index():
def _update(self):
self._sc = SpreadCurve(self.trade_date, self._yc, self.start_date,
self._step_in_date, self._value_date,
- [self.end_date], array.array('d', [self._spread]),
+ [self.end_date], np.array([self._spread]),
self.recovery)
self._risky_annuity = self._fee_leg.pv(self.trade_date, self._step_in_date,
self._value_date, self._yc,
@@ -135,7 +136,7 @@ class Index():
self._price = 100 * (1 - self._clean_pv)
@spread.setter
- def spread(self, s: float):
+ def spread(self, s):
""" s: spread in bps """
if self.spread is None or s != self.spread:
self._spread = s * 1e-4
@@ -337,7 +338,7 @@ class Index():
return "\n".join(s)
-class ForwardIndex():
+class ForwardIndex(object):
def __init__(self, index, forward_date, ref_is_price = False):
self.index = index
self.forward_date = forward_date
@@ -366,7 +367,7 @@ class ForwardIndex():
return self.index.spread
@ref.setter
- def ref(self, val : float):
+ def ref(self, val):
if self._ref_is_price:
if self.index.price is None or \
math.fabs(self.index.price - val) > 1e-6:
diff --git a/python/analytics/option.py b/python/analytics/option.py
index b05fe374..27ee9059 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -1,3 +1,5 @@
+from __future__ import division
+
import array
import datetime
import math
@@ -14,7 +16,7 @@ from pyisda.flat_hazard import pv_vec
from scipy.optimize import brentq
from scipy.integrate import simps
-def calib(S0, fp, exercise_date : datetime.date, exercise_date_settle :datetime.date,
+def calib(S0, fp, exercise_date, exercise_date_settle,
index, rolled_curve, tilt, w):
S = S0 * tilt * 1e-4
pv = pv_vec(S, rolled_curve, exercise_date, exercise_date_settle,
@@ -22,7 +24,7 @@ def calib(S0, fp, exercise_date : datetime.date, exercise_date_settle :datetime.
index.fixed_rate * 1e-4)
return np.inner(pv, w) - fp
-def ATMstrike(index, exercise_date : datetime.date):
+def ATMstrike(index, exercise_date):
exercise_date_settle = (pd.Timestamp(exercise_date) + 3* BDay()).date()
fp = index.forward_pv(exercise_date) / index.notional
closure = lambda S: g(index, S, exercise_date) - fp
@@ -37,7 +39,7 @@ def ATMstrike(index, exercise_date : datetime.date):
class Swaption(ForwardIndex):
"""Swaption class"""
- def __init__(self, index, exercise_date : datetime.date, strike : float,
+ def __init__(self, index, exercise_date, strike,
option_type="payer", strike_is_price = False):
ForwardIndex.__init__(self, index, exercise_date, strike_is_price)
self._exercise_date = exercise_date
@@ -54,7 +56,7 @@ class Swaption(ForwardIndex):
return self._exercise_date
@exercise_date.setter
- def exercise_date(self, d : datetime.date):
+ def exercise_date(self, d):
self._exercise_date = d
ForwardIndex.__init__(self, self.index, d)
self._forward_yc = roll_yc(self.index._yc, d)
@@ -68,7 +70,7 @@ class Swaption(ForwardIndex):
return self._strike
@strike.setter
- def strike(self, K : float):
+ def strike(self, K):
if self._strike_is_price:
self._G = (100 - K) / 100
# we compute the corresponding spread to the strike price
@@ -127,7 +129,7 @@ class Swaption(ForwardIndex):
return self.notional * simps(val, Z) * self.df
@pv.setter
- def pv(self, val: float):
+ def pv(self, val):
if np.isnan(val):
raise ValueError("val is nan")
if val < self.intrinsic_value:
@@ -161,7 +163,7 @@ class Swaption(ForwardIndex):
self.sigma,
self.option_type) * self.notional
@pv_black.setter
- def pv_black(self, val: float):
+ def pv_black(self, val):
if np.isnan(val):
raise ValueError("val is nan")
if val < self.intrinsic_value:
diff --git a/python/analytics/utils.py b/python/analytics/utils.py
index ddfc6b23..c499c65f 100644
--- a/python/analytics/utils.py
+++ b/python/analytics/utils.py
@@ -3,7 +3,7 @@ from scipy.special import h_roots
from dateutil.relativedelta import relativedelta
import datetime
-def GHquad(n : int):
+def GHquad(n):
"""Gauss-Hermite quadrature weights"""
Z, w = h_roots(n)
return Z*np.sqrt(2), w/np.sqrt(np.pi)
diff --git a/python/yieldcurve.py b/python/yieldcurve.py
index c8d6ed01..044a5165 100644
--- a/python/yieldcurve.py
+++ b/python/yieldcurve.py
@@ -18,7 +18,6 @@ import matplotlib.pyplot as plt
from quantlib.quotes import SimpleQuote
from db import dbconn
from pyisda.curve import YieldCurve
-import array
def getMarkitIRData(effective_date = datetime.date.today(),
currency = "USD"):
@@ -26,7 +25,7 @@ def getMarkitIRData(effective_date = datetime.date.today(),
sql_str = "SELECT * FROM {}_rates WHERE effective_date = %s".format(currency)
with conn.cursor() as c:
c.execute(sql_str, (effective_date,))
- col_names = [c[0] for c in c.description]
+ col_names = [col[0] for col in c.description]
r = c.fetchone()
MarkitData = {'effectiveasof': r[0],
'deposits': [(t, r[i]) for i, t in \
@@ -100,8 +99,8 @@ def get_dates(date, currency="USD"):
def roll_yc(yc, forward_date):
"""returns the expected forward yield cuve on a forward_date"""
dates = get_dates(forward_date)
- dfs = array.array('d', [yc.discount_factor(d, forward_date) for d in dates])
- return YieldCurve.from_discount_factors(forward_date, dates, array.array('d', dfs), 'ACT/365F')
+ dfs = np.array([yc.discount_factor(d, forward_date) for d in dates])
+ return YieldCurve.from_discount_factors(forward_date, dates, dfs, 'ACT/365F')
def YC(helpers = None, currency="USD", MarkitData=None):
if helpers is None:
@@ -112,7 +111,7 @@ def YC(helpers = None, currency="USD", MarkitData=None):
def ql_to_jp(ql_yc):
"""convert a QuantLib yield curve to a JP's one"""
if ql_yc._trait == BootstrapTrait.Discount:
- dfs = array.array('d', ql_yc.data[1:])
+ dfs = np.array(ql_yc.data[1:])
dates = [pydate_from_qldate(d) for d in ql_yc.dates[1:]]
trade_date = pydate_from_qldate(ql_yc.dates[0])
return YieldCurve.from_discount_factors(trade_date, dates, dfs, 'ACT/365F')