aboutsummaryrefslogtreecommitdiffstats
path: root/python/Dawn/models.py
blob: 28d57990ca42689991290af18bce2be0e6e753b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
from flask_wtf import FlaskForm
from flask_wtf.file import FileField
from sqlalchemy.dialects.postgresql import ENUM
from wtforms.validators import Length
from wtforms_alchemy import model_form_factory
from sqlalchemy_utils import EmailType, PhoneNumberType

from . import db

class Counterparties(db.Model):
    __tablename__ = 'counterparties'
    code = db.Column(db.String(12), primary_key=True)
    name = db.Column(db.String)
    city = db.Column(db.String)
    state = db.Column(db.String(2))
    dtc_number = db.Column(db.Integer)
    sales_contact = db.Column(db.String)
    sales_email = db.Column(EmailType)
    sales_phone = db.Column(PhoneNumberType())
    valuation_contact1 = db.Column(db.String)
    valuation_email1 = db.Column(EmailType)
    valuation_contact2 = db.Column(db.String)
    valuation_email2 = db.Column(EmailType)
    valuation_contact3 = db.Column(db.String)
    valuation_email3 = db.Column(EmailType)
    valuation_contact4 = db.Column(db.String)
    valuation_email4 = db.Column(EmailType)
    notes = db.Column(db.String)
    instructions = db.Column(db.String, info={'form_field_class': FileField})

class Accounts(db.Model):
    __tablename__ = 'accounts'
    code = db.Column(db.String(5), primary_key=True)
    name = db.Column(db.String)
    custodian = db.Column(db.String)
    cash_account = db.Column(db.String)
    counterparty = db.Column(db.String(12), db.ForeignKey('counterparties.code'))

PORTFOLIO = ENUM('OPTIONS', 'IR', 'MORTGAGES', name='portfolio')

BOND_STRAT = ENUM('M_STR_MAV', 'M_STR_MEZZ', 'CSO_TRANCH',
                  'M_CLO_BB20', 'M_CLO_AAA', 'M_CLO_BBB', 'M_MTG_IO', 'M_MTG_THRU',
                  'M_MTG_GOOD', 'M_MTG_B4PR', 'M_MTG_RW', 'M_MTG_FP', 'M_MTG_LMG',
                  'M_MTG_SD', 'M_MTG_PR', 'M_MTG_CRT_SD', name='bond_strat')

CDS_STRAT = ENUM('HEDGE_CSO', 'HEDGE_CLO', 'HEDGE_MAC', 'HEDGE_MBS',
                 'SER_IGSNR', 'SER_IGMEZ', 'SER_IGEQY', 'SER_IGINX', 'SER_HYSNR',
                 'SER_HYMEZ', 'SER_HYEQY', 'SER_HYINX', 'SER_IGCURVE', 'MBSCDS',
                 'IGOPTDEL', 'HYOPTDEL', 'SER_ITRXCURVE', name='cds_strat')

SWAPTION_STRAT = ENUM('IGPAYER', 'IGREC', 'HYPAYER', 'HYREC', 'STEEP',
                      name='swaption_strat')

FUTURE_STRAT = ENUM('M_STR_MAV', 'M_MTG_IO', 'M_STR_MEZZ', 'M_MTG_RW', 'SER_ITRXCURVE',
                    'M_CSH_CASH', name='future_strat')

CASH_STRAT = ENUM('M_CSH_CASH', 'MBSCDSCSH', 'SER_IGCVECSH', 'SER_ITRXCVCSH', 'CSOCDSCSH',
                  'IGCDSCSH', 'HYCDSCSH', 'CLOCDSCSH', 'IGTCDSCSH', 'MACCDSCSH', 'M_STR_MEZZ',
                  'IRDEVCSH',
                  name='cash_strat')

SPOT_STRAT = ENUM('M_STR_MAV', 'M_STR_MEZZ', 'SER_ITRXCURVE', 'M_CSH_CASH',
                  name='spot_strat')

OPTION_TYPE = ENUM('PAYER', 'RECEIVER',
                   name='option_type')

SWAPTION_TYPE = ENUM('CD_INDEX_OPTION', 'SWAPTION', name='swaption_type')
SETTLEMENT_TYPE = ENUM('Delivery', 'Cash', name='settlement_type')

REPO_TYPE = ENUM('REPO', 'REVERSE REPO', name='repo_type')
FUTURE_TYPE = ENUM('FUTURE', 'CFD', 'SYNTHETIC-FUTURE', 'LME-FORWARD', name='future_type')

