quantark 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. quantark/__init__.py +3 -0
  2. quantark/_compat.py +150 -0
  3. quantark/asset/__init__.py +8 -0
  4. quantark/asset/bond/__init__.py +2 -0
  5. quantark/asset/bond/engine/__init__.py +44 -0
  6. quantark/asset/bond/engine/analytical/__init__.py +12 -0
  7. quantark/asset/bond/engine/analytical/black_engine.py +583 -0
  8. quantark/asset/bond/engine/analytical/bond_forward_engine.py +390 -0
  9. quantark/asset/bond/engine/analytical/bond_futures_engine.py +569 -0
  10. quantark/asset/bond/engine/convertible/__init__.py +12 -0
  11. quantark/asset/bond/engine/convertible/convertible_bond_engine.py +800 -0
  12. quantark/asset/bond/engine/discount/__init__.py +10 -0
  13. quantark/asset/bond/engine/discount/bond_discount_engine.py +517 -0
  14. quantark/asset/bond/engine/discount/frn_engine.py +913 -0
  15. quantark/asset/bond/engine/pde/__init__.py +14 -0
  16. quantark/asset/bond/engine/pde/convertible/__init__.py +21 -0
  17. quantark/asset/bond/engine/pde/convertible/jump_diffusion_engine.py +603 -0
  18. quantark/asset/bond/engine/pde/convertible/pde_params.py +59 -0
  19. quantark/asset/bond/engine/pde/convertible/tf_engine.py +546 -0
  20. quantark/asset/bond/engine/tree/__init__.py +14 -0
  21. quantark/asset/bond/engine/tree/convertible/__init__.py +21 -0
  22. quantark/asset/bond/engine/tree/convertible/binomial_engine.py +488 -0
  23. quantark/asset/bond/engine/tree/convertible/tree_params.py +72 -0
  24. quantark/asset/bond/engine/tree/convertible/trinomial_engine.py +1341 -0
  25. quantark/asset/bond/product/__init__.py +37 -0
  26. quantark/asset/bond/product/base_bond_product.py +114 -0
  27. quantark/asset/bond/product/convertible/__init__.py +16 -0
  28. quantark/asset/bond/product/convertible/convertible_bond.py +595 -0
  29. quantark/asset/bond/product/couponbond/__init__.py +12 -0
  30. quantark/asset/bond/product/couponbond/fixed_bond.py +285 -0
  31. quantark/asset/bond/product/couponbond/frn.py +538 -0
  32. quantark/asset/bond/product/forward/__init__.py +9 -0
  33. quantark/asset/bond/product/forward/base_bond_forward.py +92 -0
  34. quantark/asset/bond/product/forward/bond_forward.py +335 -0
  35. quantark/asset/bond/product/futures/__init__.py +8 -0
  36. quantark/asset/bond/product/futures/bond_futures.py +532 -0
  37. quantark/asset/bond/product/option/__init__.py +9 -0
  38. quantark/asset/bond/product/option/euro_short_term_bond_option.py +231 -0
  39. quantark/asset/bond/riskmeasures/__init__.py +13 -0
  40. quantark/asset/bond/riskmeasures/bond_greeks_calculator.py +484 -0
  41. quantark/asset/bond/schedule/__init__.py +21 -0
  42. quantark/asset/bond/schedule/cashflow.py +595 -0
  43. quantark/asset/equity/__init__.py +11 -0
  44. quantark/asset/equity/analysis/__init__.py +4 -0
  45. quantark/asset/equity/analysis/autocallable_path_analyzer.py +257 -0
  46. quantark/asset/equity/engine/__init__.py +84 -0
  47. quantark/asset/equity/engine/analytical/__init__.py +37 -0
  48. quantark/asset/equity/engine/analytical/american_option_engine.py +682 -0
  49. quantark/asset/equity/engine/analytical/asian_option_analytical_engine.py +1102 -0
  50. quantark/asset/equity/engine/analytical/barrier_analytical_engine.py +455 -0
  51. quantark/asset/equity/engine/analytical/black_scholes_engine.py +322 -0
  52. quantark/asset/equity/engine/analytical/deltaone_engine.py +340 -0
  53. quantark/asset/equity/engine/analytical/digital_option_engine.py +168 -0
  54. quantark/asset/equity/engine/analytical/double_barrier_option_engine.py +481 -0
  55. quantark/asset/equity/engine/analytical/double_sharkfin_option_analytical_engine.py +508 -0
  56. quantark/asset/equity/engine/analytical/one_touch_analytical_engine.py +302 -0
  57. quantark/asset/equity/engine/analytical/range_accrual_analytical_engine.py +396 -0
  58. quantark/asset/equity/engine/analytical/single_sharkfin_option_analytical_engine.py +229 -0
  59. quantark/asset/equity/engine/base_engine.py +137 -0
  60. quantark/asset/equity/engine/event_stats.py +85 -0
  61. quantark/asset/equity/engine/mc/__init__.py +31 -0
  62. quantark/asset/equity/engine/mc/american_option_mc_engine.py +485 -0
  63. quantark/asset/equity/engine/mc/asian_option_mc_engine.py +678 -0
  64. quantark/asset/equity/engine/mc/barrier_option_mc_engine.py +726 -0
  65. quantark/asset/equity/engine/mc/digital_option_mc_engine.py +419 -0
  66. quantark/asset/equity/engine/mc/double_sharkfin_option_mc_engine.py +676 -0
  67. quantark/asset/equity/engine/mc/euro_mc_engine.py +423 -0
  68. quantark/asset/equity/engine/mc/phoenix_mc_engine.py +1206 -0
  69. quantark/asset/equity/engine/mc/range_accrual_mc_engine.py +738 -0
  70. quantark/asset/equity/engine/mc/single_sharkfin_option_mc_engine.py +549 -0
  71. quantark/asset/equity/engine/mc/snowball_mc_engine.py +2250 -0
  72. quantark/asset/equity/engine/pde/__init__.py +36 -0
  73. quantark/asset/equity/engine/pde/american_pde_solver.py +211 -0
  74. quantark/asset/equity/engine/pde/barrier_pde_solver.py +692 -0
  75. quantark/asset/equity/engine/pde/base_pde_solver.py +994 -0
  76. quantark/asset/equity/engine/pde/double_barrier_pde_solver.py +510 -0
  77. quantark/asset/equity/engine/pde/double_one_touch_pde_solver.py +435 -0
  78. quantark/asset/equity/engine/pde/european_pde_solver.py +170 -0
  79. quantark/asset/equity/engine/pde/ko_reset_snowball_pde_solver.py +477 -0
  80. quantark/asset/equity/engine/pde/one_touch_pde_solver.py +439 -0
  81. quantark/asset/equity/engine/pde/phoenix_pde_solver.py +613 -0
  82. quantark/asset/equity/engine/pde/snowball_pde_solver.py +1810 -0
  83. quantark/asset/equity/engine/pde/spatial_grid.py +750 -0
  84. quantark/asset/equity/engine/pde/time_grid.py +308 -0
  85. quantark/asset/equity/engine/pde_engine.py +238 -0
  86. quantark/asset/equity/engine/quad/__init__.py +23 -0
  87. quantark/asset/equity/engine/quad/discrete_quad_engine.py +106 -0
  88. quantark/asset/equity/engine/quad/european_quad_engine.py +325 -0
  89. quantark/asset/equity/engine/quad/ko_reset_snowball_quad_engine.py +362 -0
  90. quantark/asset/equity/engine/quad/phoenix_quad_engine.py +614 -0
  91. quantark/asset/equity/engine/quad/quad_adapters.py +1260 -0
  92. quantark/asset/equity/engine/quad/quad_core.py +513 -0
  93. quantark/asset/equity/engine/quad/quad_math.py +219 -0
  94. quantark/asset/equity/engine/quad/snowball_quad_engine.py +1137 -0
  95. quantark/asset/equity/engine/validation/script/benchmark_check_american_analytical.py +117 -0
  96. quantark/asset/equity/engine/validation/script/benchmark_check_american_pde.py +114 -0
  97. quantark/asset/equity/engine/validation/script/benchmark_check_asian_analytical.py +440 -0
  98. quantark/asset/equity/engine/validation/script/benchmark_check_barrier_analytical.py +269 -0
  99. quantark/asset/equity/engine/validation/script/benchmark_check_barrier_pde_solver.py +636 -0
  100. quantark/asset/equity/engine/validation/script/benchmark_check_digital_option.py +256 -0
  101. quantark/asset/equity/engine/validation/script/benchmark_check_snowball_pde_solver.py +807 -0
  102. quantark/asset/equity/engine/validation/script/boundary_check_american_analytical.py +290 -0
  103. quantark/asset/equity/engine/validation/script/boundary_check_american_pde.py +242 -0
  104. quantark/asset/equity/engine/validation/script/boundary_check_asian_analytical.py +612 -0
  105. quantark/asset/equity/engine/validation/script/boundary_check_barrier_analytical.py +434 -0
  106. quantark/asset/equity/engine/validation/script/boundary_check_barrier_pde_solver.py +748 -0
  107. quantark/asset/equity/engine/validation/script/boundary_check_digital_option.py +575 -0
  108. quantark/asset/equity/engine/validation/script/boundary_check_snowball_pde_solver.py +1101 -0
  109. quantark/asset/equity/engine/validation/script/greeks_check_digital_option.py +349 -0
  110. quantark/asset/equity/engine/validation/script/mc_comparison_barrier_pde.py +270 -0
  111. quantark/asset/equity/engine/validation/script/quick_mc_compare.py +51 -0
  112. quantark/asset/equity/engine/validation/script/validation_stepdown_improved.py +97 -0
  113. quantark/asset/equity/param/__init__.py +24 -0
  114. quantark/asset/equity/param/engine_param_profiles.py +325 -0
  115. quantark/asset/equity/param/engine_params.py +728 -0
  116. quantark/asset/equity/process/__init__.py +7 -0
  117. quantark/asset/equity/process/bsm/__init__.py +7 -0
  118. quantark/asset/equity/process/bsm/bsm_process.py +108 -0
  119. quantark/asset/equity/process/bsm/qmc_brownian_bridge.py +401 -0
  120. quantark/asset/equity/process/bsm/qmc_path_generator.py +694 -0
  121. quantark/asset/equity/process/bsm/qmc_rqmc_driver.py +163 -0
  122. quantark/asset/equity/process/bsm/qmc_sobol.py +195 -0
  123. quantark/asset/equity/process/bsm/qmc_variance_reduction.py +292 -0
  124. quantark/asset/equity/product/__init__.py +8 -0
  125. quantark/asset/equity/product/base_equity_product.py +72 -0
  126. quantark/asset/equity/product/deltaone/__init__.py +22 -0
  127. quantark/asset/equity/product/deltaone/base_deltaone_product.py +147 -0
  128. quantark/asset/equity/product/deltaone/futures.py +485 -0
  129. quantark/asset/equity/product/deltaone/spot_instrument.py +118 -0
  130. quantark/asset/equity/product/option/__init__.py +104 -0
  131. quantark/asset/equity/product/option/american_option.py +114 -0
  132. quantark/asset/equity/product/option/asian_option.py +531 -0
  133. quantark/asset/equity/product/option/barrier_option.py +289 -0
  134. quantark/asset/equity/product/option/base_equity_option.py +659 -0
  135. quantark/asset/equity/product/option/digital_option.py +102 -0
  136. quantark/asset/equity/product/option/double_barrier_option.py +286 -0
  137. quantark/asset/equity/product/option/double_one_touch_option.py +310 -0
  138. quantark/asset/equity/product/option/double_sharkfin_option.py +466 -0
  139. quantark/asset/equity/product/option/european_vanilla_option.py +103 -0
  140. quantark/asset/equity/product/option/ko_reset_snowball_option.py +563 -0
  141. quantark/asset/equity/product/option/observation_schedule.py +530 -0
  142. quantark/asset/equity/product/option/one_touch_option.py +287 -0
  143. quantark/asset/equity/product/option/phoenix_config.py +116 -0
  144. quantark/asset/equity/product/option/phoenix_helpers.py +576 -0
  145. quantark/asset/equity/product/option/phoenix_option.py +1167 -0
  146. quantark/asset/equity/product/option/range_accrual_config.py +288 -0
  147. quantark/asset/equity/product/option/range_accrual_helpers.py +608 -0
  148. quantark/asset/equity/product/option/range_accrual_option.py +526 -0
  149. quantark/asset/equity/product/option/single_sharkfin_option.py +420 -0
  150. quantark/asset/equity/product/option/snowball_config.py +261 -0
  151. quantark/asset/equity/product/option/snowball_helpers.py +977 -0
  152. quantark/asset/equity/product/option/snowball_option.py +1242 -0
  153. quantark/asset/equity/report/__init__.py +15 -0
  154. quantark/asset/equity/report/autocallable_risk_report.py +2118 -0
  155. quantark/asset/equity/report/plotting.py +87 -0
  156. quantark/asset/equity/report/snowball_risk_comparison_report.py +2230 -0
  157. quantark/asset/equity/report/surfaces.py +123 -0
  158. quantark/asset/equity/report/term_structure.py +126 -0
  159. quantark/asset/equity/riskmeasures/__init__.py +7 -0
  160. quantark/asset/equity/riskmeasures/greeks_calculator.py +1204 -0
  161. quantark/asset/rate/__init__.py +58 -0
  162. quantark/asset/rate/engine/__init__.py +25 -0
  163. quantark/asset/rate/engine/cap_floor_engine.py +514 -0
  164. quantark/asset/rate/engine/fra_engine.py +286 -0
  165. quantark/asset/rate/engine/irs_discount_engine.py +891 -0
  166. quantark/asset/rate/engine/swaption_engine.py +587 -0
  167. quantark/asset/rate/product/__init__.py +67 -0
  168. quantark/asset/rate/product/cap_floor.py +550 -0
  169. quantark/asset/rate/product/fra.py +219 -0
  170. quantark/asset/rate/product/irs.py +1223 -0
  171. quantark/asset/rate/product/swaption.py +372 -0
  172. quantark/backtest/__init__.py +153 -0
  173. quantark/backtest/base.py +263 -0
  174. quantark/backtest/dashboard.py +874 -0
  175. quantark/backtest/equity/__init__.py +35 -0
  176. quantark/backtest/equity/config.py +118 -0
  177. quantark/backtest/equity/engine.py +408 -0
  178. quantark/backtest/equity/hedge_executor.py +374 -0
  179. quantark/backtest/equity/metrics.py +396 -0
  180. quantark/backtest/equity/results.py +232 -0
  181. quantark/backtest/equity/state.py +252 -0
  182. quantark/backtest/examples/__init__.py +4 -0
  183. quantark/backtest/examples/advanced_backtest.py +345 -0
  184. quantark/backtest/examples/basic_delta_hedge.py +246 -0
  185. quantark/backtest/examples/fi_dv01_hedge.py +267 -0
  186. quantark/backtest/fi/__init__.py +30 -0
  187. quantark/backtest/fi/config.py +114 -0
  188. quantark/backtest/fi/engine.py +378 -0
  189. quantark/backtest/fi/hedge_executor.py +254 -0
  190. quantark/backtest/fi/metrics.py +308 -0
  191. quantark/backtest/fi/results.py +193 -0
  192. quantark/backtest/fi/state.py +212 -0
  193. quantark/backtest/logger.py +393 -0
  194. quantark/backtest/otc/__init__.py +74 -0
  195. quantark/backtest/otc/_replay.py +637 -0
  196. quantark/backtest/otc/book_engine.py +587 -0
  197. quantark/backtest/otc/config.py +175 -0
  198. quantark/backtest/otc/dashboard.py +1006 -0
  199. quantark/backtest/otc/engine.py +420 -0
  200. quantark/backtest/otc/engine_factory.py +138 -0
  201. quantark/backtest/otc/market.py +216 -0
  202. quantark/backtest/otc/results.py +107 -0
  203. quantark/backtest/otc/state.py +166 -0
  204. quantark/backtest/report_generator.py +608 -0
  205. quantark/backtest/strategy/__init__.py +28 -0
  206. quantark/backtest/strategy/base_strategy.py +235 -0
  207. quantark/backtest/strategy/convexity_neutral_strategy.py +247 -0
  208. quantark/backtest/strategy/delta_neutral_strategy.py +283 -0
  209. quantark/backtest/strategy/dv01_neutral_strategy.py +283 -0
  210. quantark/backtest/transaction_costs.py +485 -0
  211. quantark/backtest/visualizer.py +1019 -0
  212. quantark/cashleg/__init__.py +31 -0
  213. quantark/cashleg/accrual_leg.py +120 -0
  214. quantark/cashleg/base.py +48 -0
  215. quantark/cashleg/base_amount.py +60 -0
  216. quantark/cashleg/deterministic_leg.py +39 -0
  217. quantark/cashleg/event_distribution.py +262 -0
  218. quantark/cashleg/fixed_payoff_leg.py +92 -0
  219. quantark/cashleg/leg_schedule.py +95 -0
  220. quantark/cashleg/leg_valuator.py +40 -0
  221. quantark/dynamicscenario/__init__.py +97 -0
  222. quantark/dynamicscenario/base.py +297 -0
  223. quantark/dynamicscenario/config.py +122 -0
  224. quantark/dynamicscenario/engine.py +703 -0
  225. quantark/dynamicscenario/equity/__init__.py +14 -0
  226. quantark/dynamicscenario/fi/__init__.py +24 -0
  227. quantark/dynamicscenario/fi/config.py +149 -0
  228. quantark/dynamicscenario/fi/engine.py +500 -0
  229. quantark/dynamicscenario/fi/results.py +503 -0
  230. quantark/dynamicscenario/path/__init__.py +17 -0
  231. quantark/dynamicscenario/path/day_path.py +397 -0
  232. quantark/dynamicscenario/path/fi_path_library.py +488 -0
  233. quantark/dynamicscenario/path/path_builder.py +726 -0
  234. quantark/dynamicscenario/path/path_library.py +620 -0
  235. quantark/dynamicscenario/report/__init__.py +12 -0
  236. quantark/dynamicscenario/report/dynamic_report.py +1175 -0
  237. quantark/dynamicscenario/report/visualizer.py +1586 -0
  238. quantark/dynamicscenario/results/__init__.py +19 -0
  239. quantark/dynamicscenario/results/dynamic_results.py +579 -0
  240. quantark/dynamicscenario/results/result_exporter.py +438 -0
  241. quantark/param/__init__.py +75 -0
  242. quantark/param/basis/__init__.py +19 -0
  243. quantark/param/basis/basis_yield.py +301 -0
  244. quantark/param/div/__init__.py +16 -0
  245. quantark/param/div/dividend_yield.py +123 -0
  246. quantark/param/index/__init__.py +52 -0
  247. quantark/param/index/rate_index.py +568 -0
  248. quantark/param/quote/__init__.py +7 -0
  249. quantark/param/quote/spot_quote.py +35 -0
  250. quantark/param/rrf/__init__.py +22 -0
  251. quantark/param/rrf/rate_curve.py +436 -0
  252. quantark/param/vol/__init__.py +6 -0
  253. quantark/param/vol/vol_surface.py +118 -0
  254. quantark/portfolio/__init__.py +61 -0
  255. quantark/portfolio/base.py +203 -0
  256. quantark/portfolio/equity/__init__.py +17 -0
  257. quantark/portfolio/equity/portfolio.py +391 -0
  258. quantark/portfolio/equity/position.py +368 -0
  259. quantark/portfolio/fi/__init__.py +14 -0
  260. quantark/portfolio/fi/portfolio.py +424 -0
  261. quantark/portfolio/fi/position.py +272 -0
  262. quantark/portfolio/portfolio_snapshot.py +221 -0
  263. quantark/portfolio/portfolio_storage.py +414 -0
  264. quantark/priceenv/__init__.py +7 -0
  265. quantark/priceenv/pricing_environment.py +196 -0
  266. quantark/rfq/__init__.py +32 -0
  267. quantark/rfq/builders.py +102 -0
  268. quantark/rfq/models.py +214 -0
  269. quantark/rfq/registry.py +611 -0
  270. quantark/rfq/service.py +237 -0
  271. quantark/simm/__init__.py +155 -0
  272. quantark/simm/calibration/__init__.py +206 -0
  273. quantark/simm/calibration/accessors.py +439 -0
  274. quantark/simm/calibration/commodity.py +156 -0
  275. quantark/simm/calibration/credit_non_qualifying.py +79 -0
  276. quantark/simm/calibration/credit_qualifying.py +130 -0
  277. quantark/simm/calibration/cross_risk.py +39 -0
  278. quantark/simm/calibration/equity.py +125 -0
  279. quantark/simm/calibration/fx.py +92 -0
  280. quantark/simm/calibration/ir.py +152 -0
  281. quantark/simm/calibration/version.py +33 -0
  282. quantark/simm/config.py +186 -0
  283. quantark/simm/crif/__init__.py +35 -0
  284. quantark/simm/crif/models.py +230 -0
  285. quantark/simm/crif/parser.py +585 -0
  286. quantark/simm/engines/__init__.py +62 -0
  287. quantark/simm/engines/aggregation/__init__.py +67 -0
  288. quantark/simm/engines/aggregation/addon.py +141 -0
  289. quantark/simm/engines/aggregation/bucket_aggregator.py +298 -0
  290. quantark/simm/engines/aggregation/concentration.py +349 -0
  291. quantark/simm/engines/aggregation/product_class_aggregator.py +183 -0
  292. quantark/simm/engines/aggregation/risk_class_aggregator.py +403 -0
  293. quantark/simm/engines/aggregation/simm_calculator.py +430 -0
  294. quantark/simm/engines/aggregation/weighted_sensitivity.py +272 -0
  295. quantark/simm/engines/base.py +231 -0
  296. quantark/simm/engines/classification/__init__.py +10 -0
  297. quantark/simm/engines/classification/bucket_mapper.py +347 -0
  298. quantark/simm/engines/factory.py +137 -0
  299. quantark/simm/engines/portfolio_adapter.py +336 -0
  300. quantark/simm/engines/result.py +176 -0
  301. quantark/simm/engines/risk_class/__init__.py +18 -0
  302. quantark/simm/engines/risk_class/equity_engine.py +263 -0
  303. quantark/simm/engines/risk_class/ir_engine.py +264 -0
  304. quantark/simm/report/__init__.py +17 -0
  305. quantark/simm/report/crif_export.py +284 -0
  306. quantark/simm/report/excel_generator.py +401 -0
  307. quantark/simm/report/html_generator.py +840 -0
  308. quantark/simm/results/__init__.py +38 -0
  309. quantark/simm/results/attribution.py +313 -0
  310. quantark/simm/results/simm_result.py +339 -0
  311. quantark/simm/results/whatif.py +268 -0
  312. quantark/simm/sensitivity.py +533 -0
  313. quantark/simm/taxonomy.py +416 -0
  314. quantark/stresstest/__init__.py +67 -0
  315. quantark/stresstest/base.py +116 -0
  316. quantark/stresstest/config.py +5 -0
  317. quantark/stresstest/engine.py +5 -0
  318. quantark/stresstest/equity/__init__.py +17 -0
  319. quantark/stresstest/equity/config.py +69 -0
  320. quantark/stresstest/equity/engine.py +272 -0
  321. quantark/stresstest/equity/report/__init__.py +7 -0
  322. quantark/stresstest/equity/report/report_generator.py +423 -0
  323. quantark/stresstest/equity/report/visualizer.py +328 -0
  324. quantark/stresstest/equity/results.py +145 -0
  325. quantark/stresstest/fi/__init__.py +15 -0
  326. quantark/stresstest/fi/config.py +59 -0
  327. quantark/stresstest/fi/engine.py +213 -0
  328. quantark/stresstest/fi/metrics.py +60 -0
  329. quantark/stresstest/fi/results.py +64 -0
  330. quantark/stresstest/report/__init__.py +12 -0
  331. quantark/stresstest/report/report_generator.py +5 -0
  332. quantark/stresstest/report/visualizer.py +5 -0
  333. quantark/stresstest/results/__init__.py +16 -0
  334. quantark/stresstest/results/result_aggregator.py +325 -0
  335. quantark/stresstest/results/result_exporter.py +286 -0
  336. quantark/stresstest/results/stress_results.py +5 -0
  337. quantark/stresstest/scenario/__init__.py +13 -0
  338. quantark/stresstest/scenario/scenario.py +242 -0
  339. quantark/stresstest/scenario/scenario_builder.py +376 -0
  340. quantark/stresstest/scenario/scenario_library.py +435 -0
  341. quantark/stresstest/scenario/scenario_storage.py +224 -0
  342. quantark/stresstest/stress/__init__.py +13 -0
  343. quantark/stresstest/stress/stress_applicator.py +590 -0
  344. quantark/stresstest/stress/stress_types.py +142 -0
  345. quantark/util/__init__.py +23 -0
  346. quantark/util/barrier_shift.py +44 -0
  347. quantark/util/calendar/__init__.py +27 -0
  348. quantark/util/calendar/business_calendar.py +584 -0
  349. quantark/util/calendar/day_counter.py +517 -0
  350. quantark/util/calendar/holidayfile/china.csv +1920 -0
  351. quantark/util/calendar/holidayfile/china_sse.csv +1462 -0
  352. quantark/util/enum/__init__.py +81 -0
  353. quantark/util/enum/bond_enums.py +112 -0
  354. quantark/util/enum/deltaone_enums.py +16 -0
  355. quantark/util/enum/engine_enums.py +137 -0
  356. quantark/util/enum/greeks_enums.py +29 -0
  357. quantark/util/enum/option_enums.py +221 -0
  358. quantark/util/exceptions.py +66 -0
  359. quantark/util/marketdata/__init__.py +39 -0
  360. quantark/util/marketdata/adapter/base_adapter.py +203 -0
  361. quantark/util/marketdata/adapter/mock_adapter.py +265 -0
  362. quantark/util/marketdata/converter.py +289 -0
  363. quantark/util/marketdata/example_usage.py +314 -0
  364. quantark/util/marketdata/generator/__init__.py +7 -0
  365. quantark/util/marketdata/generator/mock_generator.py +466 -0
  366. quantark/util/marketdata/models.py +358 -0
  367. quantark/util/marketdata/storage/__init__.py +7 -0
  368. quantark/util/marketdata/storage/parquet_storage.py +340 -0
  369. quantark/util/numerical/__init__.py +98 -0
  370. quantark/util/numerical/comparison.py +219 -0
  371. quantark/util/numerical/constants.py +98 -0
  372. quantark/util/numerical/formatting.py +380 -0
  373. quantark/util/numerical/pnl.py +17 -0
  374. quantark/util/numerical/safe_math.py +238 -0
  375. quantark/util/numerical/validation.py +315 -0
  376. quantark/var/__init__.py +39 -0
  377. quantark/var/attribution.py +398 -0
  378. quantark/var/backtest/__init__.py +7 -0
  379. quantark/var/backtest/var_backtester.py +309 -0
  380. quantark/var/base.py +63 -0
  381. quantark/var/config.py +219 -0
  382. quantark/var/engines/__init__.py +13 -0
  383. quantark/var/engines/historical.py +925 -0
  384. quantark/var/engines/monte_carlo.py +870 -0
  385. quantark/var/engines/parametric.py +1199 -0
  386. quantark/var/results/__init__.py +16 -0
  387. quantark/var/results/incremental_var_result.py +131 -0
  388. quantark/var/results/var_report.py +346 -0
  389. quantark/var/results/var_result.py +134 -0
  390. quantark/var/risk_factors/__init__.py +22 -0
  391. quantark/var/risk_factors/base.py +41 -0
  392. quantark/var/risk_factors/equity_factors.py +158 -0
  393. quantark/var/risk_factors/fi_factors.py +99 -0
  394. quantark-0.1.0.dist-info/METADATA +351 -0
  395. quantark-0.1.0.dist-info/RECORD +399 -0
  396. quantark-0.1.0.dist-info/WHEEL +4 -0
  397. quantark-0.1.0.dist-info/licenses/LICENSE +202 -0
  398. quantark-0.1.0.dist-info/licenses/NOTICE +2 -0
  399. quantark_compat.pth +1 -0
