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.
- quantark/__init__.py +3 -0
- quantark/_compat.py +150 -0
- quantark/asset/__init__.py +8 -0
- quantark/asset/bond/__init__.py +2 -0
- quantark/asset/bond/engine/__init__.py +44 -0
- quantark/asset/bond/engine/analytical/__init__.py +12 -0
- quantark/asset/bond/engine/analytical/black_engine.py +583 -0
- quantark/asset/bond/engine/analytical/bond_forward_engine.py +390 -0
- quantark/asset/bond/engine/analytical/bond_futures_engine.py +569 -0
- quantark/asset/bond/engine/convertible/__init__.py +12 -0
- quantark/asset/bond/engine/convertible/convertible_bond_engine.py +800 -0
- quantark/asset/bond/engine/discount/__init__.py +10 -0
- quantark/asset/bond/engine/discount/bond_discount_engine.py +517 -0
- quantark/asset/bond/engine/discount/frn_engine.py +913 -0
- quantark/asset/bond/engine/pde/__init__.py +14 -0
- quantark/asset/bond/engine/pde/convertible/__init__.py +21 -0
- quantark/asset/bond/engine/pde/convertible/jump_diffusion_engine.py +603 -0
- quantark/asset/bond/engine/pde/convertible/pde_params.py +59 -0
- quantark/asset/bond/engine/pde/convertible/tf_engine.py +546 -0
- quantark/asset/bond/engine/tree/__init__.py +14 -0
- quantark/asset/bond/engine/tree/convertible/__init__.py +21 -0
- quantark/asset/bond/engine/tree/convertible/binomial_engine.py +488 -0
- quantark/asset/bond/engine/tree/convertible/tree_params.py +72 -0
- quantark/asset/bond/engine/tree/convertible/trinomial_engine.py +1341 -0
- quantark/asset/bond/product/__init__.py +37 -0
- quantark/asset/bond/product/base_bond_product.py +114 -0
- quantark/asset/bond/product/convertible/__init__.py +16 -0
- quantark/asset/bond/product/convertible/convertible_bond.py +595 -0
- quantark/asset/bond/product/couponbond/__init__.py +12 -0
- quantark/asset/bond/product/couponbond/fixed_bond.py +285 -0
- quantark/asset/bond/product/couponbond/frn.py +538 -0
- quantark/asset/bond/product/forward/__init__.py +9 -0
- quantark/asset/bond/product/forward/base_bond_forward.py +92 -0
- quantark/asset/bond/product/forward/bond_forward.py +335 -0
- quantark/asset/bond/product/futures/__init__.py +8 -0
- quantark/asset/bond/product/futures/bond_futures.py +532 -0
- quantark/asset/bond/product/option/__init__.py +9 -0
- quantark/asset/bond/product/option/euro_short_term_bond_option.py +231 -0
- quantark/asset/bond/riskmeasures/__init__.py +13 -0
- quantark/asset/bond/riskmeasures/bond_greeks_calculator.py +484 -0
- quantark/asset/bond/schedule/__init__.py +21 -0
- quantark/asset/bond/schedule/cashflow.py +595 -0
- quantark/asset/equity/__init__.py +11 -0
- quantark/asset/equity/analysis/__init__.py +4 -0
- quantark/asset/equity/analysis/autocallable_path_analyzer.py +257 -0
- quantark/asset/equity/engine/__init__.py +84 -0
- quantark/asset/equity/engine/analytical/__init__.py +37 -0
- quantark/asset/equity/engine/analytical/american_option_engine.py +682 -0
- quantark/asset/equity/engine/analytical/asian_option_analytical_engine.py +1102 -0
- quantark/asset/equity/engine/analytical/barrier_analytical_engine.py +455 -0
- quantark/asset/equity/engine/analytical/black_scholes_engine.py +322 -0
- quantark/asset/equity/engine/analytical/deltaone_engine.py +340 -0
- quantark/asset/equity/engine/analytical/digital_option_engine.py +168 -0
- quantark/asset/equity/engine/analytical/double_barrier_option_engine.py +481 -0
- quantark/asset/equity/engine/analytical/double_sharkfin_option_analytical_engine.py +508 -0
- quantark/asset/equity/engine/analytical/one_touch_analytical_engine.py +302 -0
- quantark/asset/equity/engine/analytical/range_accrual_analytical_engine.py +396 -0
- quantark/asset/equity/engine/analytical/single_sharkfin_option_analytical_engine.py +229 -0
- quantark/asset/equity/engine/base_engine.py +137 -0
- quantark/asset/equity/engine/event_stats.py +85 -0
- quantark/asset/equity/engine/mc/__init__.py +31 -0
- quantark/asset/equity/engine/mc/american_option_mc_engine.py +485 -0
- quantark/asset/equity/engine/mc/asian_option_mc_engine.py +678 -0
- quantark/asset/equity/engine/mc/barrier_option_mc_engine.py +726 -0
- quantark/asset/equity/engine/mc/digital_option_mc_engine.py +419 -0
- quantark/asset/equity/engine/mc/double_sharkfin_option_mc_engine.py +676 -0
- quantark/asset/equity/engine/mc/euro_mc_engine.py +423 -0
- quantark/asset/equity/engine/mc/phoenix_mc_engine.py +1206 -0
- quantark/asset/equity/engine/mc/range_accrual_mc_engine.py +738 -0
- quantark/asset/equity/engine/mc/single_sharkfin_option_mc_engine.py +549 -0
- quantark/asset/equity/engine/mc/snowball_mc_engine.py +2250 -0
- quantark/asset/equity/engine/pde/__init__.py +36 -0
- quantark/asset/equity/engine/pde/american_pde_solver.py +211 -0
- quantark/asset/equity/engine/pde/barrier_pde_solver.py +692 -0
- quantark/asset/equity/engine/pde/base_pde_solver.py +994 -0
- quantark/asset/equity/engine/pde/double_barrier_pde_solver.py +510 -0
- quantark/asset/equity/engine/pde/double_one_touch_pde_solver.py +435 -0
- quantark/asset/equity/engine/pde/european_pde_solver.py +170 -0
- quantark/asset/equity/engine/pde/ko_reset_snowball_pde_solver.py +477 -0
- quantark/asset/equity/engine/pde/one_touch_pde_solver.py +439 -0
- quantark/asset/equity/engine/pde/phoenix_pde_solver.py +613 -0
- quantark/asset/equity/engine/pde/snowball_pde_solver.py +1810 -0
- quantark/asset/equity/engine/pde/spatial_grid.py +750 -0
- quantark/asset/equity/engine/pde/time_grid.py +308 -0
- quantark/asset/equity/engine/pde_engine.py +238 -0
- quantark/asset/equity/engine/quad/__init__.py +23 -0
- quantark/asset/equity/engine/quad/discrete_quad_engine.py +106 -0
- quantark/asset/equity/engine/quad/european_quad_engine.py +325 -0
- quantark/asset/equity/engine/quad/ko_reset_snowball_quad_engine.py +362 -0
- quantark/asset/equity/engine/quad/phoenix_quad_engine.py +614 -0
- quantark/asset/equity/engine/quad/quad_adapters.py +1260 -0
- quantark/asset/equity/engine/quad/quad_core.py +513 -0
- quantark/asset/equity/engine/quad/quad_math.py +219 -0
- quantark/asset/equity/engine/quad/snowball_quad_engine.py +1137 -0
- quantark/asset/equity/engine/validation/script/benchmark_check_american_analytical.py +117 -0
- quantark/asset/equity/engine/validation/script/benchmark_check_american_pde.py +114 -0
- quantark/asset/equity/engine/validation/script/benchmark_check_asian_analytical.py +440 -0
- quantark/asset/equity/engine/validation/script/benchmark_check_barrier_analytical.py +269 -0
- quantark/asset/equity/engine/validation/script/benchmark_check_barrier_pde_solver.py +636 -0
- quantark/asset/equity/engine/validation/script/benchmark_check_digital_option.py +256 -0
- quantark/asset/equity/engine/validation/script/benchmark_check_snowball_pde_solver.py +807 -0
- quantark/asset/equity/engine/validation/script/boundary_check_american_analytical.py +290 -0
- quantark/asset/equity/engine/validation/script/boundary_check_american_pde.py +242 -0
- quantark/asset/equity/engine/validation/script/boundary_check_asian_analytical.py +612 -0
- quantark/asset/equity/engine/validation/script/boundary_check_barrier_analytical.py +434 -0
- quantark/asset/equity/engine/validation/script/boundary_check_barrier_pde_solver.py +748 -0
- quantark/asset/equity/engine/validation/script/boundary_check_digital_option.py +575 -0
- quantark/asset/equity/engine/validation/script/boundary_check_snowball_pde_solver.py +1101 -0
- quantark/asset/equity/engine/validation/script/greeks_check_digital_option.py +349 -0
- quantark/asset/equity/engine/validation/script/mc_comparison_barrier_pde.py +270 -0
- quantark/asset/equity/engine/validation/script/quick_mc_compare.py +51 -0
- quantark/asset/equity/engine/validation/script/validation_stepdown_improved.py +97 -0
- quantark/asset/equity/param/__init__.py +24 -0
- quantark/asset/equity/param/engine_param_profiles.py +325 -0
- quantark/asset/equity/param/engine_params.py +728 -0
- quantark/asset/equity/process/__init__.py +7 -0
- quantark/asset/equity/process/bsm/__init__.py +7 -0
- quantark/asset/equity/process/bsm/bsm_process.py +108 -0
- quantark/asset/equity/process/bsm/qmc_brownian_bridge.py +401 -0
- quantark/asset/equity/process/bsm/qmc_path_generator.py +694 -0
- quantark/asset/equity/process/bsm/qmc_rqmc_driver.py +163 -0
- quantark/asset/equity/process/bsm/qmc_sobol.py +195 -0
- quantark/asset/equity/process/bsm/qmc_variance_reduction.py +292 -0
- quantark/asset/equity/product/__init__.py +8 -0
- quantark/asset/equity/product/base_equity_product.py +72 -0
- quantark/asset/equity/product/deltaone/__init__.py +22 -0
- quantark/asset/equity/product/deltaone/base_deltaone_product.py +147 -0
- quantark/asset/equity/product/deltaone/futures.py +485 -0
- quantark/asset/equity/product/deltaone/spot_instrument.py +118 -0
- quantark/asset/equity/product/option/__init__.py +104 -0
- quantark/asset/equity/product/option/american_option.py +114 -0
- quantark/asset/equity/product/option/asian_option.py +531 -0
- quantark/asset/equity/product/option/barrier_option.py +289 -0
- quantark/asset/equity/product/option/base_equity_option.py +659 -0
- quantark/asset/equity/product/option/digital_option.py +102 -0
- quantark/asset/equity/product/option/double_barrier_option.py +286 -0
- quantark/asset/equity/product/option/double_one_touch_option.py +310 -0
- quantark/asset/equity/product/option/double_sharkfin_option.py +466 -0
- quantark/asset/equity/product/option/european_vanilla_option.py +103 -0
- quantark/asset/equity/product/option/ko_reset_snowball_option.py +563 -0
- quantark/asset/equity/product/option/observation_schedule.py +530 -0
- quantark/asset/equity/product/option/one_touch_option.py +287 -0
- quantark/asset/equity/product/option/phoenix_config.py +116 -0
- quantark/asset/equity/product/option/phoenix_helpers.py +576 -0
- quantark/asset/equity/product/option/phoenix_option.py +1167 -0
- quantark/asset/equity/product/option/range_accrual_config.py +288 -0
- quantark/asset/equity/product/option/range_accrual_helpers.py +608 -0
- quantark/asset/equity/product/option/range_accrual_option.py +526 -0
- quantark/asset/equity/product/option/single_sharkfin_option.py +420 -0
- quantark/asset/equity/product/option/snowball_config.py +261 -0
- quantark/asset/equity/product/option/snowball_helpers.py +977 -0
- quantark/asset/equity/product/option/snowball_option.py +1242 -0
- quantark/asset/equity/report/__init__.py +15 -0
- quantark/asset/equity/report/autocallable_risk_report.py +2118 -0
- quantark/asset/equity/report/plotting.py +87 -0
- quantark/asset/equity/report/snowball_risk_comparison_report.py +2230 -0
- quantark/asset/equity/report/surfaces.py +123 -0
- quantark/asset/equity/report/term_structure.py +126 -0
- quantark/asset/equity/riskmeasures/__init__.py +7 -0
- quantark/asset/equity/riskmeasures/greeks_calculator.py +1204 -0
- quantark/asset/rate/__init__.py +58 -0
- quantark/asset/rate/engine/__init__.py +25 -0
- quantark/asset/rate/engine/cap_floor_engine.py +514 -0
- quantark/asset/rate/engine/fra_engine.py +286 -0
- quantark/asset/rate/engine/irs_discount_engine.py +891 -0
- quantark/asset/rate/engine/swaption_engine.py +587 -0
- quantark/asset/rate/product/__init__.py +67 -0
- quantark/asset/rate/product/cap_floor.py +550 -0
- quantark/asset/rate/product/fra.py +219 -0
- quantark/asset/rate/product/irs.py +1223 -0
- quantark/asset/rate/product/swaption.py +372 -0
- quantark/backtest/__init__.py +153 -0
- quantark/backtest/base.py +263 -0
- quantark/backtest/dashboard.py +874 -0
- quantark/backtest/equity/__init__.py +35 -0
- quantark/backtest/equity/config.py +118 -0
- quantark/backtest/equity/engine.py +408 -0
- quantark/backtest/equity/hedge_executor.py +374 -0
- quantark/backtest/equity/metrics.py +396 -0
- quantark/backtest/equity/results.py +232 -0
- quantark/backtest/equity/state.py +252 -0
- quantark/backtest/examples/__init__.py +4 -0
- quantark/backtest/examples/advanced_backtest.py +345 -0
- quantark/backtest/examples/basic_delta_hedge.py +246 -0
- quantark/backtest/examples/fi_dv01_hedge.py +267 -0
- quantark/backtest/fi/__init__.py +30 -0
- quantark/backtest/fi/config.py +114 -0
- quantark/backtest/fi/engine.py +378 -0
- quantark/backtest/fi/hedge_executor.py +254 -0
- quantark/backtest/fi/metrics.py +308 -0
- quantark/backtest/fi/results.py +193 -0
- quantark/backtest/fi/state.py +212 -0
- quantark/backtest/logger.py +393 -0
- quantark/backtest/otc/__init__.py +74 -0
- quantark/backtest/otc/_replay.py +637 -0
- quantark/backtest/otc/book_engine.py +587 -0
- quantark/backtest/otc/config.py +175 -0
- quantark/backtest/otc/dashboard.py +1006 -0
- quantark/backtest/otc/engine.py +420 -0
- quantark/backtest/otc/engine_factory.py +138 -0
- quantark/backtest/otc/market.py +216 -0
- quantark/backtest/otc/results.py +107 -0
- quantark/backtest/otc/state.py +166 -0
- quantark/backtest/report_generator.py +608 -0
- quantark/backtest/strategy/__init__.py +28 -0
- quantark/backtest/strategy/base_strategy.py +235 -0
- quantark/backtest/strategy/convexity_neutral_strategy.py +247 -0
- quantark/backtest/strategy/delta_neutral_strategy.py +283 -0
- quantark/backtest/strategy/dv01_neutral_strategy.py +283 -0
- quantark/backtest/transaction_costs.py +485 -0
- quantark/backtest/visualizer.py +1019 -0
- quantark/cashleg/__init__.py +31 -0
- quantark/cashleg/accrual_leg.py +120 -0
- quantark/cashleg/base.py +48 -0
- quantark/cashleg/base_amount.py +60 -0
- quantark/cashleg/deterministic_leg.py +39 -0
- quantark/cashleg/event_distribution.py +262 -0
- quantark/cashleg/fixed_payoff_leg.py +92 -0
- quantark/cashleg/leg_schedule.py +95 -0
- quantark/cashleg/leg_valuator.py +40 -0
- quantark/dynamicscenario/__init__.py +97 -0
- quantark/dynamicscenario/base.py +297 -0
- quantark/dynamicscenario/config.py +122 -0
- quantark/dynamicscenario/engine.py +703 -0
- quantark/dynamicscenario/equity/__init__.py +14 -0
- quantark/dynamicscenario/fi/__init__.py +24 -0
- quantark/dynamicscenario/fi/config.py +149 -0
- quantark/dynamicscenario/fi/engine.py +500 -0
- quantark/dynamicscenario/fi/results.py +503 -0
- quantark/dynamicscenario/path/__init__.py +17 -0
- quantark/dynamicscenario/path/day_path.py +397 -0
- quantark/dynamicscenario/path/fi_path_library.py +488 -0
- quantark/dynamicscenario/path/path_builder.py +726 -0
- quantark/dynamicscenario/path/path_library.py +620 -0
- quantark/dynamicscenario/report/__init__.py +12 -0
- quantark/dynamicscenario/report/dynamic_report.py +1175 -0
- quantark/dynamicscenario/report/visualizer.py +1586 -0
- quantark/dynamicscenario/results/__init__.py +19 -0
- quantark/dynamicscenario/results/dynamic_results.py +579 -0
- quantark/dynamicscenario/results/result_exporter.py +438 -0
- quantark/param/__init__.py +75 -0
- quantark/param/basis/__init__.py +19 -0
- quantark/param/basis/basis_yield.py +301 -0
- quantark/param/div/__init__.py +16 -0
- quantark/param/div/dividend_yield.py +123 -0
- quantark/param/index/__init__.py +52 -0
- quantark/param/index/rate_index.py +568 -0
- quantark/param/quote/__init__.py +7 -0
- quantark/param/quote/spot_quote.py +35 -0
- quantark/param/rrf/__init__.py +22 -0
- quantark/param/rrf/rate_curve.py +436 -0
- quantark/param/vol/__init__.py +6 -0
- quantark/param/vol/vol_surface.py +118 -0
- quantark/portfolio/__init__.py +61 -0
- quantark/portfolio/base.py +203 -0
- quantark/portfolio/equity/__init__.py +17 -0
- quantark/portfolio/equity/portfolio.py +391 -0
- quantark/portfolio/equity/position.py +368 -0
- quantark/portfolio/fi/__init__.py +14 -0
- quantark/portfolio/fi/portfolio.py +424 -0
- quantark/portfolio/fi/position.py +272 -0
- quantark/portfolio/portfolio_snapshot.py +221 -0
- quantark/portfolio/portfolio_storage.py +414 -0
- quantark/priceenv/__init__.py +7 -0
- quantark/priceenv/pricing_environment.py +196 -0
- quantark/rfq/__init__.py +32 -0
- quantark/rfq/builders.py +102 -0
- quantark/rfq/models.py +214 -0
- quantark/rfq/registry.py +611 -0
- quantark/rfq/service.py +237 -0
- quantark/simm/__init__.py +155 -0
- quantark/simm/calibration/__init__.py +206 -0
- quantark/simm/calibration/accessors.py +439 -0
- quantark/simm/calibration/commodity.py +156 -0
- quantark/simm/calibration/credit_non_qualifying.py +79 -0
- quantark/simm/calibration/credit_qualifying.py +130 -0
- quantark/simm/calibration/cross_risk.py +39 -0
- quantark/simm/calibration/equity.py +125 -0
- quantark/simm/calibration/fx.py +92 -0
- quantark/simm/calibration/ir.py +152 -0
- quantark/simm/calibration/version.py +33 -0
- quantark/simm/config.py +186 -0
- quantark/simm/crif/__init__.py +35 -0
- quantark/simm/crif/models.py +230 -0
- quantark/simm/crif/parser.py +585 -0
- quantark/simm/engines/__init__.py +62 -0
- quantark/simm/engines/aggregation/__init__.py +67 -0
- quantark/simm/engines/aggregation/addon.py +141 -0
- quantark/simm/engines/aggregation/bucket_aggregator.py +298 -0
- quantark/simm/engines/aggregation/concentration.py +349 -0
- quantark/simm/engines/aggregation/product_class_aggregator.py +183 -0
- quantark/simm/engines/aggregation/risk_class_aggregator.py +403 -0
- quantark/simm/engines/aggregation/simm_calculator.py +430 -0
- quantark/simm/engines/aggregation/weighted_sensitivity.py +272 -0
- quantark/simm/engines/base.py +231 -0
- quantark/simm/engines/classification/__init__.py +10 -0
- quantark/simm/engines/classification/bucket_mapper.py +347 -0
- quantark/simm/engines/factory.py +137 -0
- quantark/simm/engines/portfolio_adapter.py +336 -0
- quantark/simm/engines/result.py +176 -0
- quantark/simm/engines/risk_class/__init__.py +18 -0
- quantark/simm/engines/risk_class/equity_engine.py +263 -0
- quantark/simm/engines/risk_class/ir_engine.py +264 -0
- quantark/simm/report/__init__.py +17 -0
- quantark/simm/report/crif_export.py +284 -0
- quantark/simm/report/excel_generator.py +401 -0
- quantark/simm/report/html_generator.py +840 -0
- quantark/simm/results/__init__.py +38 -0
- quantark/simm/results/attribution.py +313 -0
- quantark/simm/results/simm_result.py +339 -0
- quantark/simm/results/whatif.py +268 -0
- quantark/simm/sensitivity.py +533 -0
- quantark/simm/taxonomy.py +416 -0
- quantark/stresstest/__init__.py +67 -0
- quantark/stresstest/base.py +116 -0
- quantark/stresstest/config.py +5 -0
- quantark/stresstest/engine.py +5 -0
- quantark/stresstest/equity/__init__.py +17 -0
- quantark/stresstest/equity/config.py +69 -0
- quantark/stresstest/equity/engine.py +272 -0
- quantark/stresstest/equity/report/__init__.py +7 -0
- quantark/stresstest/equity/report/report_generator.py +423 -0
- quantark/stresstest/equity/report/visualizer.py +328 -0
- quantark/stresstest/equity/results.py +145 -0
- quantark/stresstest/fi/__init__.py +15 -0
- quantark/stresstest/fi/config.py +59 -0
- quantark/stresstest/fi/engine.py +213 -0
- quantark/stresstest/fi/metrics.py +60 -0
- quantark/stresstest/fi/results.py +64 -0
- quantark/stresstest/report/__init__.py +12 -0
- quantark/stresstest/report/report_generator.py +5 -0
- quantark/stresstest/report/visualizer.py +5 -0
- quantark/stresstest/results/__init__.py +16 -0
- quantark/stresstest/results/result_aggregator.py +325 -0
- quantark/stresstest/results/result_exporter.py +286 -0
- quantark/stresstest/results/stress_results.py +5 -0
- quantark/stresstest/scenario/__init__.py +13 -0
- quantark/stresstest/scenario/scenario.py +242 -0
- quantark/stresstest/scenario/scenario_builder.py +376 -0
- quantark/stresstest/scenario/scenario_library.py +435 -0
- quantark/stresstest/scenario/scenario_storage.py +224 -0
- quantark/stresstest/stress/__init__.py +13 -0
- quantark/stresstest/stress/stress_applicator.py +590 -0
- quantark/stresstest/stress/stress_types.py +142 -0
- quantark/util/__init__.py +23 -0
- quantark/util/barrier_shift.py +44 -0
- quantark/util/calendar/__init__.py +27 -0
- quantark/util/calendar/business_calendar.py +584 -0
- quantark/util/calendar/day_counter.py +517 -0
- quantark/util/calendar/holidayfile/china.csv +1920 -0
- quantark/util/calendar/holidayfile/china_sse.csv +1462 -0
- quantark/util/enum/__init__.py +81 -0
- quantark/util/enum/bond_enums.py +112 -0
- quantark/util/enum/deltaone_enums.py +16 -0
- quantark/util/enum/engine_enums.py +137 -0
- quantark/util/enum/greeks_enums.py +29 -0
- quantark/util/enum/option_enums.py +221 -0
- quantark/util/exceptions.py +66 -0
- quantark/util/marketdata/__init__.py +39 -0
- quantark/util/marketdata/adapter/base_adapter.py +203 -0
- quantark/util/marketdata/adapter/mock_adapter.py +265 -0
- quantark/util/marketdata/converter.py +289 -0
- quantark/util/marketdata/example_usage.py +314 -0
- quantark/util/marketdata/generator/__init__.py +7 -0
- quantark/util/marketdata/generator/mock_generator.py +466 -0
- quantark/util/marketdata/models.py +358 -0
- quantark/util/marketdata/storage/__init__.py +7 -0
- quantark/util/marketdata/storage/parquet_storage.py +340 -0
- quantark/util/numerical/__init__.py +98 -0
- quantark/util/numerical/comparison.py +219 -0
- quantark/util/numerical/constants.py +98 -0
- quantark/util/numerical/formatting.py +380 -0
- quantark/util/numerical/pnl.py +17 -0
- quantark/util/numerical/safe_math.py +238 -0
- quantark/util/numerical/validation.py +315 -0
- quantark/var/__init__.py +39 -0
- quantark/var/attribution.py +398 -0
- quantark/var/backtest/__init__.py +7 -0
- quantark/var/backtest/var_backtester.py +309 -0
- quantark/var/base.py +63 -0
- quantark/var/config.py +219 -0
- quantark/var/engines/__init__.py +13 -0
- quantark/var/engines/historical.py +925 -0
- quantark/var/engines/monte_carlo.py +870 -0
- quantark/var/engines/parametric.py +1199 -0
- quantark/var/results/__init__.py +16 -0
- quantark/var/results/incremental_var_result.py +131 -0
- quantark/var/results/var_report.py +346 -0
- quantark/var/results/var_result.py +134 -0
- quantark/var/risk_factors/__init__.py +22 -0
- quantark/var/risk_factors/base.py +41 -0
- quantark/var/risk_factors/equity_factors.py +158 -0
- quantark/var/risk_factors/fi_factors.py +99 -0
- quantark-0.1.0.dist-info/METADATA +351 -0
- quantark-0.1.0.dist-info/RECORD +399 -0
- quantark-0.1.0.dist-info/WHEEL +4 -0
- quantark-0.1.0.dist-info/licenses/LICENSE +202 -0
- quantark-0.1.0.dist-info/licenses/NOTICE +2 -0
- 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()})"
|