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

1# -*- coding: utf-8 -*- 

2from enum import Enum as _Enum, unique as _unique 

3from rivapy import _pyvacon_available 

4 

5""" 

6 

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""" 

11 

12 

13class _MyEnum(_Enum): 

14 @classmethod 

15 def has_value(cls, value): 

16 return value in cls._value2member_map_ 

17 

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 

21 

22 Args: 

23 enum (_type_): _description_ 

24 value (_type_): _description_ 

25 

26 Returns: 

27 str: _description_ 

28 """ 

29 

30 def has_value(cls, value): 

31 return value in cls._value2member_map_ 

32 

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__) 

40 

41 

42class _MyIntEnum(_Enum): 

43 @classmethod 

44 def has_value(cls, value): 

45 return value in cls._value2member_map_ 

46 

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 

50 

51 Args: 

52 enum (_type_): _description_ 

53 value (_type_): _description_ 

54 

55 Returns: 

56 str: _description_ 

57 """ 

58 

59 def has_value(cls, value): 

60 return value in cls._value2member_map_ 

61 

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__) 

70 

71 

72if _pyvacon_available: 

73 from pyvacon.finance.definition import DayCounter as _DayCounter 

74 

75 DayCounterType = _DayCounter.Type 

76 

77 from pyvacon.numerics.interpolation import InterpolationType 

78 from pyvacon.numerics.extrapolation import ExtrapolationType 

79else: 

80 

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" 

89 

90 @_unique 

91 class ExtrapolationType(_MyEnum): 

92 NONE = "NONE" 

93 CONSTANT = "CONSTANT" 

94 LINEAR = "LINEAR" 

95 LINEAR_LOG = "LINEARLOG" 

96 

97 

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" 

109 

110 

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' 

119 

120# @_unique 

121# class ProductType(_MyEnum): 

122# BOND = 'BOND' 

123# CALLABLE_BOND = 'CALLABLE_BOND' 

124 

125 

126# @_unique 

127# class PricerType(_MyEnum): 

128# ANALYTIC = 'ANALYTIC' 

129# PDE = 'PDE' 

130# MONTE_CARLO = 'MONTE_CARLO' 

131# COMBO = 'COMBO' 

132 

133 

134@_unique 

135class EnergyTimeGridStructure(_MyEnum): 

136 BASE = "BASE" 

137 PEAK = "PEAK" 

138 OFFPEAK = "OFFPEAK" 

139 

140 

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" 

151 

152 

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' 

162 

163 

164@_unique 

165class Period(_MyEnum): 

166 A = "A" 

167 SA = "SA" 

168 Q = "Q" 

169 M = "M" 

170 D = "D" 

171 

172 

173# class Period: 

174# A = 'A' 

175# SA = 'SA' 

176# Q = 'Q' 

177# M = 'M' 

178# D = 'D' 

179 

180 

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" 

191 

192 

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" 

208 

209 

210@_unique 

211class InflationInterpolation(_MyEnum): 

212 UNDEFINED = "UNDEFINED" 

213 GERMAN = "GERMAN" 

214 JAPAN = "JAPAN" 

215 CONSTANT = "CONSTANT" 

216 

217 

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' 

230 

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" 

242 

243 

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" 

253 

254 

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 

281 

282 

283# class ProductType: 

284# BOND = 'BOND' 

285# CALLABLE_BOND = 'CALLABLE_BOND' 

286 

287 

288class PricerType: 

289 ANALYTIC = "ANALYTIC" 

290 PDE = "PDE" 

291 MONTE_CARLO = "MONTE_CARLO" 

292 COMBO = "COMBO" 

293 

294 

295@_unique 

296class VolatilityStickyness(_MyEnum): 

297 NONE = "NONE" 

298 StickyStrike = "StickyStrike" 

299 StickyXStrike = "StickyXStrike" 

300 StickyFwdMoneyness = "StickyFwdMoneyness" 

301 

302 

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" 

474 

475 

476class Country(_MyEnum): 

477 DE = "DE" 

478 FR = "FR" 

479 CA = "CA" 

480 US = "US" 

481 GB = "GB" 

482 JP = "JP" 

483 CN = "CN"