@@ -0,0 +1,186 @@
1
+ """
2
+ SIMM Configuration Module.
3
+
4
+ This module provides configuration dataclasses for ISDA SIMM calculations.
5
+ """
6
+ from dataclasses import dataclass, field
7
+ from enum import Enum
8
+ from typing import Dict, Optional
9
+
10
+ from quantark.util.exceptions import ValidationError
11
+
12
+
13
+ class SIMMVersion(Enum):
14
+ """ISDA SIMM version identifiers.
15
+
16
+ Different SIMM versions may have different risk weights and correlations.
17
+ """
18
+ V2_5 = "2.5"
19
+ V2_6 = "2.6"
20
+
21
+ def __str__(self) -> str:
22
+ return self.value
23
+
24
+
25
+ @dataclass
26
+ class SIMMConfig:
27
+ """Configuration for SIMM calculation.
28
+
29
+ This class encapsulates all configuration parameters for SIMM calculations,
30
+ including version, calculation currency, component selection, and add-ons.
31
+
32
+ Attributes:
33
+ version: SIMM version (affects risk weights and correlations).
34
+ calculation_currency: Base currency for SIMM calculation (typically USD).
35
+
36
+ calculate_delta: Whether to calculate Delta margin.
37
+ calculate_vega: Whether to calculate Vega margin.
38
+ calculate_curvature: Whether to calculate Curvature margin.
39
+ calculate_base_corr: Whether to calculate Base Correlation margin.
40
+
41
+ ms_rates_fx: Product class multiplier for RatesFX (default 1.0).
42
+ ms_credit: Product class multiplier for Credit (default 1.0).
43
+ ms_equity: Product class multiplier for Equity (default 1.0).
44
+ ms_commodity: Product class multiplier for Commodity (default 1.0).
45
+
46
+ addon_fixed: Fixed add-on amount in calculation currency.
47
+ addon_factors: Per-trade or per-product add-on factors.
48
+
49
+ include_attribution: Include margin attribution in results.
50
+ include_bucket_detail: Include bucket-level detail in results.
51
+
52
+ Examples:
53
+ Basic SIMM configuration:
54
+ >>> config = SIMMConfig()
55
+
56
+ SIMM with specific version and currency:
57
+ >>> config = SIMMConfig(
58
+ ... version=SIMMVersion.V2_6,
59
+ ... calculation_currency="EUR"
60
+ ... )
61
+
62
+ SIMM with add-ons:
63
+ >>> config = SIMMConfig(
64
+ ... addon_fixed=1_000_000,
65
+ ... addon_factors={"regulatory_addon": 0.05}
66
+ ... )
67
+
68
+ Delta-only SIMM:
69
+ >>> config = SIMMConfig(
70
+ ... calculate_delta=True,
71
+ ... calculate_vega=False,
72
+ ... calculate_curvature=False,
73
+ ... calculate_base_corr=False
74
+ ... )
75
+ """
76
+ # SIMM version
77
+ version: SIMMVersion = SIMMVersion.V2_6
78
+
79
+ # Calculation currency
80
+ calculation_currency: str = "USD"
81
+
82
+ # Which components to calculate
83
+ calculate_delta: bool = True
84
+ calculate_vega: bool = True
85
+ calculate_curvature: bool = True
86
+ calculate_base_corr: bool = True
87
+
88
+ # Product class multipliers (default = 1.0)
89
+ ms_rates_fx: float = 1.0
90
+ ms_credit: float = 1.0
91
+ ms_equity: float = 1.0
92
+ ms_commodity: float = 1.0
93
+
94
+ # Add-on configuration
95
+ addon_fixed: float = 0.0
96
+ addon_factors: Dict[str, float] = field(default_factory=dict)
97
+
98
+ # Output options
99
+ include_attribution: bool = True
100
+ include_bucket_detail: bool = True
101
+
102
+ def __post_init__(self) -> None:
103
+ """Validate configuration parameters."""
104
+ self._validate()
105
+
106
+ def _validate(self) -> None:
107
+ """Validate configuration values."""
108
+ # Validate calculation currency
109
+ if not isinstance(self.calculation_currency, str) or len(self.calculation_currency) != 3:
110
+ raise ValidationError(
111
+ f"calculation_currency must be a 3-letter ISO currency code, "
112
+ f"got {self.calculation_currency!r}"
113
+ )
114
+
115
+ # Validate multipliers are positive
116
+ for name, value in [
117
+ ("ms_rates_fx", self.ms_rates_fx),
118
+ ("ms_credit", self.ms_credit),
119
+ ("ms_equity", self.ms_equity),
120
+ ("ms_commodity", self.ms_commodity),
121
+ ]:
122
+ if value <= 0:
123
+ raise ValidationError(
124
+ f"{name} must be positive, got {value}"
125
+ )
126
+
127
+ # Validate addon_fixed is non-negative
128
+ if self.addon_fixed < 0:
129
+ raise ValidationError(
130
+ f"addon_fixed must be non-negative, got {self.addon_fixed}"
131
+ )
132
+
133
+ # Validate addon_factors values are non-negative
134
+ for key, value in self.addon_factors.items():
135
+ if value < 0:
136
+ raise ValidationError(
137
+ f"addon_factors['{key}'] must be non-negative, got {value}"
138
+ )
139
+
140
+ def get_product_class_multiplier(self, product_class: str) -> float:
141
+ """Get the multiplier for a product class.
142
+
143
+ Args:
144
+ product_class: Product class name ("RatesFX", "Credit", "Equity", "Commodity").
145
+
146
+ Returns:
147
+ The multiplier for the specified product class.
148
+
149
+ Raises:
150
+ ValueError: If product_class is not recognized.
151
+ """
152
+ mapping = {
153
+ "RatesFX": self.ms_rates_fx,
154
+ "Credit": self.ms_credit,
155
+ "Equity": self.ms_equity,
156
+ "Commodity": self.ms_commodity,
157
+ }
158
+ if product_class not in mapping:
159
+ raise ValueError(f"Unknown product class: {product_class}")
160
+ return mapping[product_class]
161
+
162
+ def with_version(self, version: SIMMVersion) -> "SIMMConfig":
163
+ """Create a copy of this config with a different version.
164
+
165
+ Args:
166
+ version: The SIMM version to use.
167
+
168
+ Returns:
169
+ New SIMMConfig with the specified version.
170
+ """
171
+ return SIMMConfig(
172
+ version=version,
173
+ calculation_currency=self.calculation_currency,
174
+ calculate_delta=self.calculate_delta,
175
+ calculate_vega=self.calculate_vega,
176
+ calculate_curvature=self.calculate_curvature,
177
+ calculate_base_corr=self.calculate_base_corr,
178
+ ms_rates_fx=self.ms_rates_fx,
179
+ ms_credit=self.ms_credit,
180
+ ms_equity=self.ms_equity,
181
+ ms_commodity=self.ms_commodity,
182
+ addon_fixed=self.addon_fixed,
183
+ addon_factors=dict(self.addon_factors),
184
+ include_attribution=self.include_attribution,
185
+ include_bucket_detail=self.include_bucket_detail,
186
+ )
@@ -0,0 +1,35 @@
1
+ """
2
+ SIMM CRIF Module.
3
+
4
+ This module provides CRIF (Common Risk Interchange Format) data models
5
+ and parsing utilities for ISDA SIMM.
6
+ """
7
+ from .models import (
8
+ CRIFHeader,
9
+ CRIFRecord,
10
+ CRIF_COLUMNS,
11
+ CRIF_COLUMN_MAPPING,
12
+ CRIF_REQUIRED_COLUMNS,
13
+ )
14
+ from .parser import (
15
+ CRIFValidationError,
16
+ crif_to_sensitivities,
17
+ parse_crif_csv,
18
+ sensitivities_to_crif,
19
+ write_crif_csv,
20
+ )
21
+
22
+ __all__ = [
23
+ # Models
24
+ "CRIFHeader",
25
+ "CRIFRecord",
26
+ "CRIF_COLUMNS",
27
+ "CRIF_COLUMN_MAPPING",
28
+ "CRIF_REQUIRED_COLUMNS",
29
+ # Parser
30
+ "CRIFValidationError",
31
+ "crif_to_sensitivities",
32
+ "parse_crif_csv",
33
+ "sensitivities_to_crif",
34
+ "write_crif_csv",
35
+ ]
@@ -0,0 +1,230 @@
1
+ """
2
+ CRIF Data Models.
3
+
4
+ This module defines the CRIF (Common Risk Interchange Format) data structures
5
+ for ISDA SIMM sensitivity exchange.
6
+ """
7
+ from dataclasses import dataclass, field
8
+ from datetime import date
9
+ from typing import Optional
10
+
11
+ from ..taxonomy import MarginType, ProductClass, RiskClass, SensitivityType
12
+
13
+
14
+ @dataclass
15
+ class CRIFHeader:
16
+ """CRIF file header metadata.
17
+
18
+ Contains information about the CRIF file including valuation date,
19
+ reporting entity, and file format version.
20
+
21
+ Attributes:
22
+ valuation_date: Date of valuation for the sensitivities.
23
+ reporting_entity: Legal entity identifier of the reporter.
24
+ counterparty: Counterparty legal entity identifier.
25
+ crif_version: CRIF format version (e.g., "2.0").
26
+ im_model: Initial margin model identifier (typically "SIMM").
27
+ base_currency: Base currency for amounts.
28
+ """
29
+ valuation_date: date
30
+ reporting_entity: str = ""
31
+ counterparty: str = ""
32
+ crif_version: str = "2.0"
33
+ im_model: str = "SIMM"
34
+ base_currency: str = "USD"
35
+
36
+
37
+ @dataclass
38
+ class CRIFRecord:
39
+ """Single CRIF record representing one sensitivity.
40
+
41
+ This dataclass follows the ISDA CRIF v2.x specification for
42
+ representing sensitivities in a standardized interchange format.
43
+
44
+ Attributes:
45
+ trade_id: Unique identifier for the trade.
46
+ valuation_date: Date of the valuation.
47
+
48
+ risk_type: SIMM risk type (e.g., "Risk_IRCurve", "Risk_FX").
49
+ qualifier: Primary risk factor identifier (currency for IR, issuer for Credit).
50
+ bucket: SIMM bucket assignment.
51
+ label1: First label (tenor for IR/Credit, empty for others).
52
+ label2: Second label (sub-curve for IR, empty for others).
53
+
54
+ amount: Sensitivity amount.
55
+ amount_currency: Currency of the amount.
56
+ amount_usd: Amount converted to USD (optional).
57
+
58
+ product_class: SIMM product class (optional, can be inferred).
59
+ risk_class: SIMM risk class (optional, can be inferred).
60
+
61
+ im_model: Initial margin model (typically "SIMM").
62
+ post_regulations: Posting regulations (e.g., "CFTC", "EMIR").
63
+ collect_regulations: Collection regulations.
64
+
65
+ call_put: "C" or "P" for options (optional).
66
+ notional: Trade notional (optional, for reference).
67
+ notional_currency: Currency of notional (optional).
68
+
69
+ Examples:
70
+ IR Delta sensitivity:
71
+ >>> record = CRIFRecord(
72
+ ... trade_id="TRADE001",
73
+ ... valuation_date=date(2024, 1, 15),
74
+ ... risk_type="Risk_IRCurve",
75
+ ... qualifier="USD",
76
+ ... bucket="1",
77
+ ... label1="5y",
78
+ ... label2="OIS",
79
+ ... amount=150000.0,
80
+ ... amount_currency="USD"
81
+ ... )
82
+
83
+ FX Delta sensitivity:
84
+ >>> record = CRIFRecord(
85
+ ... trade_id="TRADE002",
86
+ ... valuation_date=date(2024, 1, 15),
87
+ ... risk_type="Risk_FX",
88
+ ... qualifier="EURUSD",
89
+ ... bucket="",
90
+ ... label1="",
91
+ ... label2="",
92
+ ... amount=50000.0,
93
+ ... amount_currency="USD"
94
+ ... )
95
+ """
96
+ # Required identification fields
97
+ trade_id: str
98
+ valuation_date: date
99
+
100
+ # SIMM classification
101
+ risk_type: str
102
+ qualifier: str
103
+ bucket: str
104
+ label1: str = ""
105
+ label2: str = ""
106
+
107
+ # Sensitivity value
108
+ amount: float = 0.0
109
+ amount_currency: str = "USD"
110
+ amount_usd: Optional[float] = None
111
+
112
+ # SIMM classification (optional, can be inferred)
113
+ product_class: Optional[str] = None
114
+ risk_class: Optional[str] = None
115
+
116
+ # Model and regulatory info
117
+ im_model: str = "SIMM"
118
+ post_regulations: Optional[str] = None
119
+ collect_regulations: Optional[str] = None
120
+
121
+ # Option-specific fields
122
+ call_put: Optional[str] = None
123
+
124
+ # Reference fields
125
+ notional: Optional[float] = None
126
+ notional_currency: Optional[str] = None
127
+
128
+ def get_sensitivity_type(self) -> Optional[SensitivityType]:
129
+ """Get the SensitivityType enum from the risk_type string.
130
+
131
+ Returns:
132
+ SensitivityType if valid, None otherwise.
133
+ """
134
+ for st in SensitivityType:
135
+ if st.value == self.risk_type:
136
+ return st
137
+ return None
138
+
139
+ def get_risk_class(self) -> Optional[RiskClass]:
140
+ """Infer the RiskClass from the risk_type.
141
+
142
+ Returns:
143
+ RiskClass if determinable, None otherwise.
144
+ """
145
+ sensitivity_type = self.get_sensitivity_type()
146
+ if sensitivity_type:
147
+ return sensitivity_type.risk_class
148
+ return None
149
+
150
+ def get_margin_type(self) -> Optional[MarginType]:
151
+ """Infer the MarginType from the risk_type.
152
+
153
+ Returns:
154
+ MarginType if determinable, None otherwise.
155
+ """
156
+ sensitivity_type = self.get_sensitivity_type()
157
+ if sensitivity_type:
158
+ return sensitivity_type.margin_type
159
+ return None
160
+
161
+ def get_product_class(self) -> Optional[ProductClass]:
162
+ """Infer or return the ProductClass.
163
+
164
+ Returns:
165
+ ProductClass based on risk_class mapping.
166
+ """
167
+ if self.product_class:
168
+ for pc in ProductClass:
169
+ if pc.value == self.product_class:
170
+ return pc
171
+
172
+ # Infer from risk class
173
+ risk_class = self.get_risk_class()
174
+ if risk_class:
175
+ mapping = {
176
+ RiskClass.INTEREST_RATE: ProductClass.RATES_FX,
177
+ RiskClass.FX: ProductClass.RATES_FX,
178
+ RiskClass.CREDIT_QUALIFYING: ProductClass.CREDIT,
179
+ RiskClass.CREDIT_NON_QUALIFYING: ProductClass.CREDIT,
180
+ RiskClass.EQUITY: ProductClass.EQUITY,
181
+ RiskClass.COMMODITY: ProductClass.COMMODITY,
182
+ }
183
+ return mapping.get(risk_class)
184
+ return None
185
+
186
+
187
+ # Standard CRIF column names
188
+ CRIF_COLUMNS = (
189
+ "TradeID",
190
+ "ValuationDate",
191
+ "IMModel",
192
+ "ProductClass",
193
+ "RiskType",
194
+ "Qualifier",
195
+ "Bucket",
196
+ "Label1",
197
+ "Label2",
198
+ "Amount",
199
+ "AmountCurrency",
200
+ "AmountUSD",
201
+ "PostRegulations",
202
+ "CollectRegulations",
203
+ "Notional",
204
+ "NotionalCurrency",
205
+ "CallPut",
206
+ )
207
+
208
+ # Mapping from CRIF column names to CRIFRecord field names
209
+ CRIF_COLUMN_MAPPING = {
210
+ "TradeID": "trade_id",
211
+ "ValuationDate": "valuation_date",
212
+ "IMModel": "im_model",
213
+ "ProductClass": "product_class",
214
+ "RiskType": "risk_type",
215
+ "Qualifier": "qualifier",
216
+ "Bucket": "bucket",
217
+ "Label1": "label1",
218
+ "Label2": "label2",
219
+ "Amount": "amount",
220
+ "AmountCurrency": "amount_currency",
221
+ "AmountUSD": "amount_usd",
222
+ "PostRegulations": "post_regulations",
223
+ "CollectRegulations": "collect_regulations",
224
+ "Notional": "notional",
225
+ "NotionalCurrency": "notional_currency",
226
+ "CallPut": "call_put",
227
+ }
228
+
229
+ # Required CRIF columns
230
+ CRIF_REQUIRED_COLUMNS = ("TradeID", "ValuationDate", "RiskType", "Qualifier", "Amount", "AmountCurrency")