CALL_NOTICE = ENUM('24H', '48H', '3D', '4D', '5D', '6D',
                   '1W', '8D', '9D', '10D', '2W', '1M', '2M', name='call_notice')

ASSET_CLASS = ENUM('CSO', 'Subprime', 'CLO', 'Tranches', 'Futures', 'Cash', 'FX', 'Cleared',
                   name='asset_class')
ACTION = ENUM('NEW', 'UPDATE', 'CANCEL', name='action')

CCY = ENUM('USD', 'CAD', 'EUR', 'YEN', name='currency')

BBG_TYPE = ENUM('Mtge', 'Corp', name='bbg_type')

SWAP_TYPE = ENUM('CD_INDEX', 'CD_INDEX_TRANCHE', 'CD_BASKET_TRANCHE', 'ABS_CDS', name='swap_type')

ISDA = ENUM('ISDA2014', 'ISDA2003Cred', name='isda')

DAY_COUNT = ENUM('ACT/360', 'ACT/ACT', '30/360', 'ACT/365', name='day_count')
FREQ = ENUM('Yearly', 'Half-Yearly', 'Quarterly', 'Bi-Monthly', 'Monthly',
            'Weekly', 'Daily', 'Straight', name='frequency')
BUS_DAY_CONVENTION = ENUM('Modified Following', 'Following', 'Modified Preceding', 'Preceding',
                          'Second-Day-After', 'End-of-Month', name='bus_day_convention')
PROTECTION = ENUM('Buyer', 'Seller', name='protection')

CAPFLOOR_TYPE = ENUM('CAPFLOOR', 'CMS_OPTION', 'STRUCTURED', 'FORWARD_PREMIUM', name='capfloor_type')
CAPFLOOR = ENUM('C', 'F', name='cap_or_floor')
PAYMENT_MODE = ENUM('F', 'S', name='payment_mode')
PRICING_TYPE = ENUM('PlainVanilla', 'EquityIndex', name='pricing_type')
BEGIN_OR_END = ENUM('B', 'E', name='begin_or_end')

class BondDeal(db.Model):
    __tablename__ = 'bonds'
    id = db.Column('id', db.Integer, primary_key=True)
    dealid = db.Column(db.String(28))
    lastupdate = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())
    action = db.Column(ACTION)
    folder = db.Column(BOND_STRAT, nullable=False)
    custodian = db.Column(db.String(12), default='BAC', nullable=False)
    cashaccount = db.Column(db.String(10), default='V0NSCLMAMB', nullable=False)
    cp_code = db.Column(db.String(12), db.ForeignKey('counterparties.code'),
                        info={'choices': [(None, '')],
                              'label': 'counterparty'}, nullable=False)
    trade_date = db.Column(db.Date, nullable = False)
    settle_date = db.Column(db.Date, nullable = False)
    cusip = db.Column(db.String(9), info={'validators': Length(9, 9),
                                          'filters': [lambda x: x or None,],
                                          'trim': True})
    isin = db.Column(db.String(12), info={'validators': Length(12, 12),
                                          'filters': [lambda x: x or None,],
                                          'trim': True})
    identifier = db.Column(db.String(12), info={'filters': [lambda x: x or None,],
                                                'trim': True})
    description = db.Column(db.String(32), nullable = False, info={'trim': True})
    buysell = db.Column(db.Boolean, nullable=False, info={'choices': [(0, 'sell'), (1, 'buy')],
                                                          'coerce': lambda x: bool(int(x)) \
                                                          if x is not None else x})
    faceamount = db.Column(db.Float, nullable=False)
    price = db.Column(db.Float, nullable=False)
    accrued = db.Column(db.Float, nullable = False)
    asset_class = db.Column(ASSET_CLASS)
    ticket = db.Column(db.String, info={'form_field_class': FileField})
    principal_payment = db.Column(db.Float)
    accrued_payment = db.Column(db.Float)
    counterparty = db.relationship(Counterparties)
    __table_args__= (db.CheckConstraint('cusip is not Null or isin is not Null'),)

