Coverage for rivapy/tools/enums.py: 95%
351 statements
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-05 14:27 +0000
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-05 14:27 +0000
1# -*- coding: utf-8 -*-
2from enum import Enum as _Enum, unique as _unique
3from rivapy import _pyvacon_available
5"""
7The following Enum sub-classes replace to corresponding former classes one-on-one. The main reason for this replacement
8is the more comfortable iterations over the enumeration class members. Moreover, the Enum class provides potentially
9useful functionalities like comparisons, pickling, ... Finally, the decorator @unique ensures unique enumeration values.
10"""
13class _MyEnum(_Enum):
14 @classmethod
15 def has_value(cls, value):
16 return value in cls._value2member_map_
18 @classmethod
19 def to_string(cls, value) -> str:
20 """Checks if given enum class contains the value and raises exception if not. If value is str
22 Args:
23 enum (_type_): _description_
24 value (_type_): _description_
26 Returns:
27 str: _description_
28 """
30 def has_value(cls, value):
31 return value in cls._value2member_map_
33 if isinstance(value, str):
34 if not cls.has_value(value):
35 raise Exception("Unknown " + cls.__name__ + ": " + value)
36 return value
37 if isinstance(value, cls):
38 return value.value
39 raise Exception("Given value " + str(value) + " does not belong to enum " + cls.__name__)
42class _MyIntEnum(_Enum):
43 @classmethod
44 def has_value(cls, value):
45 return value in cls._value2member_map_
47 @classmethod
48 def to_string(cls, value) -> str:
49 """Checks if given enum class contains the value and raises exception if not. If value is str
51 Args:
52 enum (_type_): _description_
53 value (_type_): _description_
55 Returns:
56 str: _description_
57 """
59 def has_value(cls, value):
60 return value in cls._value2member_map_
62 if isinstance(value, str):
63 cls[value] # check if the string exists as key
64 return value
65 elif isinstance(value, int):
66 return cls._value2member_map_[value].name
67 if isinstance(value, cls):
68 return value.name
69 raise Exception("Given value " + str(value) + " does not belong to enum " + cls.__name__)
72if _pyvacon_available:
73 from pyvacon.finance.definition import DayCounter as _DayCounter
75 DayCounterType = _DayCounter.Type
77 from pyvacon.numerics.interpolation import InterpolationType
78 from pyvacon.numerics.extrapolation import ExtrapolationType
79else:
81 @_unique
82 class InterpolationType(_MyEnum):
83 CONSTANT = "CONSTANT"
84 LINEAR = "LINEAR"
85 LINEAR_LOG = "LINEARLOG"
86 CONSTRAINED_SPLINE = "CONSTRAINED_SPLINE"
87 HAGAN = "HAGAN"
88 HAGAN_DF = "HAGAN_DF"
90 @_unique
91 class ExtrapolationType(_MyEnum):
92 NONE = "NONE"
93 CONSTANT = "CONSTANT"
94 LINEAR = "LINEAR"
95 LINEAR_LOG = "LINEARLOG"
98@_unique
99class SecuritizationLevel(_MyEnum):
100 NONE = "NONE"
101 COLLATERALIZED = "COLLATERALIZED"
102 SENIOR_SECURED = "SENIOR_SECURED"
103 SENIOR_UNSECURED = "SENIOR_UNSECURED"
104 SUBORDINATED = "SUBORDINATED"
105 MEZZANINE = "MEZZANINE"
106 EQUITY = "EQUITY"
107 PREFERRED_SENIOR = "PREFERRED_SENIOR"
108 NON_PREFERRED_SENIOR = "NON_PREFERRED_SENIOR"
111# class SecuritizationLevel:
112# NONE = 'NONE'
113# COLLATERALIZED = 'COLLATERALIZED' #,,,'','SUBORDINATED','MEZZANINE','EQUITY']
114# SENIOR_SECURED = 'SENIOR_SECURED'
115# SENIOR_UNSECURED = 'SENIOR_UNSECURED'
116# SUBORDINATED = 'SUBORDINATED'
117# MEZZANINE = 'MEZZANINE'
118# EQUITY = 'EQUITY'
120# @_unique
121# class ProductType(_MyEnum):
122# BOND = 'BOND'
123# CALLABLE_BOND = 'CALLABLE_BOND'
126# @_unique
127# class PricerType(_MyEnum):
128# ANALYTIC = 'ANALYTIC'
129# PDE = 'PDE'
130# MONTE_CARLO = 'MONTE_CARLO'
131# COMBO = 'COMBO'
134@_unique
135class EnergyTimeGridStructure(_MyEnum):
136 BASE = "BASE"
137 PEAK = "PEAK"
138 OFFPEAK = "OFFPEAK"
141@_unique
142class Model(_MyEnum):
143 BLACK76 = "BLACK76"
144 CIR = "CIR"
145 HULL_WHITE = "HULL_WHITE"
146 HESTON = "HESTON"
147 LV = "LV"
148 GBM = "GBM"
149 G2PP = "G2PP"
150 VASICEK = "VASICEK"
153# class Model:
154# BLACK76 = 'BLACK76'
155# CIR ='CIR'
156# HULL_WHITE = 'HULL_WHITE'
157# HESTON = 'HESTON'
158# LV = 'LV'
159# GBM = 'GBM'
160# G2PP = 'G2PP'
161# VASICEK = 'VASICEK'
164@_unique
165class Period(_MyEnum):
166 A = "A"
167 SA = "SA"
168 Q = "Q"
169 M = "M"
170 D = "D"
173# class Period:
174# A = 'A'
175# SA = 'SA'
176# Q = 'Q'
177# M = 'M'
178# D = 'D'
181@_unique
182class RollConvention(_MyEnum):
183 FOLLOWING = "Following"
184 MODIFIED_FOLLOWING = "ModifiedFollowing"
185 MODIFIED_FOLLOWING_EOM = "ModifiedFollowingEOM"
186 MODIFIED_FOLLOWING_BIMONTHLY = "ModifiedFollowingBimonthly"
187 PRECEDING = "Preceding"
188 MODIFIED_PRECEDING = "ModifiedPreceding"
189 NEAREST = "Nearest"
190 UNADJUSTED = "Unadjusted"
193# class RollConvention:
194# FOLLOWING = 'Following'
195# MODIFIED_FOLLOWING = 'ModifiedFollowing'
196# MODIFIED_FOLLOWING_EOM = 'ModifiedFollowingEOM'
197# PRECEDING = 'Preceding'
198# MODIFIED_PRECEDING = 'ModifiedPreceding'
199# UNADJUSTED = 'Unadjusted'
200@_unique
201class DayCounterType(_MyEnum):
202 ACT_ACT = "ActAct"
203 Act365Fixed = "Act365Fixed"
204 ACT360 = "Act360"
205 ThirtyU360 = "30U360"
206 ThirtyE360 = "30E360"
207 ACT252 = "Act252"
210@_unique
211class InflationInterpolation(_MyEnum):
212 UNDEFINED = "UNDEFINED"
213 GERMAN = "GERMAN"
214 JAPAN = "JAPAN"
215 CONSTANT = "CONSTANT"
218@_unique
219class Sector(_MyEnum):
220 UNDEFINED = "UNDEFINED"
221 # BASIC_MATERIALS = 'BasicMaterials'
222 CONGLOMERATES = "Conglomerates"
223 CONSUMER_GOODS = "ConsumerGoods"
224 # FINANCIAL = 'Financial'
225 # HEALTHCARE = 'Healthcare'
226 # INDUSTRIAL_GOODS = 'IndustrialGoods'
227 SERVICES = "Services"
228 # TECHNOLOGY = 'Technology'
229 # UTILITIES = 'Utilities'
231 COMMUNICATION_SERVICES = "CommunicationServices"
232 CONSUMER_STAPLES = "ConsumerStaples"
233 CONSUMER_DISCRETIONARY = "ConsumerDiscretionary"
234 ENERGY = "Energy"
235 FINANCIAL = "Financial"
236 HEALTH_CARE = "HealthCare"
237 INDUSTRIALS = "Industrials"
238 INFORMATION_TECHNOLOGY = "InformationTechnology"
239 MATERIALS = "Materials"
240 REAL_ESTATE = "RealEstate"
241 UTILITIES = "Utilities"
244@_unique
245class ESGRating(_MyEnum): # see MSCI ESG ratings
246 AAA = "AAA"
247 AA = "AA"
248 A = "A"
249 BBB = "BBB"
250 BB = "BB"
251 B = "B"
252 CCC = "CCC"
255@_unique
256class Rating(_MyEnum):
257 # cf. https://www.moneyland.ch/de/vergleich-rating-agenturen
258 AAA = "AAA"
259 AA_PLUS = "AA+"
260 AA = "AA"
261 AA_MINUS = "AA-"
262 A_PLUS = "A+"
263 A = "A"
264 A_MINUS = "A-"
265 BBB_PLUS = "BBB+"
266 BBB = "BBB"
267 BBB_MINUS = "BBB-"
268 BB_PLUS = "BB+"
269 BB = "BB"
270 BB_MINUS = "BB-"
271 B_PLUS = "B+"
272 B = "B"
273 B_MINUS = "B-"
274 CCC_PLUS = "CCC+"
275 CCC = "CCC"
276 CCC_MINUS = "CCC-"
277 CC = "CC"
278 C = "C"
279 D = "D"
280 NONE = "NONE" # not rated
283# class ProductType:
284# BOND = 'BOND'
285# CALLABLE_BOND = 'CALLABLE_BOND'
288class PricerType:
289 ANALYTIC = "ANALYTIC"
290 PDE = "PDE"
291 MONTE_CARLO = "MONTE_CARLO"
292 COMBO = "COMBO"
295@_unique
296class VolatilityStickyness(_MyEnum):
297 NONE = "NONE"
298 StickyStrike = "StickyStrike"
299 StickyXStrike = "StickyXStrike"
300 StickyFwdMoneyness = "StickyFwdMoneyness"
303@_unique
304class Currency(_MyEnum):
305 AED = "AED"
306 AFN = "AFN"
307 ALL = "ALL"
308 AMD = "AMD"
309 ANG = "ANG"
310 AOA = "AOA"
311 ARS = "ARS"
312 AUD = "AUD"
313 AWG = "AWG"
314 AZN = "AZN"
315 BAM = "BAM"
316 BBD = "BBD"
317 BDT = "BDT"
318 BGN = "BGN"
319 BHD = "BHD"
320 BIF = "BIF"
321 BMD = "BMD"
322 BND = "BND"
323 BOB = "BOB"
324 BRL = "BRL"
325 BSD = "BSD"
326 BTN = "BTN"
327 BWP = "BWP"
328 BYR = "BYR"
329 BZD = "BZD"
330 CAD = "CAD"
331 CDF = "CDF"
332 CHF = "CHF"
333 CLP = "CLP"
334 CNH = "CNH"
335 CNY = "CNY"
336 COP = "COP"
337 CRC = "CRC"
338 CUC = "CUC"
339 CUP = "CUP"
340 CVE = "CVE"
341 CZK = "CZK"
342 DJF = "DJF"
343 DKK = "DKK"
344 DOP = "DOP"
345 DZD = "DZD"
346 EGP = "EGP"
347 ERN = "ERN"
348 ETB = "ETB"
349 EUR = "EUR"
350 FJD = "FJD"
351 FKP = "FKP"
352 GBP = "GBP"
353 GEL = "GEL"
354 GGP = "GGP"
355 GHS = "GHS"
356 GIP = "GIP"
357 GMD = "GMD"
358 GNF = "GNF"
359 GTQ = "GTQ"
360 GYD = "GYD"
361 HKD = "HKD"
362 HNL = "HNL"
363 HRK = "HRK"
364 HTG = "HTG"
365 HUF = "HUF"
366 IDR = "IDR"
367 ILS = "ILS"
368 IMP = "IMP"
369 INR = "INR"
370 IQD = "IQD"
371 IRR = "IRR"
372 ISK = "ISK"
373 JEP = "JEP"
374 JMD = "JMD"
375 JOD = "JOD"
376 JPY = "JPY"
377 KES = "KES"
378 KGS = "KGS"
379 KHR = "KHR"
380 KMF = "KMF"
381 KPW = "KPW"
382 KRW = "KRW"
383 KWD = "KWD"
384 KYD = "KYD"
385 KZT = "KZT"
386 LAK = "LAK"
387 LBP = "LBP"
388 LKR = "LKR"
389 LRD = "LRD"
390 LSL = "LSL"
391 LTL = "LTL"
392 LVL = "LVL"
393 LYD = "LYD"
394 MAD = "MAD"
395 MDL = "MDL"
396 MGA = "MGA"
397 MKD = "MKD"
398 MMK = "MMK"
399 MNT = "MNT"
400 MOP = "MOP"
401 MRO = "MRO"
402 MUR = "MUR"
403 MVR = "MVR"
404 MWK = "MWK"
405 MXN = "MXN"
406 MYR = "MYR"
407 MZN = "MZN"
408 NAD = "NAD"
409 NGN = "NGN"
410 NIO = "NIO"
411 NOK = "NOK"
412 NPR = "NPR"
413 NZD = "NZD"
414 OMR = "OMR"
415 PAB = "PAB"
416 PEN = "PEN"
417 PGK = "PGK"
418 PHP = "PHP"
419 PKR = "PKR"
420 PLN = "PLN"
421 PYG = "PYG"
422 QAR = "QAR"
423 RON = "RON"
424 RSD = "RSD"
425 RUB = "RUB"
426 RWF = "RWF"
427 SAR = "SAR"
428 SBD = "SBD"
429 SCR = "SCR"
430 SDG = "SDG"
431 SEK = "SEK"
432 SGD = "SGD"
433 SHP = "SHP"
434 SLL = "SLL"
435 SOS = "SOS"
436 SPL = "SPL"
437 SRD = "SRD"
438 STD = "STD"
439 SVC = "SVC"
440 SYP = "SYP"
441 SZL = "SZL"
442 THB = "THB"
443 TJS = "TJS"
444 TMT = "TMT"
445 TND = "TND"
446 TOP = "TOP"
447 TRY = "TRY"
448 TTD = "TTD"
449 TVD = "TVD"
450 TWD = "TWD"
451 TZS = "TZS"
452 UAH = "UAH"
453 UGX = "UGX"
454 USD = "USD"
455 UYU = "UYU"
456 UZS = "UZS"
457 VEF = "VEF"
458 VND = "VND"
459 VUV = "VUV"
460 WST = "WST"
461 XAF = "XAF"
462 XAG = "XAG"
463 XAU = "XAU"
464 XPD = "XPD"
465 XPT = "XPT"
466 XCD = "XCD"
467 XDR = "XDR"
468 XOF = "XOF"
469 XPF = "XPF"
470 YER = "YER"
471 ZAR = "ZAR"
472 ZMW = "ZMW"
473 ZWD = "ZWD"
476class Country(_MyEnum):
477 DE = "DE"
478 FR = "FR"
479 CA = "CA"
480 US = "US"
481 GB = "GB"
482 JP = "JP"
483 CN = "CN"