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,97 @@
1
+ """
2
+ Validation script for Stepdown Snowball using the improved ODE-based SpatialGrid.
3
+
4
+ This script verifies that the Stepdown Snowball (which has multiple closely spaced
5
+ barriers) is priced accurately by the PDE solver using the improved adaptive grid
6
+ logic in SpatialGrid.build_tavella_randall_multi.
7
+
8
+ Target: Error < 2% vs 500k path Monte Carlo.
9
+ """
10
+
11
+ import sys
12
+ import os
13
+ sys.path.insert(0, ".")
14
+
15
+ from datetime import datetime
16
+ import numpy as np
17
+
18
+ from quantark.asset.equity.product.option.snowball_helpers import create_stepdown_snowball
19
+ from quantark.asset.equity.engine.mc.snowball_mc_engine import SnowballMCEngine
20
+ from quantark.asset.equity.engine.pde.snowball_pde_solver import SnowballPDESolver
21
+ from quantark.asset.equity.param import MCParams, PDEParams
22
+ from quantark.priceenv import PricingEnvironment
23
+ from quantark.param import SpotQuote, FlatVolSurface, FlatRateCurve, ContinuousDividendYield
24
+ from quantark.util.enum import MonteCarloMethod
25
+
26
+ def validate_stepdown_pricing():
27
+ print("=" * 80)
28
+ print("Validation: Stepdown Snowball with Improved Adaptive Grid")
29
+ print("=" * 80)
30
+
31
+ # 1. Setup Product
32
+ # Stepdown Snowball: Barriers [103.0, 102.5, ..., 97.5]
33
+ S = 100.0
34
+ product = create_stepdown_snowball(
35
+ initial_price=S,
36
+ strike=100.0,
37
+ maturity=1.0,
38
+ contract_multiplier=10_000.0,
39
+ initial_ko_barrier=103.0,
40
+ stepdown_rate=0.005,
41
+ ki_barrier=75.0,
42
+ ko_rate=0.15
43
+ )
44
+
45
+ env = PricingEnvironment(
46
+ valuation_date=datetime(2025, 1, 1),
47
+ spot_quote=SpotQuote(S),
48
+ rate_curve=FlatRateCurve(0.03),
49
+ vol_surface=FlatVolSurface(0.20),
50
+ div_yield=ContinuousDividendYield(0.0)
51
+ )
52
+
53
+ # 2. Run Benchmark MC (500k paths)
54
+ print("\n[1/2] Running Benchmark Monte Carlo (500k paths)...")
55
+ mc_engine = SnowballMCEngine(
56
+ params=MCParams(num_paths=500000, seed=42),
57
+ method=MonteCarloMethod.QUASI
58
+ )
59
+ mc_price = mc_engine.price(product, env)
60
+ print(f" MC Price: {mc_price:,.2f}")
61
+
62
+ # 3. Run PDE with Auto Grid
63
+ print("\n[2/2] Running PDE with Auto Grid (Improved SpatialGrid)...")
64
+ # Using default grid_size=400, auto_grid=True
65
+ pde_solver = SnowballPDESolver(
66
+ params=PDEParams(grid_size=400, time_steps=300, auto_grid=True)
67
+ )
68
+ pde_price = pde_solver.price(product, env)
69
+ print(f" PDE Price: {pde_price:,.2f}")
70
+
71
+ # 4. Analyze Results
72
+ diff = pde_price - mc_price
73
+ rel_error = diff / mc_price
74
+
75
+ print("\nResults Analysis:")
76
+ print(f" Difference: {diff:,.2f}")
77
+ print(f" Rel Error: {rel_error:.2%}")
78
+
79
+ # Check grid quality implicitly by inspecting the object
80
+ # (Accessing protected members for validation report)
81
+ x_vec, s_vec, _, _, _ = pde_solver._build_grids(product, env, S, 0.20, 1.0, 0.03, 0.0)
82
+ barrier_min = min(product.barrier_config.ko_barrier)
83
+ barrier_max = max(product.barrier_config.ko_barrier)
84
+ points_in_barrier = len(s_vec[(s_vec >= barrier_min) & (s_vec <= barrier_max)])
85
+
86
+ print(f" Grid Points in Barrier Range [{barrier_min}, {barrier_max}]: {points_in_barrier}")
87
+
88
+ if abs(rel_error) < 0.02:
89
+ print("\n✅ PASSED: Error is within 2% tolerance.")
90
+ return True
91
+ else:
92
+ print("\n❌ FAILED: Error exceeds 2% tolerance.")
93
+ return False
94
+
95
+ if __name__ == "__main__":
96
+ success = validate_stepdown_pricing()
97
+ sys.exit(0 if success else 1)
@@ -0,0 +1,24 @@
1
+ """
2
+ Equity pricing parameters.
3
+ """
4
+ from .engine_params import EngineParams, MCParams, PDEParams, QuadParams, BumpConfig
5
+ from .engine_param_profiles import (
6
+ ENGINE_PARAM_PRESETS,
7
+ list_param_profiles,
8
+ make_engine_params,
9
+ make_pde_params,
10
+ make_quad_params,
11
+ )
12
+
13
+ __all__ = [
14
+ 'EngineParams',
15
+ 'MCParams',
16
+ 'PDEParams',
17
+ 'QuadParams',
18
+ 'BumpConfig',
19
+ 'ENGINE_PARAM_PRESETS',
20
+ 'list_param_profiles',
21
+ 'make_engine_params',
22
+ 'make_pde_params',
23
+ 'make_quad_params',
24
+ ]
@@ -0,0 +1,325 @@
1
+ """
2
+ Preset profiles and factory helpers for engine parameter objects.
3
+ """
4
+
5
+ from dataclasses import fields
6
+ import json
7
+ from pathlib import Path
8
+ from typing import Any, Dict, Mapping, Optional, Tuple, Union
9
+
10
+ from quantark.util.exceptions import ValidationError
11
+
12
+ from .engine_params import PDEParams, QuadParams
13
+
14
+ try:
15
+ import yaml
16
+ except ImportError: # pragma: no cover - optional dependency
17
+ yaml = None
18
+
19
+ ProfileMap = Dict[str, Dict[str, Any]]
20
+
21
+ _PROFILE_NAMES = (
22
+ "fast",
23
+ "balanced",
24
+ "accurate",
25
+ "barrier_sensitive",
26
+ "reverse_sensitive",
27
+ )
28
+
29
+ QUAD_PARAM_PRESETS: ProfileMap = {
30
+ "fast": {
31
+ "grid_points": 401,
32
+ "num_std_devs": 8.0,
33
+ "fft_padding_factor": 2,
34
+ "fft_filter_alpha": 12.0,
35
+ "fft_filter_power": 8,
36
+ },
37
+ "balanced": {},
38
+ "accurate": {
39
+ "grid_points": 1601,
40
+ "num_std_devs": 12.0,
41
+ "fft_padding_factor": 2,
42
+ "fft_filter_alpha": 18.0,
43
+ "fft_filter_power": 8,
44
+ },
45
+ "barrier_sensitive": {
46
+ "grid_points": 1201,
47
+ "num_std_devs": 10.0,
48
+ "fft_padding_factor": 2,
49
+ "fft_filter_alpha": 18.0,
50
+ "fft_filter_power": 8,
51
+ "event_smoothing_mode": "auto",
52
+ "event_smoothing_kernel": "cosine",
53
+ "event_smoothing_log_width": 0.002,
54
+ "align_priority": "auto",
55
+ },
56
+ "reverse_sensitive": {
57
+ "grid_points": 1201,
58
+ "num_std_devs": 10.0,
59
+ "fft_padding_factor": 2,
60
+ "fft_filter_alpha": 18.0,
61
+ "fft_filter_power": 8,
62
+ "align_priority": "ko",
63
+ "event_smoothing_mode": "reverse_aware",
64
+ "event_smoothing_kernel": "cosine",
65
+ },
66
+ }
67
+
68
+ PDE_PARAM_PRESETS: ProfileMap = {
69
+ "fast": {
70
+ "grid_size": 200,
71
+ "time_steps": 100,
72
+ "auto_grid": True,
73
+ },
74
+ "balanced": {},
75
+ "accurate": {
76
+ "grid_size": 800,
77
+ "time_steps": 400,
78
+ "auto_grid": True,
79
+ },
80
+ "barrier_sensitive": {
81
+ "grid_size": 600,
82
+ "time_steps": 300,
83
+ "auto_grid": True,
84
+ "log_dx_target": 0.002,
85
+ "barrier_refine_log_width": 0.02,
86
+ "barrier_refine_levels": 2,
87
+ "barrier_domain_expand": 0.1,
88
+ "event_steps_per_day": 6,
89
+ },
90
+ "reverse_sensitive": {
91
+ "grid_size": 600,
92
+ "time_steps": 300,
93
+ "auto_grid": True,
94
+ "log_dx_target": 0.002,
95
+ "barrier_refine_log_width": 0.03,
96
+ "barrier_refine_levels": 2,
97
+ "barrier_domain_expand": 0.15,
98
+ "event_steps_per_day": 6,
99
+ },
100
+ }
101
+
102
+ ENGINE_PARAM_PRESETS: Dict[str, ProfileMap] = {
103
+ "quad": QUAD_PARAM_PRESETS,
104
+ "pde": PDE_PARAM_PRESETS,
105
+ }
106
+
107
+
108
+ def list_param_profiles(engine: str) -> Tuple[str, ...]:
109
+ engine_key = _normalize_engine(engine)
110
+ return tuple(ENGINE_PARAM_PRESETS[engine_key].keys())
111
+
112
+
113
+ def make_quad_params(
114
+ profile: str = "balanced",
115
+ product: Optional[Any] = None,
116
+ reverse: bool = False,
117
+ **overrides: Any,
118
+ ) -> QuadParams:
119
+ profile_name = _normalize_profile("quad", profile)
120
+ preset = dict(QUAD_PARAM_PRESETS[profile_name])
121
+ preset = _apply_quad_product_hints(preset, product, reverse)
122
+ merged = _merge_overrides(preset, overrides, QuadParams)
123
+ return QuadParams(**merged)
124
+
125
+
126
+ def make_pde_params(
127
+ profile: str = "balanced",
128
+ product: Optional[Any] = None,
129
+ reverse: bool = False,
130
+ **overrides: Any,
131
+ ) -> PDEParams:
132
+ profile_name = _normalize_profile("pde", profile)
133
+ preset = dict(PDE_PARAM_PRESETS[profile_name])
134
+ preset = _apply_pde_product_hints(preset, product, reverse)
135
+ merged = _merge_overrides(preset, overrides, PDEParams)
136
+ return PDEParams(**merged)
137
+
138
+
139
+ def make_engine_params(
140
+ engine: str,
141
+ profile: str = "balanced",
142
+ product: Optional[Any] = None,
143
+ reverse: bool = False,
144
+ **overrides: Any,
145
+ ) -> Union[QuadParams, PDEParams]:
146
+ engine_key = _normalize_engine(engine)
147
+ if engine_key == "quad":
148
+ return make_quad_params(
149
+ profile=profile, product=product, reverse=reverse, **overrides
150
+ )
151
+ if engine_key == "pde":
152
+ return make_pde_params(
153
+ profile=profile, product=product, reverse=reverse, **overrides
154
+ )
155
+ raise ValidationError(
156
+ f"Unknown engine '{engine}'. Supported engines: {', '.join(ENGINE_PARAM_PRESETS)}"
157
+ )
158
+
159
+
160
+ def load_param_config(config_or_path: Union[Mapping[str, Any], str, Path]) -> Dict[str, Any]:
161
+ if isinstance(config_or_path, Mapping):
162
+ return dict(config_or_path)
163
+
164
+ path = Path(config_or_path)
165
+ if not path.exists():
166
+ raise ValidationError(f"Config path does not exist: {path}")
167
+
168
+ ext = path.suffix.lower()
169
+ if ext in (".yaml", ".yml"):
170
+ if yaml is None:
171
+ raise ValidationError("PyYAML is required to load YAML configs.")
172
+ with path.open("r", encoding="utf-8") as handle:
173
+ data = yaml.safe_load(handle)
174
+ elif ext == ".json":
175
+ with path.open("r", encoding="utf-8") as handle:
176
+ data = json.load(handle)
177
+ else:
178
+ raise ValidationError(
179
+ f"Unsupported config extension: {ext}. Use .yaml, .yml, or .json."
180
+ )
181
+
182
+ if data is None:
183
+ return {}
184
+ if not isinstance(data, dict):
185
+ raise ValidationError("Config must contain a top-level mapping.")
186
+ return data
187
+
188
+
189
+ def parse_profile_config(
190
+ config_or_path: Union[Mapping[str, Any], str, Path],
191
+ engine: str,
192
+ profile: Optional[str] = None,
193
+ reverse: Optional[bool] = None,
194
+ ) -> Tuple[str, Dict[str, Any], bool]:
195
+ data = load_param_config(config_or_path)
196
+ engine_key = _normalize_engine(engine)
197
+
198
+ config_engine = data.get("engine")
199
+ if config_engine is not None and str(config_engine).lower() != engine_key:
200
+ raise ValidationError(
201
+ f"Config engine '{config_engine}' does not match requested engine '{engine_key}'."
202
+ )
203
+
204
+ profile_name = profile or data.get("profile") or "balanced"
205
+ reverse_flag = reverse if reverse is not None else bool(data.get("reverse", False))
206
+
207
+ overrides = data.get("overrides")
208
+ if overrides is None:
209
+ overrides = data.get("params")
210
+ if overrides is None:
211
+ reserved = {"engine", "profile", "overrides", "params", "reverse"}
212
+ overrides = {k: v for k, v in data.items() if k not in reserved}
213
+
214
+ if overrides is None:
215
+ overrides = {}
216
+ if not isinstance(overrides, dict):
217
+ raise ValidationError("Config overrides must be a mapping.")
218
+
219
+ return str(profile_name), dict(overrides), reverse_flag
220
+
221
+
222
+ def _normalize_engine(engine: str) -> str:
223
+ if engine is None:
224
+ raise ValidationError("Engine must be provided.")
225
+ engine_key = str(engine).lower()
226
+ if engine_key not in ENGINE_PARAM_PRESETS:
227
+ raise ValidationError(
228
+ f"Unknown engine '{engine}'. Supported engines: {', '.join(ENGINE_PARAM_PRESETS)}"
229
+ )
230
+ return engine_key
231
+
232
+
233
+ def _normalize_profile(engine: str, profile: str) -> str:
234
+ engine_key = _normalize_engine(engine)
235
+ if profile is None:
236
+ return "balanced"
237
+ profile_key = str(profile).lower()
238
+ if profile_key not in ENGINE_PARAM_PRESETS[engine_key]:
239
+ profiles = ", ".join(sorted(ENGINE_PARAM_PRESETS[engine_key]))
240
+ raise ValidationError(
241
+ f"Unknown profile '{profile}'. Supported profiles: {profiles}"
242
+ )
243
+ return profile_key
244
+
245
+
246
+ def _merge_overrides(
247
+ preset: Dict[str, Any],
248
+ overrides: Mapping[str, Any],
249
+ param_cls: Any,
250
+ ) -> Dict[str, Any]:
251
+ merged = dict(preset)
252
+ if overrides:
253
+ _validate_keys(overrides, param_cls)
254
+ merged.update(overrides)
255
+ _validate_keys(merged, param_cls)
256
+ return merged
257
+
258
+
259
+ def _validate_keys(values: Mapping[str, Any], param_cls: Any) -> None:
260
+ allowed = {field.name for field in fields(param_cls)}
261
+ unknown = sorted(set(values) - allowed)
262
+ if unknown:
263
+ raise ValidationError(
264
+ f"Unknown parameter keys for {param_cls.__name__}: {', '.join(unknown)}"
265
+ )
266
+
267
+
268
+ def _apply_quad_product_hints(
269
+ preset: Dict[str, Any],
270
+ product: Optional[Any],
271
+ reverse: bool,
272
+ ) -> Dict[str, Any]:
273
+ reverse_flag = reverse or bool(getattr(product, "is_reverse", False))
274
+ if reverse_flag:
275
+ preset.setdefault("align_priority", "ko")
276
+ preset.setdefault("event_smoothing_mode", "reverse_aware")
277
+ return preset
278
+
279
+
280
+ def _apply_pde_product_hints(
281
+ preset: Dict[str, Any],
282
+ product: Optional[Any],
283
+ reverse: bool,
284
+ ) -> Dict[str, Any]:
285
+ reverse_flag = reverse or bool(getattr(product, "is_reverse", False))
286
+ has_barrier = _product_has_barrier(product)
287
+
288
+ if has_barrier:
289
+ preset.setdefault("barrier_refine_log_width", 0.02)
290
+ preset.setdefault("barrier_refine_levels", 1)
291
+ if reverse_flag:
292
+ preset.setdefault("barrier_domain_expand", 0.1)
293
+ preset.setdefault("barrier_refine_log_width", 0.03)
294
+
295
+ return preset
296
+
297
+
298
+ def _product_has_barrier(product: Optional[Any]) -> bool:
299
+ if product is None:
300
+ return False
301
+ barrier_fields = (
302
+ "barrier",
303
+ "upper_barrier",
304
+ "lower_barrier",
305
+ "barrier_low",
306
+ "barrier_high",
307
+ "ko_barrier",
308
+ "ki_barrier",
309
+ "coupon_barrier",
310
+ )
311
+ for name in barrier_fields:
312
+ if hasattr(product, name):
313
+ value = getattr(product, name)
314
+ if value is None:
315
+ continue
316
+ if isinstance(value, (int, float)):
317
+ if value > 0:
318
+ return True
319
+ elif isinstance(value, (list, tuple)):
320
+ if any(isinstance(v, (int, float)) and v > 0 for v in value):
321
+ return True
322
+ else:
323
+ return True
324
+ return False
325
+