class CDSDeal(db.Model):
    __tablename__ = 'cds'
    id = db.Column('id', db.Integer, primary_key=True)
    dealid = db.Column(db.String(28))
    lastupdate = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())
    action = db.Column(ACTION)
    folder = db.Column(CDS_STRAT, nullable=False)
    account_code = db.Column(db.String(5), db.ForeignKey('accounts.code'),
                             info={'choices': [(None,'')],
                                   'label': 'fcm_account'}, nullable=False)
    custodian = db.Column(db.String(12), default='NONE', nullable=False)
    cashaccount = db.Column(db.String(10), default='V0NSCLMFCM', nullable=False)
    cp_code = db.Column(db.String(12), db.ForeignKey('counterparties.code'),
                        info={'choices': [(None, '')],
                              'label': 'counterparty'}, nullable=False)
    trade_date = db.Column(db.Date, nullable=False)
    effective_date = db.Column(db.Date, nullable=False)
    maturity = db.Column(db.Date, nullable=False)
    currency = db.Column(CCY, nullable=False)
    payment_rolldate = db.Column(BUS_DAY_CONVENTION, nullable=False)
    notional = db.Column(db.Float, nullable=False)
    fixed_rate = db.Column(db.Float, nullable=False)
    day_count = db.Column(DAY_COUNT, nullable=False)
    frequency = db.Column(db.SmallInteger, default=4, nullable=False)
    protection = db.Column(PROTECTION, nullable=False)
    security_id = db.Column(db.String(12), nullable=False)
    security_desc = db.Column(db.String(32), nullable=False)
    upfront = db.Column(db.Float, nullable=False)
    upfront_settle_date = db.Column(db.Date, nullable=False)
    initial_margin_percentage = db.Column(db.Float)
    swap_type = db.Column(SWAP_TYPE, nullable=False)
    attach = db.Column(db.SmallInteger, info={'min': 0, 'max': 100})
    detach = db.Column(db.SmallInteger, info={'min': 0, 'max': 100})
    corr_attach = db.Column(db.Float, info={'min': 0.})
    corr_detach = db.Column(db.Float, info={'min': 0.})
    index_ref = db.Column(db.Float)
    clearing_facility = db.Column(db.String(12), default=None,
                                  info={'filters': [lambda x: x or None,]})
    isda_definition = db.Column(ISDA)
    termination_date = db.Column(db.Date)
    termination_amount = db.Column(db.Float)
    termination_cp = db.Column(db.String(12), db.ForeignKey('counterparties.code'),
                               info={'choices': [(None, '')],
                                     'label': 'termination_counterparty'})
    counterparty = db.relationship(Counterparties, foreign_keys=[cp_code])
    termination_counterparty = db.relationship(Counterparties, foreign_keys=[termination_cp])
    fcm_account = db.relationship(Accounts, foreign_keys=[account_code])
    __table_args__ = (db.CheckConstraint("swap_type!='CD_INDEX_TRANCHE' or " \
                                         "(attach is not NULL and detach is not NULL AND " \
                                         "clearing_facility is NULL)"),)

class RepoDeal(db.Model):
    __tablename__ = 'repo'
    id = db.Column('id', db.Integer, primary_key=True)
    lastupdate = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())
    action = db.Column(ACTION)
    folder = db.Column(CDS_STRAT, nullable=False)
    custodian = db.Column(db.String(12), default='SGFCM', nullable=False)
    cashaccount = db.Column(db.String(10), default='V0NSCLMAMB', nullable=False)
    cp_code = db.Column(db.String(12), db.ForeignKey('counterparties.code'),
                        info={'choices': [(None, '')],
                              'label': 'counterparty'}, nullable=False)
    trade_date = db.Column(db.Date, nullable=False)
    settle_date = db.Column(db.Date, nullable=False)
    cusip = db.Column(db.String(9), info={'validators': Length(9,9),
                                          'filters': [lambda x: x or None,],
                                          'trim': True})
    isin = db.Column(db.String(12), info={'validators': Length(12, 12),
                                          'filters': [lambda x: x or None,],
                                          'trim': True})
    identifier = db.Column(db.String(12), info={'filters': [lambda x: x or None,],
                                                'trim': True})
    description = db.Column(db.String(32), nullable=False, info={'trim': True})
    transation_indicator = db.Column(REPO_TYPE)
    faceamount = db.Column(db.Float, nullable=False)
    price = db.Column(db.Float, nullable=False)
    currency = db.Column(CCY, nullable=False)
    expiration_date = db.Column(db.Date)
    weighted_amount = db.Column(db.Float)
    haircut = db.Column(db.Float)
    repo_rate = db.Column(db.Float, nullable=False)
    call_notice = db.Column(CALL_NOTICE)
    daycount = db.Column(DAY_COUNT)
    ticket = db.Column(db.String, info={'form_field_class': FileField})
    __table__args = (db.CheckConstraint("haircut is not NULL and weighted_amount is NULL) or " \
                                        "haircut is NULL and weighted_amount is NOT NULL)"),
                     db.CheckConstraint("cusip is NOT NULL or isin is NOT NULL"))


