aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/index.py87
-rw-r--r--python/analytics/option.py64
-rw-r--r--python/analytics/utils.py7
3 files changed, 68 insertions, 90 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py
index 6a0b0ad5..d782310e 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -13,7 +13,7 @@ from pandas.tseries.offsets import BDay
from db import dbengine
from sqlalchemy import exc
from pyisda.curve import SpreadCurve
-from .utils import previous_twentieth
+from .utils import previous_twentieth, build_table
from yieldcurve import YC, ql_to_jp, roll_yc, rate_helpers
from blinker import signal
@@ -386,58 +386,47 @@ class Index(object):
return instance
def __repr__(self):
+ if not self.spread:
+ raise ValueError("Market spread is missing!")
if self.days_accrued > 1:
accrued_str = "Accrued ({} Days)".format(self.days_accrued)
else:
accrued_str = "Accrued ({} Day)".format(self.days_accrued)
- if not self.spread:
- raise ValueError("Market spread is missing!")
- s = ["{:<20}\t{:>15}".format("CDS Index", colored(self.name, attrs = ['bold'])),
- "",
- "{:<20}\t{:>15}".format("Trade Date", ('{:%m/%d/%y}'.
- format(self.trade_date))),
- "{:<20}\t{:>15.2f}\t\t{:<20}\t{:>10,.2f}".format("Trd Sprd (bp)",
- self.spread,
- "Coupon (bp)",
- self.fixed_rate),
- "{:<20}\t{:>15}\t\t{:<20}\t{:>10}".format("1st Accr Start",
- '{:%m/%d/%y}'.
- format(self.issue_date),
- "Payment Freq",
- "Quarterly"),
- "{:<20}\t{:>15}\t\t{:<20}\t{:>10.2f}".format("Maturity Date",
- ('{:%m/%d/%y}'.
- format(self.end_date)),
- "Rec Rate",
- self.recovery),
- "{:<20}\t{:>15}\t\t{:<20}\t{:>10}".format("Bus Day Adj",
- "Following",
- "Day Count",
- "ACT/360"),
- "",
- colored("Calculator", attrs = ['bold']),
- "{:<20}\t{:>15}".format("Valuation Date", ('{:%m/%d/%y}'.
- format(self.trade_date))),
- "{:<20}\t{:>15}".format("Cash Settled On", ('{:%m/%d/%y}'.
- format(self._value_date))),
- "",
- "{:<20}\t{:>15.8f}\t\t{:<20}\t{:>10,.2f}".format("Price",
- self.price,
- "Spread DV01",
- self.DV01),
- "{:<20}\t{:>15,.0f}\t\t{:<20}\t{:>10,.2f}".format("Principal",
- self.clean_pv,
- "IR DV01",
- self.IRDV01),
- "{:<20}\t{:>15,.0f}\t\t{:<20}\t{:>10,.2f}".format(accrued_str,
- self.accrued,
- "Rec Risk (1%)",
- self.rec_risk),
- "{:<20}\t{:>15,.0f}\t\t{:<20}\t{:>10,.0f}".format("Cash Amount",
- self.pv,
- "Def Exposure",
- self.jump_to_default)
- ]
+
+ s = ["{:<20}\tNotional {:>5}MM {}\tFactor {:>28}".format("Buy Protection"\
+ if self._direction == -1 \
+ else "Sell Protection",
+ self.notional/1_000_000,
+ self.currency,
+ self.factor),
+ "{:<20}\t{:>15}".format("CDS Index", colored(self.name, attrs = ['bold'])),
+ ""]
+ rows = [["Trd Sprd (bp)", self.spread, "Coupon (bp)", self.fixed_rate],
+ ["1st Accr Start", self.issue_date, "Payment Freq", "Quarterly"],
+ ["Maturity Date", self.end_date, "Rec Rate", self.recovery],
+ ["Bus Day Adj", "Following", "DayCount", "ACT/360"]]
+ format_strings = [[None, '{:.2f}', None, '{:.0f}'],
+ [None, '{:%m/%d/%y}', None, None],
+ [None, '{:%m/%d/%y}', None, None],
+ [None, None, None, None]]
+ 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]]
+ format_strings = [[None, '{:%m/%d/%y}'],
+ [None, '{:%m/%d/%y}']]
+ s += build_table(rows, format_strings, "{:<20}\t{:>15}")
+ s += [""]
+ rows = [["Price", self.price, "Spread DV01", self.DV01],
+ ["Principal", self.clean_pv, "IR DV01", self.IRDV01],
+ [accrued_str, self.accrued, "Rec Risk (1%)", self.rec_risk],
+ ["Cash Amount", self.pv, "Def Exposure", self.jump_to_default]]
+ format_strings = [[None, '{:.8f}', None, '{:,.2f}'],
+ [None, '{:,.0f}', None, '{:,.2f}'],
+ [None, '{:,.0f}', None, '{:,.2f}'],
+ [None, '{:,.0f}', None, '{:,.0f}']]
+ s += build_table(rows, format_strings, "{:<20}{:>19}\t\t{:<20}{:>15}")
return "\n".join(s)
diff --git a/python/analytics/option.py b/python/analytics/option.py
index 08410ed3..c8079702 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -8,7 +8,7 @@ import pandas as pd
from db import dbengine
from .black import black
-from .utils import GHquad
+from .utils import GHquad, build_table
from .index import g, ForwardIndex, Index, engine
from yieldcurve import roll_yc
from pandas.tseries.offsets import BDay
@@ -300,46 +300,28 @@ 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))),
- "{:<20}\t{:>15.2f}\t\t{:<20}\t{:>10,.2f}".format("Ref Sprd (bp)",
- self.index.spread,
- "Coupon (bp)",
- self.index.fixed_rate),
- "{:<20}\t{:>15.3f}\t\t{:<20}\t{:>10}".format("Ref Price",
- self.index.price,
- "Maturity Date",
- ('{:%m/%d/%y}'.
- format(self.index.end_date))),
- "",
- "Swaption Calculator",
- "",
- "{:<20}\t{:>15,.0f}\t\t{:<19}\t{:>12,.2f}".format("Notional",
- self.notional,
- "Premium",
- self.pv),
- "{:<20}\t{:>15.2f}\t\t{:<20}\t{:>10}".format("Strike",
- self.strike,
- "Maturity Date",
- ('{:%m/%d/%y}'.
- format(self.exercise_date))),
- "{:<20}\t{:>15.4f}\t\t{:<19}\t{:>12,.3f}".format("Spread Vol",
- self.sigma,
- "Spread DV01",
- self.DV01),
- "{:<19}\t{:>16.3f}%\t\t{:<19}\t{:>11.3f}%".format("Delta",
- self.delta * 100,
- "Gamma",
- self.gamma * 100),
- "{:<20}\t{:>15,.3f}\t\t{:<19}\t{:>12,.3f}".format("Vega",
- self.vega,
- "Theta",
- self.theta),
- "{:<20}\t{:>15.3f}\t\t{:<20}\t{:>10.0f}".format("Breakeven",
- self.breakeven,
- "Days to Exercise",
- self.T*365),
- ""
- ]
+ format(self.index.trade_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}"],
+ [None, "{:.3f}", None, '{:%m/%d/%y}']]
+ s += build_table(rows, format_strings, "{:<20}\t{:>15}\t\t{:<20}\t{:>10}")
+ s += ["",
+ "Swaption Calculator",
+ ""]
+ rows = [["Notional", self.notional, "Premium", self.pv],
+ ["Strike", self.strike, "Maturity Date", self.exercise_date],
+ ["Spread Vol", self.sigma, "Spread DV01", self.DV01],
+ ["Delta", self.delta * 100, "Gamma", self.gamma * 100],
+ ["Vega", self.vega, "Theta", self.theta],
+ ["Breakeven", self.breakeven, "Days to Exercise", self.T*365]]
+ format_strings = [[None, '{:,.0f}', None, '{:,.2f}'],
+ [None, '{:.2f}', None, '{:%m/%d/%y}'],
+ [None, '{:.4f}', None, '{:,.3f}'],
+ [None, '{:.3f}%', None, '{:.3f}%'],
+ [None, '{:,.3f}', None, '{:,.3f}'],
+ [None, '{:.3f}', None, '{:.0f}']]
+ s += build_table(rows, format_strings, "{:<20}{:>19}\t\t{:<19}{:>16}")
return "\n".join(s)
def __str__(self):
diff --git a/python/analytics/utils.py b/python/analytics/utils.py
index e3ffecaa..07975af8 100644
--- a/python/analytics/utils.py
+++ b/python/analytics/utils.py
@@ -58,3 +58,10 @@ def roll_date(d, tenor):
return d_rolled
else:
return [d_rolled + relativedelta(years=t-1) for t in tenor]
+
+def build_table(rows, format_strings, row_format):
+ r = []
+ for row, format_string in zip(rows, format_strings):
+ row = [f.format(r) if f else r for r, f in zip(row, format_string)]
+ r.append(row_format.format(*row))
+ return r