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
quantark/simm/config.py
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SIMM Configuration Module.
|
|
3
|
+
|
|
4
|
+
This module provides configuration dataclasses for ISDA SIMM calculations.
|
|
5
|
+
"""
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from typing import Dict, Optional
|
|
9
|
+
|
|
10
|
+
from quantark.util.exceptions import ValidationError
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SIMMVersion(Enum):
|
|
14
|
+
"""ISDA SIMM version identifiers.
|
|
15
|
+
|
|
16
|
+
Different SIMM versions may have different risk weights and correlations.
|
|
17
|
+
"""
|
|
18
|
+
V2_5 = "2.5"
|
|
19
|
+
V2_6 = "2.6"
|
|
20
|
+
|
|
21
|
+
def __str__(self) -> str:
|
|
22
|
+
return self.value
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class SIMMConfig:
|
|
27
|
+
"""Configuration for SIMM calculation.
|
|
28
|
+
|
|
29
|
+
This class encapsulates all configuration parameters for SIMM calculations,
|
|
30
|
+
including version, calculation currency, component selection, and add-ons.
|
|
31
|
+
|
|
32
|
+
Attributes:
|
|
33
|
+
version: SIMM version (affects risk weights and correlations).
|
|
34
|
+
calculation_currency: Base currency for SIMM calculation (typically USD).
|
|
35
|
+
|
|
36
|
+
calculate_delta: Whether to calculate Delta margin.
|
|
37
|
+
calculate_vega: Whether to calculate Vega margin.
|
|
38
|
+
calculate_curvature: Whether to calculate Curvature margin.
|
|
39
|
+
calculate_base_corr: Whether to calculate Base Correlation margin.
|
|
40
|
+
|
|
41
|
+
ms_rates_fx: Product class multiplier for RatesFX (default 1.0).
|
|
42
|
+
ms_credit: Product class multiplier for Credit (default 1.0).
|
|
43
|
+
ms_equity: Product class multiplier for Equity (default 1.0).
|
|
44
|
+
ms_commodity: Product class multiplier for Commodity (default 1.0).
|
|
45
|
+
|
|
46
|
+
addon_fixed: Fixed add-on amount in calculation currency.
|
|
47
|
+
addon_factors: Per-trade or per-product add-on factors.
|
|
48
|
+
|
|
49
|
+
include_attribution: Include margin attribution in results.
|
|
50
|
+
include_bucket_detail: Include bucket-level detail in results.
|
|
51
|
+
|
|
52
|
+
Examples:
|
|
53
|
+
Basic SIMM configuration:
|
|
54
|
+
>>> config = SIMMConfig()
|
|
55
|
+
|
|
56
|
+
SIMM with specific version and currency:
|
|
57
|
+
>>> config = SIMMConfig(
|
|
58
|
+
... version=SIMMVersion.V2_6,
|
|
59
|
+
... calculation_currency="EUR"
|
|
60
|
+
... )
|
|
61
|
+
|
|
62
|
+
SIMM with add-ons:
|
|
63
|
+
>>> config = SIMMConfig(
|
|
64
|
+
... addon_fixed=1_000_000,
|
|
65
|
+
... addon_factors={"regulatory_addon": 0.05}
|
|
66
|
+
... )
|
|
67
|
+
|
|
68
|
+
Delta-only SIMM:
|
|
69
|
+
>>> config = SIMMConfig(
|
|
70
|
+
... calculate_delta=True,
|
|
71
|
+
... calculate_vega=False,
|
|
72
|
+
... calculate_curvature=False,
|
|
73
|
+
... calculate_base_corr=False
|
|
74
|
+
... )
|
|
75
|
+
"""
|
|
76
|
+
# SIMM version
|
|
77
|
+
version: SIMMVersion = SIMMVersion.V2_6
|
|
78
|
+
|
|
79
|
+
# Calculation currency
|
|
80
|
+
calculation_currency: str = "USD"
|
|
81
|
+
|
|
82
|
+
# Which components to calculate
|
|
83
|
+
calculate_delta: bool = True
|
|
84
|
+
calculate_vega: bool = True
|
|
85
|
+
calculate_curvature: bool = True
|
|
86
|
+
calculate_base_corr: bool = True
|
|
87
|
+
|
|
88
|
+
# Product class multipliers (default = 1.0)
|
|
89
|
+
ms_rates_fx: float = 1.0
|
|
90
|
+
ms_credit: float = 1.0
|
|
91
|
+
ms_equity: float = 1.0
|
|
92
|
+
ms_commodity: float = 1.0
|
|
93
|
+
|
|
94
|
+
# Add-on configuration
|
|
95
|
+
addon_fixed: float = 0.0
|
|
96
|
+
addon_factors: Dict[str, float] = field(default_factory=dict)
|
|
97
|
+
|
|
98
|
+
# Output options
|
|
99
|
+
include_attribution: bool = True
|
|
100
|
+
include_bucket_detail: bool = True
|
|
101
|
+
|
|
102
|
+
def __post_init__(self) -> None:
|
|
103
|
+
"""Validate configuration parameters."""
|
|
104
|
+
self._validate()
|
|
105
|
+
|
|
106
|
+
def _validate(self) -> None:
|
|
107
|
+
"""Validate configuration values."""
|
|
108
|
+
# Validate calculation currency
|
|
109
|
+
if not isinstance(self.calculation_currency, str) or len(self.calculation_currency) != 3:
|
|
110
|
+
raise ValidationError(
|
|
111
|
+
f"calculation_currency must be a 3-letter ISO currency code, "
|
|
112
|
+
f"got {self.calculation_currency!r}"
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# Validate multipliers are positive
|
|
116
|
+
for name, value in [
|
|
117
|
+
("ms_rates_fx", self.ms_rates_fx),
|
|
118
|
+
("ms_credit", self.ms_credit),
|
|
119
|
+
("ms_equity", self.ms_equity),
|
|
120
|
+
("ms_commodity", self.ms_commodity),
|
|
121
|
+
]:
|
|
122
|
+
if value <= 0:
|
|
123
|
+
raise ValidationError(
|
|
124
|
+
f"{name} must be positive, got {value}"
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
# Validate addon_fixed is non-negative
|
|
128
|
+
if self.addon_fixed < 0:
|
|
129
|
+
raise ValidationError(
|
|
130
|
+
f"addon_fixed must be non-negative, got {self.addon_fixed}"
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
# Validate addon_factors values are non-negative
|
|
134
|
+
for key, value in self.addon_factors.items():
|
|
135
|
+
if value < 0:
|
|
136
|
+
raise ValidationError(
|
|
137
|
+
f"addon_factors['{key}'] must be non-negative, got {value}"
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
def get_product_class_multiplier(self, product_class: str) -> float:
|
|
141
|
+
"""Get the multiplier for a product class.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
product_class: Product class name ("RatesFX", "Credit", "Equity", "Commodity").
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
The multiplier for the specified product class.
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
ValueError: If product_class is not recognized.
|
|
151
|
+
"""
|
|
152
|
+
mapping = {
|
|
153
|
+
"RatesFX": self.ms_rates_fx,
|
|
154
|
+
"Credit": self.ms_credit,
|
|
155
|
+
"Equity": self.ms_equity,
|
|
156
|
+
"Commodity": self.ms_commodity,
|
|
157
|
+
}
|
|
158
|
+
if product_class not in mapping:
|
|
159
|
+
raise ValueError(f"Unknown product class: {product_class}")
|
|
160
|
+
return mapping[product_class]
|
|
161
|
+
|
|
162
|
+
def with_version(self, version: SIMMVersion) -> "SIMMConfig":
|
|
163
|
+
"""Create a copy of this config with a different version.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
version: The SIMM version to use.
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
New SIMMConfig with the specified version.
|
|
170
|
+
"""
|
|
171
|
+
return SIMMConfig(
|
|
172
|
+
version=version,
|
|
173
|
+
calculation_currency=self.calculation_currency,
|
|
174
|
+
calculate_delta=self.calculate_delta,
|
|
175
|
+
calculate_vega=self.calculate_vega,
|
|
176
|
+
calculate_curvature=self.calculate_curvature,
|
|
177
|
+
calculate_base_corr=self.calculate_base_corr,
|
|
178
|
+
ms_rates_fx=self.ms_rates_fx,
|
|
179
|
+
ms_credit=self.ms_credit,
|
|
180
|
+
ms_equity=self.ms_equity,
|
|
181
|
+
ms_commodity=self.ms_commodity,
|
|
182
|
+
addon_fixed=self.addon_fixed,
|
|
183
|
+
addon_factors=dict(self.addon_factors),
|
|
184
|
+
include_attribution=self.include_attribution,
|
|
185
|
+
include_bucket_detail=self.include_bucket_detail,
|
|
186
|
+
)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SIMM CRIF Module.
|
|
3
|
+
|
|
4
|
+
This module provides CRIF (Common Risk Interchange Format) data models
|
|
5
|
+
and parsing utilities for ISDA SIMM.
|
|
6
|
+
"""
|
|
7
|
+
from .models import (
|
|
8
|
+
CRIFHeader,
|
|
9
|
+
CRIFRecord,
|
|
10
|
+
CRIF_COLUMNS,
|
|
11
|
+
CRIF_COLUMN_MAPPING,
|
|
12
|
+
CRIF_REQUIRED_COLUMNS,
|
|
13
|
+
)
|
|
14
|
+
from .parser import (
|
|
15
|
+
CRIFValidationError,
|
|
16
|
+
crif_to_sensitivities,
|
|
17
|
+
parse_crif_csv,
|
|
18
|
+
sensitivities_to_crif,
|
|
19
|
+
write_crif_csv,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
# Models
|
|
24
|
+
"CRIFHeader",
|
|
25
|
+
"CRIFRecord",
|
|
26
|
+
"CRIF_COLUMNS",
|
|
27
|
+
"CRIF_COLUMN_MAPPING",
|
|
28
|
+
"CRIF_REQUIRED_COLUMNS",
|
|
29
|
+
# Parser
|
|
30
|
+
"CRIFValidationError",
|
|
31
|
+
"crif_to_sensitivities",
|
|
32
|
+
"parse_crif_csv",
|
|
33
|
+
"sensitivities_to_crif",
|
|
34
|
+
"write_crif_csv",
|
|
35
|
+
]
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CRIF Data Models.
|
|
3
|
+
|
|
4
|
+
This module defines the CRIF (Common Risk Interchange Format) data structures
|
|
5
|
+
for ISDA SIMM sensitivity exchange.
|
|
6
|
+
"""
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from datetime import date
|
|
9
|
+
from typing import Optional
|
|
10
|
+
|
|
11
|
+
from ..taxonomy import MarginType, ProductClass, RiskClass, SensitivityType
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class CRIFHeader:
|
|
16
|
+
"""CRIF file header metadata.
|
|
17
|
+
|
|
18
|
+
Contains information about the CRIF file including valuation date,
|
|
19
|
+
reporting entity, and file format version.
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
valuation_date: Date of valuation for the sensitivities.
|
|
23
|
+
reporting_entity: Legal entity identifier of the reporter.
|
|
24
|
+
counterparty: Counterparty legal entity identifier.
|
|
25
|
+
crif_version: CRIF format version (e.g., "2.0").
|
|
26
|
+
im_model: Initial margin model identifier (typically "SIMM").
|
|
27
|
+
base_currency: Base currency for amounts.
|
|
28
|
+
"""
|
|
29
|
+
valuation_date: date
|
|
30
|
+
reporting_entity: str = ""
|
|
31
|
+
counterparty: str = ""
|
|
32
|
+
crif_version: str = "2.0"
|
|
33
|
+
im_model: str = "SIMM"
|
|
34
|
+
base_currency: str = "USD"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass
|
|
38
|
+
class CRIFRecord:
|
|
39
|
+
"""Single CRIF record representing one sensitivity.
|
|
40
|
+
|
|
41
|
+
This dataclass follows the ISDA CRIF v2.x specification for
|
|
42
|
+
representing sensitivities in a standardized interchange format.
|
|
43
|
+
|
|
44
|
+
Attributes:
|
|
45
|
+
trade_id: Unique identifier for the trade.
|
|
46
|
+
valuation_date: Date of the valuation.
|
|
47
|
+
|
|
48
|
+
risk_type: SIMM risk type (e.g., "Risk_IRCurve", "Risk_FX").
|
|
49
|
+
qualifier: Primary risk factor identifier (currency for IR, issuer for Credit).
|
|
50
|
+
bucket: SIMM bucket assignment.
|
|
51
|
+
label1: First label (tenor for IR/Credit, empty for others).
|
|
52
|
+
label2: Second label (sub-curve for IR, empty for others).
|
|
53
|
+
|
|
54
|
+
amount: Sensitivity amount.
|
|
55
|
+
amount_currency: Currency of the amount.
|
|
56
|
+
amount_usd: Amount converted to USD (optional).
|
|
57
|
+
|
|
58
|
+
product_class: SIMM product class (optional, can be inferred).
|
|
59
|
+
risk_class: SIMM risk class (optional, can be inferred).
|
|
60
|
+
|
|
61
|
+
im_model: Initial margin model (typically "SIMM").
|
|
62
|
+
post_regulations: Posting regulations (e.g., "CFTC", "EMIR").
|
|
63
|
+
collect_regulations: Collection regulations.
|
|
64
|
+
|
|
65
|
+
call_put: "C" or "P" for options (optional).
|
|
66
|
+
notional: Trade notional (optional, for reference).
|
|
67
|
+
notional_currency: Currency of notional (optional).
|
|
68
|
+
|
|
69
|
+
Examples:
|
|
70
|
+
IR Delta sensitivity:
|
|
71
|
+
>>> record = CRIFRecord(
|
|
72
|
+
... trade_id="TRADE001",
|
|
73
|
+
... valuation_date=date(2024, 1, 15),
|
|
74
|
+
... risk_type="Risk_IRCurve",
|
|
75
|
+
... qualifier="USD",
|
|
76
|
+
... bucket="1",
|
|
77
|
+
... label1="5y",
|
|
78
|
+
... label2="OIS",
|
|
79
|
+
... amount=150000.0,
|
|
80
|
+
... amount_currency="USD"
|
|
81
|
+
... )
|
|
82
|
+
|
|
83
|
+
FX Delta sensitivity:
|
|
84
|
+
>>> record = CRIFRecord(
|
|
85
|
+
... trade_id="TRADE002",
|
|
86
|
+
... valuation_date=date(2024, 1, 15),
|
|
87
|
+
... risk_type="Risk_FX",
|
|
88
|
+
... qualifier="EURUSD",
|
|
89
|
+
... bucket="",
|
|
90
|
+
... label1="",
|
|
91
|
+
... label2="",
|
|
92
|
+
... amount=50000.0,
|
|
93
|
+
... amount_currency="USD"
|
|
94
|
+
... )
|
|
95
|
+
"""
|
|
96
|
+
# Required identification fields
|
|
97
|
+
trade_id: str
|
|
98
|
+
valuation_date: date
|
|
99
|
+
|
|
100
|
+
# SIMM classification
|
|
101
|
+
risk_type: str
|
|
102
|
+
qualifier: str
|
|
103
|
+
bucket: str
|
|
104
|
+
label1: str = ""
|
|
105
|
+
label2: str = ""
|
|
106
|
+
|
|
107
|
+
# Sensitivity value
|
|
108
|
+
amount: float = 0.0
|
|
109
|
+
amount_currency: str = "USD"
|
|
110
|
+
amount_usd: Optional[float] = None
|
|
111
|
+
|
|
112
|
+
# SIMM classification (optional, can be inferred)
|
|
113
|
+
product_class: Optional[str] = None
|
|
114
|
+
risk_class: Optional[str] = None
|
|
115
|
+
|
|
116
|
+
# Model and regulatory info
|
|
117
|
+
im_model: str = "SIMM"
|
|
118
|
+
post_regulations: Optional[str] = None
|
|
119
|
+
collect_regulations: Optional[str] = None
|
|
120
|
+
|
|
121
|
+
# Option-specific fields
|
|
122
|
+
call_put: Optional[str] = None
|
|
123
|
+
|
|
124
|
+
# Reference fields
|
|
125
|
+
notional: Optional[float] = None
|
|
126
|
+
notional_currency: Optional[str] = None
|
|
127
|
+
|
|
128
|
+
def get_sensitivity_type(self) -> Optional[SensitivityType]:
|
|
129
|
+
"""Get the SensitivityType enum from the risk_type string.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
SensitivityType if valid, None otherwise.
|
|
133
|
+
"""
|
|
134
|
+
for st in SensitivityType:
|
|
135
|
+
if st.value == self.risk_type:
|
|
136
|
+
return st
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
def get_risk_class(self) -> Optional[RiskClass]:
|
|
140
|
+
"""Infer the RiskClass from the risk_type.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
RiskClass if determinable, None otherwise.
|
|
144
|
+
"""
|
|
145
|
+
sensitivity_type = self.get_sensitivity_type()
|
|
146
|
+
if sensitivity_type:
|
|
147
|
+
return sensitivity_type.risk_class
|
|
148
|
+
return None
|
|
149
|
+
|
|
150
|
+
def get_margin_type(self) -> Optional[MarginType]:
|
|
151
|
+
"""Infer the MarginType from the risk_type.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
MarginType if determinable, None otherwise.
|
|
155
|
+
"""
|
|
156
|
+
sensitivity_type = self.get_sensitivity_type()
|
|
157
|
+
if sensitivity_type:
|
|
158
|
+
return sensitivity_type.margin_type
|
|
159
|
+
return None
|
|
160
|
+
|
|
161
|
+
def get_product_class(self) -> Optional[ProductClass]:
|
|
162
|
+
"""Infer or return the ProductClass.
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
ProductClass based on risk_class mapping.
|
|
166
|
+
"""
|
|
167
|
+
if self.product_class:
|
|
168
|
+
for pc in ProductClass:
|
|
169
|
+
if pc.value == self.product_class:
|
|
170
|
+
return pc
|
|
171
|
+
|
|
172
|
+
# Infer from risk class
|
|
173
|
+
risk_class = self.get_risk_class()
|
|
174
|
+
if risk_class:
|
|
175
|
+
mapping = {
|
|
176
|
+
RiskClass.INTEREST_RATE: ProductClass.RATES_FX,
|
|
177
|
+
RiskClass.FX: ProductClass.RATES_FX,
|
|
178
|
+
RiskClass.CREDIT_QUALIFYING: ProductClass.CREDIT,
|
|
179
|
+
RiskClass.CREDIT_NON_QUALIFYING: ProductClass.CREDIT,
|
|
180
|
+
RiskClass.EQUITY: ProductClass.EQUITY,
|
|
181
|
+
RiskClass.COMMODITY: ProductClass.COMMODITY,
|
|
182
|
+
}
|
|
183
|
+
return mapping.get(risk_class)
|
|
184
|
+
return None
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
# Standard CRIF column names
|
|
188
|
+
CRIF_COLUMNS = (
|
|
189
|
+
"TradeID",
|
|
190
|
+
"ValuationDate",
|
|
191
|
+
"IMModel",
|
|
192
|
+
"ProductClass",
|
|
193
|
+
"RiskType",
|
|
194
|
+
"Qualifier",
|
|
195
|
+
"Bucket",
|
|
196
|
+
"Label1",
|
|
197
|
+
"Label2",
|
|
198
|
+
"Amount",
|
|
199
|
+
"AmountCurrency",
|
|
200
|
+
"AmountUSD",
|
|
201
|
+
"PostRegulations",
|
|
202
|
+
"CollectRegulations",
|
|
203
|
+
"Notional",
|
|
204
|
+
"NotionalCurrency",
|
|
205
|
+
"CallPut",
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# Mapping from CRIF column names to CRIFRecord field names
|
|
209
|
+
CRIF_COLUMN_MAPPING = {
|
|
210
|
+
"TradeID": "trade_id",
|
|
211
|
+
"ValuationDate": "valuation_date",
|
|
212
|
+
"IMModel": "im_model",
|
|
213
|
+
"ProductClass": "product_class",
|
|
214
|
+
"RiskType": "risk_type",
|
|
215
|
+
"Qualifier": "qualifier",
|
|
216
|
+
"Bucket": "bucket",
|
|
217
|
+
"Label1": "label1",
|
|
218
|
+
"Label2": "label2",
|
|
219
|
+
"Amount": "amount",
|
|
220
|
+
"AmountCurrency": "amount_currency",
|
|
221
|
+
"AmountUSD": "amount_usd",
|
|
222
|
+
"PostRegulations": "post_regulations",
|
|
223
|
+
"CollectRegulations": "collect_regulations",
|
|
224
|
+
"Notional": "notional",
|
|
225
|
+
"NotionalCurrency": "notional_currency",
|
|
226
|
+
"CallPut": "call_put",
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
# Required CRIF columns
|
|
230
|
+
CRIF_REQUIRED_COLUMNS = ("TradeID", "ValuationDate", "RiskType", "Qualifier", "Amount", "AmountCurrency")
|