class SwaptionDeal(db.Model):
    __tablename__ = 'swaptions'
    id = db.Column('id', db.Integer, primary_key=True)
    dealid = db.Column(db.String(28))
    lastupdate = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())
    action = db.Column(ACTION)
    portfolio = db.Column(PORTFOLIO)
    folder = db.Column(SWAPTION_STRAT, nullable=False)
    custodian = db.Column(db.String(12), default='NONE', nullable=False)
    cashaccount = db.Column(db.String(10), default='V0NSCLMAMB', nullable=False)
    cp_code = db.Column(db.String(12), db.ForeignKey('counterparties.code'),
                        info={'choices': [(None, '')],
                              'label': 'counterparty'}, nullable=False)
    swap_type = db.Column(SWAPTION_TYPE, nullable=False)
    trade_date = db.Column(db.Date, nullable=False)
    settle_date = db.Column(db.Date, nullable=False)
    buysell = db.Column(db.Boolean, nullable=False, info={'choices': [(0, 'sell'), (1, 'buy')],
                                                          'coerce': lambda x: bool(int(x))
                                                          if x is not None else x})
    notional = db.Column(db.Float, nullable=False)
    option_type = db.Column(OPTION_TYPE, nullable=False)
    strike = db.Column(db.Float, nullable=False)
    price = db.Column(db.Float, nullable=False)
    expiration_date = db.Column(db.Date, nullable=False)
    initial_margin_percentage = db.Column(db.Float)
    index_ref = db.Column(db.Float)
    security_id = db.Column(db.String(12), nullable=False)
    security_desc = db.Column(db.String(32))
    fixed_rate = db.Column(db.Float)
    maturity = db.Column(db.Date, nullable=False)
    currency = db.Column(CCY, nullable=False)
    settlement_type = db.Column(SETTLEMENT_TYPE, nullable=False)
    termination_date = db.Column(db.Date)
    termination_amount = db.Column(db.Float)
    termination_cp = db.Column(db.String(12), db.ForeignKey('counterparties.code'),
                               info={'choices': [(None, '')],
                                     'label': 'termination_counterparty'})
    counterparty = db.relationship(Counterparties, foreign_keys=[cp_code])
    termination_counterparty = db.relationship(Counterparties, foreign_keys=[termination_cp])


class FutureDeal(db.Model):
    __tablename__ = 'futures'
    id = db.Column('id', db.Integer, primary_key=True)
    dealid = db.Column(db.String(28))
    lastupdate = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())
    action = db.Column(ACTION)
    folder = db.Column(FUTURE_STRAT, nullable=False)
    custodian = db.Column(db.String(12), default='INTBR', nullable=False)
    cashaccount = db.Column(db.String(10), default='IANSCLMAFU', nullable=False)
    cp_code = db.Column(db.String(12), db.ForeignKey('counterparties.code'),
                        info={'choices': [('IBKRNY', 'Interactive Brokers')],
                              'label': 'counterparty'}, nullable=False)
    trade_date = db.Column(db.Date, nullable=False)
    settle_date = db.Column(db.Date, nullable=False)
    buysell = db.Column(db.Boolean, nullable=False, info={'choices':[(0, 'sell'), (1, 'buy')],
                                                          'coerce': lambda x: bool(int(x)) \
                                                            if x is not None else x})
    bbg_ticker = db.Column(db.String(32), nullable=False)
    quantity = db.Column(db.Float, nullable=False)
    price = db.Column(db.Float, nullable=False)
    commission = db.Column(db.Float)
    swap_type = db.Column(FUTURE_TYPE, nullable=False)
    security_desc = db.Column(db.String(32), nullable=False)
    maturity = db.Column(db.Date, nullable=False)
    currency = db.Column(CCY, nullable=False)
    exchange = db.Column(db.String(3), default='CME', nullable=False)
    counterparty = db.relationship(Counterparties)

class CashFlowDeal(db.Model):
    __tablename__ = 'wires'
    id = db.Column('id', db.Integer, primary_key=True)
    dealid = db.Column(db.String(28))
    lastupdate = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())
    action = db.Column(ACTION)
    folder = db.Column(CASH_STRAT, nullable=False)
    code = db.Column(db.String(5), db.ForeignKey('accounts.code'), nullable=False)
    amount = db.Column(db.Float, nullable=False)
    currency = db.Column(CCY, nullable=False)
    trade_date = db.Column(db.Date, nullable=False)
    account = db.relationship(Accounts)


