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,390 @@
1
+ """
2
+ Pricing engine for bond forward contracts.
3
+ """
4
+
5
+ import math
6
+ from dataclasses import dataclass
7
+ from datetime import datetime
8
+ from typing import Dict, Optional
9
+
10
+ from quantark.asset.bond.product.forward.bond_forward import BondForward
11
+ from quantark.asset.bond.engine.discount.bond_discount_engine import BondDiscountEngine
12
+ from quantark.priceenv import PricingEnvironment
13
+ from quantark.util.exceptions import ValidationError, PricingError
14
+
15
+
16
+ @dataclass
17
+ class BondForwardResults:
18
+ """
19
+ Results from bond forward pricing.
20
+
21
+ Attributes:
22
+ forward_value: Mark-to-market value of the forward
23
+ forward_clean_price: Theoretical forward clean price
24
+ forward_dirty_price: Theoretical forward dirty price
25
+ invoice_price: Total invoice amount at delivery
26
+ spot_dirty_price: Current bond dirty price
27
+ spot_clean_price: Current bond clean price
28
+ accrued_at_spot: Accrued interest at valuation
29
+ accrued_at_delivery: Accrued interest at delivery
30
+ time_to_delivery: Time to delivery in years
31
+ implied_repo_rate: Implied repo rate (if forward price set)
32
+ """
33
+
34
+ forward_value: float
35
+ forward_clean_price: float
36
+ forward_dirty_price: float
37
+ invoice_price: float
38
+ spot_dirty_price: float
39
+ spot_clean_price: float
40
+ accrued_at_spot: float
41
+ accrued_at_delivery: float
42
+ time_to_delivery: float
43
+ implied_repo_rate: Optional[float] = None
44
+
45
+
46
+ class BondForwardEngine:
47
+ """
48
+ Pricing engine for bond forward contracts.
49
+
50
+ This engine prices bond forwards by:
51
+ 1. Pricing the underlying bond using BondDiscountEngine
52
+ 2. Calculating the forward price using cost-of-carry (repo rate)
53
+ 3. Computing the mark-to-market value vs contracted price
54
+
55
+ Greeks are calculated using finite difference bumping:
56
+ - DV01: Dollar value of 1 basis point rate move
57
+ - Modified Duration: Price sensitivity to yield
58
+ - Convexity: Second-order price sensitivity
59
+ - Repo Sensitivity: Sensitivity to repo rate changes
60
+
61
+ Attributes:
62
+ pricing_env: Pricing environment with market data
63
+ bond_engine: Underlying bond pricing engine
64
+ bump_size: Basis point bump for Greeks (default: 1bp)
65
+ """
66
+
67
+ def __init__(self, pricing_env: PricingEnvironment, bump_size: float = 0.0001):
68
+ """
69
+ Initialize bond forward engine.
70
+
71
+ Args:
72
+ pricing_env: Pricing environment with rate curve
73
+ bump_size: Bump size for finite difference Greeks (default: 1bp)
74
+ """
75
+ if pricing_env is None:
76
+ raise ValidationError("Pricing environment is required")
77
+
78
+ self.pricing_env = pricing_env
79
+ self.bond_engine = BondDiscountEngine(pricing_env)
80
+ self.bump_size = bump_size
81
+
82
+ def price(
83
+ self, forward: BondForward, valuation_date: Optional[datetime] = None
84
+ ) -> BondForwardResults:
85
+ """
86
+ Price a bond forward contract.
87
+
88
+ Args:
89
+ forward: Bond forward contract to price
90
+ valuation_date: Valuation date (default: pricing env date)
91
+
92
+ Returns:
93
+ BondForwardResults with pricing details
94
+
95
+ Raises:
96
+ PricingError: If pricing fails
97
+ """
98
+ if valuation_date is None:
99
+ valuation_date = self.pricing_env.valuation_date
100
+
101
+ # Check if expired
102
+ if forward.is_expired(valuation_date):
103
+ raise PricingError("Forward contract has expired")
104
+
105
+ # Price underlying bond
106
+ underlying = forward.underlying
107
+ spot_dirty_price = self.bond_engine.dirty_price(
108
+ underlying, valuation_date, valuation_date
109
+ )
110
+ spot_clean_price = self.bond_engine.clean_price(
111
+ underlying, valuation_date, valuation_date
112
+ )
113
+ accrued_at_spot = underlying.calculate_accrued_interest(valuation_date)
114
+
115
+ # Calculate forward prices
116
+ forward_dirty_price = forward.calculate_forward_dirty_price(
117
+ spot_dirty_price, valuation_date
118
+ )
119
+ forward_clean_price = forward.calculate_forward_clean_price(
120
+ spot_dirty_price, valuation_date
121
+ )
122
+ invoice_price = forward.calculate_invoice_price(
123
+ spot_dirty_price, valuation_date
124
+ )
125
+ accrued_at_delivery = forward.get_accrued_at_delivery()
126
+
127
+ # Time to delivery
128
+ time_to_delivery = forward.get_time_to_delivery(valuation_date)
129
+
130
+ # Discount factor from valuation to delivery
131
+ discount_factor = self.pricing_env.get_discount_factor(time_to_delivery)
132
+
133
+ # Calculate forward value
134
+ forward_value = forward.calculate_forward_value(
135
+ spot_dirty_price, valuation_date, discount_factor
136
+ )
137
+
138
+ # Implied repo rate if forward price is set
139
+ implied_repo = None
140
+ if forward.forward_price is not None:
141
+ implied_repo = forward.get_implied_repo_rate(
142
+ spot_dirty_price, forward.forward_price, valuation_date
143
+ )
144
+
145
+ return BondForwardResults(
146
+ forward_value=forward_value,
147
+ forward_clean_price=forward_clean_price,
148
+ forward_dirty_price=forward_dirty_price,
149
+ invoice_price=invoice_price,
150
+ spot_dirty_price=spot_dirty_price,
151
+ spot_clean_price=spot_clean_price,
152
+ accrued_at_spot=accrued_at_spot,
153
+ accrued_at_delivery=accrued_at_delivery,
154
+ time_to_delivery=time_to_delivery,
155
+ implied_repo_rate=implied_repo,
156
+ )
157
+
158
+ def calculate_greeks(
159
+ self, forward: BondForward, valuation_date: Optional[datetime] = None
160
+ ) -> Dict[str, float]:
161
+ """
162
+ Calculate Greeks for bond forward.
163
+
164
+ Greeks calculated:
165
+ - forward_value: Current mark-to-market value
166
+ - forward_clean_price: Theoretical forward clean price
167
+ - dv01: Dollar value of 1bp parallel shift in rates
168
+ - modified_duration: Effective modified duration
169
+ - convexity: Second-order rate sensitivity
170
+ - repo_sensitivity: Sensitivity to repo rate (per 1bp)
171
+ - carry: Daily carry (theta equivalent)
172
+
173
+ Args:
174
+ forward: Bond forward contract
175
+ valuation_date: Valuation date
176
+
177
+ Returns:
178
+ Dictionary of Greeks
179
+ """
180
+ if valuation_date is None:
181
+ valuation_date = self.pricing_env.valuation_date
182
+
183
+ # Base pricing
184
+ base_results = self.price(forward, valuation_date)
185
+
186
+ greeks = {
187
+ "forward_value": base_results.forward_value,
188
+ "forward_clean_price": base_results.forward_clean_price,
189
+ "forward_dirty_price": base_results.forward_dirty_price,
190
+ "spot_dirty_price": base_results.spot_dirty_price,
191
+ }
192
+
193
+ # DV01: Bump rates up by 1bp
194
+ greeks["dv01"] = self._calculate_dv01(forward, valuation_date, base_results)
195
+
196
+ # Modified Duration
197
+ greeks["modified_duration"] = self._calculate_modified_duration(
198
+ forward, valuation_date, base_results
199
+ )
200
+
201
+ # Convexity
202
+ greeks["convexity"] = self._calculate_convexity(
203
+ forward, valuation_date, base_results
204
+ )
205
+
206
+ # Repo sensitivity
207
+ greeks["repo_sensitivity"] = self._calculate_repo_sensitivity(
208
+ forward, valuation_date, base_results
209
+ )
210
+
211
+ # Carry (theta equivalent) - value change per day
212
+ greeks["carry"] = self._calculate_carry(forward, valuation_date, base_results)
213
+
214
+ return greeks
215
+
216
+ def _calculate_dv01(
217
+ self,
218
+ forward: BondForward,
219
+ valuation_date: datetime,
220
+ base_results: BondForwardResults,
221
+ ) -> float:
222
+ """Calculate DV01 using parallel rate bump."""
223
+ from quantark.param.rrf.rate_curve import FlatRateCurve
224
+
225
+ # Get base rate and create bumped curve
226
+ base_rate = self.pricing_env.rate_curve.get_rate(1.0)
227
+ bumped_rate = base_rate + self.bump_size
228
+ bumped_curve = FlatRateCurve(rate=bumped_rate)
229
+
230
+ env_up = PricingEnvironment(
231
+ rate_curve=bumped_curve,
232
+ valuation_date=self.pricing_env.valuation_date,
233
+ spot_quote=self.pricing_env.spot_quote,
234
+ vol_surface=self.pricing_env.vol_surface,
235
+ div_yield=self.pricing_env.div_yield,
236
+ )
237
+
238
+ engine_up = BondForwardEngine(env_up, self.bump_size)
239
+ results_up = engine_up.price(forward, valuation_date)
240
+
241
+ # DV01 = change in forward dirty price for 1bp rate increase
242
+ dv01 = base_results.forward_dirty_price - results_up.forward_dirty_price
243
+
244
+ return dv01
245
+
246
+ def _calculate_modified_duration(
247
+ self,
248
+ forward: BondForward,
249
+ valuation_date: datetime,
250
+ base_results: BondForwardResults,
251
+ ) -> float:
252
+ """Calculate modified duration of forward."""
253
+ if base_results.forward_dirty_price == 0:
254
+ return 0.0
255
+
256
+ dv01 = self._calculate_dv01(forward, valuation_date, base_results)
257
+
258
+ # Modified Duration = (DV01 / Price) / bump_size
259
+ # = DV01 / (Price * 0.0001) = DV01 * 10000 / Price
260
+ mod_dur = dv01 / (base_results.forward_dirty_price * self.bump_size)
261
+
262
+ return mod_dur
263
+
264
+ def _calculate_convexity(
265
+ self,
266
+ forward: BondForward,
267
+ valuation_date: datetime,
268
+ base_results: BondForwardResults,
269
+ ) -> float:
270
+ """Calculate convexity using central difference."""
271
+ from quantark.param.rrf.rate_curve import FlatRateCurve
272
+
273
+ if base_results.forward_dirty_price == 0:
274
+ return 0.0
275
+
276
+ # Get base rate
277
+ base_rate = self.pricing_env.rate_curve.get_rate(1.0)
278
+
279
+ # Bump up
280
+ bumped_rate_up = base_rate + self.bump_size
281
+ curve_up = FlatRateCurve(rate=bumped_rate_up)
282
+ env_up = PricingEnvironment(
283
+ rate_curve=curve_up,
284
+ valuation_date=self.pricing_env.valuation_date,
285
+ spot_quote=self.pricing_env.spot_quote,
286
+ vol_surface=self.pricing_env.vol_surface,
287
+ div_yield=self.pricing_env.div_yield,
288
+ )
289
+ engine_up = BondForwardEngine(env_up, self.bump_size)
290
+ results_up = engine_up.price(forward, valuation_date)
291
+
292
+ # Bump down
293
+ bumped_rate_down = base_rate - self.bump_size
294
+ curve_down = FlatRateCurve(rate=bumped_rate_down)
295
+ env_down = PricingEnvironment(
296
+ rate_curve=curve_down,
297
+ valuation_date=self.pricing_env.valuation_date,
298
+ spot_quote=self.pricing_env.spot_quote,
299
+ vol_surface=self.pricing_env.vol_surface,
300
+ div_yield=self.pricing_env.div_yield,
301
+ )
302
+ engine_down = BondForwardEngine(env_down, self.bump_size)
303
+ results_down = engine_down.price(forward, valuation_date)
304
+
305
+ # Convexity = (P_up - 2*P_base + P_down) / (P_base * bump^2)
306
+ price_up = results_up.forward_dirty_price
307
+ price_down = results_down.forward_dirty_price
308
+ price_base = base_results.forward_dirty_price
309
+
310
+ convexity = (price_up - 2 * price_base + price_down) / (
311
+ price_base * self.bump_size * self.bump_size
312
+ )
313
+
314
+ return convexity
315
+
316
+ def _calculate_repo_sensitivity(
317
+ self,
318
+ forward: BondForward,
319
+ valuation_date: datetime,
320
+ base_results: BondForwardResults,
321
+ ) -> float:
322
+ """Calculate sensitivity to repo rate (per 1bp)."""
323
+ from copy import deepcopy
324
+
325
+ # Create forward with bumped repo rate
326
+ forward_bumped = deepcopy(forward)
327
+ forward_bumped.repo_rate = forward.repo_rate + self.bump_size
328
+
329
+ results_up = self.price(forward_bumped, valuation_date)
330
+
331
+ # Sensitivity = change in forward price for 1bp repo increase
332
+ repo_sens = results_up.forward_dirty_price - base_results.forward_dirty_price
333
+
334
+ return repo_sens
335
+
336
+ def _calculate_carry(
337
+ self,
338
+ forward: BondForward,
339
+ valuation_date: datetime,
340
+ base_results: BondForwardResults,
341
+ ) -> float:
342
+ """Calculate daily carry (value change per day)."""
343
+ from datetime import timedelta
344
+
345
+ # Price forward one day forward
346
+ next_day = valuation_date + timedelta(days=1)
347
+
348
+ if forward.is_expired(next_day):
349
+ return 0.0
350
+
351
+ try:
352
+ results_next = self.price(forward, next_day)
353
+ carry = results_next.forward_value - base_results.forward_value
354
+ return carry
355
+ except PricingError:
356
+ return 0.0
357
+
358
+ def calculate_basis_point_value(
359
+ self, forward: BondForward, valuation_date: Optional[datetime] = None
360
+ ) -> float:
361
+ """
362
+ Calculate basis point value (BPV) of the forward.
363
+
364
+ BPV = DV01 * Contract Size / 100
365
+
366
+ Args:
367
+ forward: Bond forward contract
368
+ valuation_date: Valuation date
369
+
370
+ Returns:
371
+ Basis point value in dollars
372
+ """
373
+ if valuation_date is None:
374
+ valuation_date = self.pricing_env.valuation_date
375
+
376
+ base_results = self.price(forward, valuation_date)
377
+ dv01 = self._calculate_dv01(forward, valuation_date, base_results)
378
+
379
+ # Scale by contract size relative to underlying bond denominator.
380
+ denominator = forward.underlying.get_denominator()
381
+ if denominator <= 0:
382
+ raise ValidationError(
383
+ f"Denominator must be positive, got {denominator}"
384
+ )
385
+ bpv = dv01 * (forward.contract_size / denominator)
386
+
387
+ return bpv
388
+
389
+ def __repr__(self):
390
+ return f"BondForwardEngine(valuation_date={self.pricing_env.valuation_date.date()})"