class SpotDeal(db.Model):
    __tablename__ = "spots"
    id = db.Column('id', db.Integer, primary_key=True)
    dealid = db.Column(db.String(28))
    lastupdate = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())
    action = db.Column(ACTION)
    folder = db.Column(SPOT_STRAT, nullable=False)
    custodian = db.Column(db.String(12), default='INTBR', nullable=False)
    cashaccount = db.Column(db.String(10), default='IANSCLMAFU', nullable=False)
    cp_code = db.Column(db.String(12), db.ForeignKey('counterparties.code'),
                        info={'choices': [('IBKRNY', 'Interactive Brokers')],
                              'label': 'counterparty'}, nullable=False)
    trade_date = db.Column(db.Date, nullable=False)
    settlement_date = db.Column(db.Date, nullable=False)
    spot_rate = db.Column(db.Float, nullable=False)
    buy_currency = db.Column(CCY, nullable=False)
    buy_amount = db.Column(db.Float, nullable=False)
    sell_currency = db.Column(CCY, nullable=False)
    sell_amount = db.Column(db.Float, nullable=False)
    commission_currency = db.Column(CCY)
    commission = db.Column(db.Float)
    counterparty = db.relationship(Counterparties)

class CapFloorDeal(db.Model):
    __tablename__ = 'capfloors'
    id = db.Column('id', db.Integer, primary_key=True)
    dealid = db.Column(db.String(28))
    lastupdate = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())
    action = db.Column(ACTION)
    folder = db.Column(SWAPTION_STRAT, nullable=False)
    custodian = db.Column(db.String(12), default='NONE', nullable=False)
    cashaccount = db.Column(db.String(10), default='V0NSCLMAMB', nullable=False)
    cp_code = db.Column(db.String(12), db.ForeignKey('counterparties.code'),
                        info={'choices': [(None, '')],
                              'label': 'counterparty'}, nullable=False)
    comments = db.Column(db.String(100))
    floating_rate_index = db.Column(db.String(12), nullable=False,
                                    info={'label': 'Floating Rate Index'})
    floating_rate_index_desc = db.Column(db.String(32))
    buysell = db.Column(db.Boolean, nullable=False, info={'choices':[(0, 'sell'), (1, 'buy')],
                                                          'coerce': lambda x: bool(int(x)) \
                                                          if x is not None else x})
    cap_or_floor = db.Column(CAPFLOOR, nullable=False,
                             info={'choices': [('C', 'Cap'), ('F', 'Floor')],
                                   'label': 'Cap or Floor?'})
    strike = db.Column(db.Float, nullable=False)
    value_date = db.Column(db.Date, nullable=False)
    expiration_date = db.Column(db.Date, nullable=False)
    premium_percent = db.Column(db.Float, nullable=False)
    pricing_type = db.Column(PRICING_TYPE, nullable=False)
    payment_frequency = db.Column(FREQ, nullable=False, default='Straight')
    fixing_frequency = db.Column(FREQ, nullable=False, default='Straight')
    day_count_counvention = db.Column(DAY_COUNT, default='Act/Act')
    bdc_convention = db.Column(BUS_DAY_CONVENTION, default='Modified')
    payment_mode = db.Column(PAYMENT_MODE, nullable=False,
                             info={'choices': [('F', 'Flat'), ('S', 'Schedule')]})
    payment_at_beginning_or_end = db.Column(BEGIN_OR_END, nullable=False,
                                            info={'label': 'In arrears?',
                                                  'choices': [('E', True),
                                                              ('B', False)]})
    initial_margin_percentage = db.Column(db.Float)
    initial_margin_currency = db.Column(CCY)
    amount = db.Column(db.Float, nullable=False, info={'label': 'notional'})
    trade_date = db.Column(db.Date, nullable=False)
    swap_type = db.Column(CAPFLOOR_TYPE, nullable=False)
    reset_lag = db.Column(db.Integer, default=2)
    trade_confirm = db.Column(db.String, info={'form_field_class': FileField})
    termination_date = db.Column(db.Date)
    termination_amount = db.Column(db.Float)
    termination_cp = db.Column(db.String(12), db.ForeignKey('counterparties.code'),
                               info={'choices': [(None, '')],
                                     'label': 'termination counterparty'})
    cpty_id = db.Column(db.Text)
    counterparty = db.relationship(Counterparties, foreign_keys=[cp_code])
    termination_counterparty = db.relationship(Counterparties,
                                               foreign_keys=[termination_cp])

BaseModelForm = model_form_factory(FlaskForm)
class ModelForm(BaseModelForm):
    @classmethod
    def get_session(self):
        return db.session