financetoolkit 2.3.1__tar.gz → 2.3.3__tar.gz

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 (254) hide show
  1. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/.gitignore +193 -196
  2. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/PKG-INFO +7 -4
  3. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/README.md +4 -2
  4. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/cache/cache_controller.py +28 -16
  5. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/cache/policy_model.py +74 -3
  6. financetoolkit-2.3.3/financetoolkit/cache/serialization_model.py +526 -0
  7. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/cache/sqlite_model.py +37 -44
  8. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/currencies_model.py +0 -2
  9. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/discovery/discovery_controller.py +341 -55
  10. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/discovery/discovery_model.py +436 -29
  11. financetoolkit-2.3.3/financetoolkit/earnings_model.py +113 -0
  12. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/causal_inference_model.py +0 -2
  13. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/data_model.py +3 -3
  14. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/econometrics_controller.py +16 -22
  15. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/forecast_evaluation_model.py +2 -25
  16. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/hypothesis_testing_model.py +0 -2
  17. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/panel_data_model.py +0 -2
  18. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/regression_model.py +0 -2
  19. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/specification_tests_model.py +2 -6
  20. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/state_space_model.py +15 -14
  21. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/unitroot_model.py +3 -31
  22. financetoolkit-2.3.3/financetoolkit/economics/bea_model.py +67 -0
  23. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/bis_model.py +67 -0
  24. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/bls_model.py +32 -5
  25. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/cboe_model.py +4 -1
  26. financetoolkit-2.3.3/financetoolkit/economics/census_model.py +109 -0
  27. financetoolkit-2.3.3/financetoolkit/economics/dol_model.py +75 -0
  28. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/economics_controller.py +787 -211
  29. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/fmp_model.py +6 -25
  30. financetoolkit-2.3.3/financetoolkit/economics/futures_model.py +263 -0
  31. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/gmdb_model.py +0 -9
  32. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/helpers.py +88 -0
  33. financetoolkit-2.3.3/financetoolkit/economics/nyfed_model.py +120 -0
  34. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/oecd_model.py +1 -4
  35. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/yfinance_model.py +8 -1
  36. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/etf/etf_controller.py +478 -12
  37. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/etf/etf_model.py +93 -0
  38. financetoolkit-2.3.3/financetoolkit/finra_model.py +311 -0
  39. financetoolkit-2.3.3/financetoolkit/fixedincome/bond_data_model.py +251 -0
  40. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/bond_model.py +6 -6
  41. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/curve_model.py +5 -15
  42. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/eiopa_model.py +3 -7
  43. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/fixedincome_controller.py +1902 -1835
  44. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/helpers.py +35 -0
  45. financetoolkit-2.3.3/financetoolkit/fixedincome/hqm_model.py +253 -0
  46. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/short_rate_model.py +0 -2
  47. financetoolkit-2.3.3/financetoolkit/fixedincome/treasurydirect_model.py +212 -0
  48. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/yieldcurve_model.py +2 -4
  49. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fmp_model.py +603 -44
  50. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fundamentals_model.py +0 -2
  51. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/helpers.py +304 -23
  52. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/historical_model.py +49 -34
  53. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/__main__.py +1 -1
  54. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/analytics_model.py +98 -10
  55. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/auth_model.py +444 -101
  56. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/coercion_model.py +61 -0
  57. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/config.yaml +190 -85
  58. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/diagnostics_model.py +9 -42
  59. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/formatting_model.py +74 -17
  60. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/inspection_controller.py +2 -7
  61. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/mcp_controller.py +208 -85
  62. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/mcpb/.mcpbignore +0 -1
  63. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/mcpb/README.md +7 -16
  64. financetoolkit-2.3.3/financetoolkit/mcp_server/mcpb/manifest.json +190 -0
  65. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/mcpb/pyproject.toml +2 -2
  66. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/provider_model.py +23 -4
  67. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/registry_controller.py +313 -106
  68. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/setup_model.py +197 -85
  69. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/tools_model.py +28 -3
  70. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/altman_model.py +115 -34
  71. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/beneish_model.py +0 -2
  72. financetoolkit-2.3.3/financetoolkit/models/chs_model.py +367 -0
  73. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/credit_model.py +0 -2
  74. financetoolkit-2.3.3/financetoolkit/models/damodaran_model.py +255 -0
  75. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/fulmer_model.py +11 -36
  76. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/grover_model.py +5 -3
  77. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/growth_model.py +88 -2
  78. financetoolkit-2.3.3/financetoolkit/models/helpers.py +338 -0
  79. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/intrinsic_model.py +178 -12
  80. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/models_controller.py +2296 -706
  81. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/ohlson_model.py +21 -15
  82. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/quality_model.py +49 -2
  83. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/springate_model.py +6 -4
  84. financetoolkit-2.3.3/financetoolkit/models/taffler_model.py +179 -0
  85. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/wacc_model.py +0 -2
  86. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/zmijewski_model.py +5 -3
  87. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/normalization/balance_yf.csv +1 -0
  88. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/normalization/statistics_yf.csv +1 -0
  89. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/normalization_model.py +25 -10
  90. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/binomial_trees_model.py +10 -3
  91. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/black_scholes_model.py +16 -44
  92. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/exotics_model.py +4 -22
  93. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/helpers.py +66 -11
  94. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/market_metrics_model.py +0 -2
  95. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/options_controller.py +346 -250
  96. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/options_model.py +9 -14
  97. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/risk_neutral_density_model.py +0 -2
  98. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/svi_model.py +0 -2
  99. financetoolkit-2.3.3/financetoolkit/performance/helpers.py +93 -0
  100. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/performance/performance_controller.py +1464 -64
  101. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/performance/performance_model.py +1199 -38
  102. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/attribution_model.py +61 -7
  103. financetoolkit-2.3.3/financetoolkit/portfolio/backtest_model.py +262 -0
  104. financetoolkit-2.3.3/financetoolkit/portfolio/construction_controller.py +4621 -0
  105. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/definition_model.py +0 -2
  106. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/helpers.py +0 -17
  107. financetoolkit-2.3.3/financetoolkit/portfolio/optimization_model.py +4010 -0
  108. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/overview_model.py +3 -4
  109. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/portfolio_controller.py +14 -35
  110. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/portfolio_model.py +0 -1
  111. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/ratios/efficiency_model.py +138 -0
  112. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/ratios/profitability_model.py +280 -0
  113. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/ratios/ratios_controller.py +8128 -4415
  114. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/ratios/solvency_model.py +255 -0
  115. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/ratios/valuation_model.py +225 -0
  116. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/cvar_model.py +2 -0
  117. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/garch_model.py +8 -4
  118. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/helpers.py +20 -20
  119. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/market_liquidity_model.py +7 -3
  120. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/realized_volatility_model.py +54 -12
  121. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/risk_controller.py +727 -79
  122. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/risk_model.py +336 -39
  123. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/var_model.py +5 -20
  124. financetoolkit-2.3.3/financetoolkit/technicals/pattern_model.py +579 -0
  125. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/technicals/technicals_controller.py +876 -657
  126. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/toolkit_controller.py +1074 -127
  127. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/utilities/error_model.py +6 -5
  128. financetoolkit-2.3.3/financetoolkit/utilities/factor_model.py +745 -0
  129. financetoolkit-2.3.3/financetoolkit/utilities/logger_model.py +127 -0
  130. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/utilities/requests_model.py +31 -12
  131. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/utilities/statistics_model.py +336 -19
  132. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/yfinance_model.py +112 -45
  133. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/pyproject.toml +17 -23
  134. financetoolkit-2.3.1/financetoolkit/cache/serialization_model.py +0 -160
  135. financetoolkit-2.3.1/financetoolkit/mcp_server/mcpb/build-mcpb.sh +0 -103
  136. financetoolkit-2.3.1/financetoolkit/mcp_server/mcpb/manifest.json +0 -190
  137. financetoolkit-2.3.1/financetoolkit/models/damodaran_model.py +0 -84
  138. financetoolkit-2.3.1/financetoolkit/models/helpers.py +0 -43
  139. financetoolkit-2.3.1/financetoolkit/performance/helpers.py +0 -86
  140. financetoolkit-2.3.1/financetoolkit/portfolio/construction_controller.py +0 -1548
  141. financetoolkit-2.3.1/financetoolkit/portfolio/optimization_model.py +0 -808
  142. financetoolkit-2.3.1/financetoolkit/utilities/logger_model.py +0 -58
  143. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/LICENSE.txt +0 -0
  144. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/__init__.py +0 -0
  145. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/cache/__init__.py +0 -0
  146. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/cache/coverage_model.py +0 -0
  147. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/cache/frame_model.py +0 -0
  148. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/cache/request_model.py +0 -0
  149. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/cache/ticker_model.py +0 -0
  150. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/discovery/__init__.py +0 -0
  151. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/__init__.py +0 -0
  152. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/causality_model.py +0 -0
  153. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/cointegration_model.py +0 -0
  154. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/diagnostics_model.py +0 -0
  155. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/event_study_model.py +0 -0
  156. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/fama_macbeth_model.py +0 -0
  157. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/pairs_trading_model.py +0 -0
  158. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/regime_model.py +0 -0
  159. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/econometrics/time_series_model.py +0 -0
  160. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/__init__.py +0 -0
  161. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/boe_model.py +0 -0
  162. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/boj_model.py +0 -0
  163. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/dnb_model.py +0 -0
  164. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/ecb_model.py +0 -0
  165. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/eex_model.py +0 -0
  166. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/esrb_model.py +0 -0
  167. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/eurostat_model.py +0 -0
  168. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/frb_model.py +0 -0
  169. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/fred_model.py +0 -0
  170. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/freddie_mac_model.py +0 -0
  171. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/ibge_model.py +0 -0
  172. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/imf_model.py +0 -0
  173. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/macrohistory_model.py +0 -0
  174. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/mof_model.py +0 -0
  175. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/nber_model.py +0 -0
  176. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/ngfs_model.py +0 -0
  177. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/ons_model.py +0 -0
  178. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/sbj_model.py +0 -0
  179. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/shiller_model.py +0 -0
  180. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/stoxx_model.py +0 -0
  181. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/economics/treasury_model.py +0 -0
  182. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/etf/__init__.py +0 -0
  183. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/__init__.py +0 -0
  184. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/boc_model.py +0 -0
  185. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/bundesbank_model.py +0 -0
  186. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/derivative_model.py +0 -0
  187. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/ecb_model.py +0 -0
  188. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/esma_model.py +0 -0
  189. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/euribor_model.py +0 -0
  190. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/fed_model.py +0 -0
  191. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/fiscaldata_model.py +0 -0
  192. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/fmp_model.py +0 -0
  193. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/fred_model.py +0 -0
  194. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/norgesbank_model.py +0 -0
  195. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/rba_model.py +0 -0
  196. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/fixedincome/riksbank_model.py +0 -0
  197. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/__init__.py +0 -0
  198. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/mcpb/LICENSE +0 -0
  199. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/mcpb/finance_toolkit_icon.png +0 -0
  200. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/series_model.py +0 -0
  201. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/static/apple-touch-icon.png +0 -0
  202. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/static/favicon-32.png +0 -0
  203. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/static/favicon.ico +0 -0
  204. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/mcp_server/stats_page_model.py +0 -0
  205. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/__init__.py +0 -0
  206. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/dupont_model.py +0 -0
  207. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/enterprise_model.py +0 -0
  208. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/eva_model.py +0 -0
  209. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/peers_model.py +0 -0
  210. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/models/piotroski_model.py +0 -0
  211. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/normalization/balance.csv +0 -0
  212. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/normalization/cash.csv +0 -0
  213. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/normalization/cash_yf.csv +0 -0
  214. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/normalization/income.csv +0 -0
  215. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/normalization/income_yf.csv +0 -0
  216. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/normalization/statistics.csv +0 -0
  217. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/__init__.py +0 -0
  218. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/options/greeks_model.py +0 -0
  219. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/performance/__init__.py +0 -0
  220. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/__init__.py +0 -0
  221. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/config.yaml +0 -0
  222. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/example_datasets/example_portfolio.csv +0 -0
  223. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/example_datasets/example_portfolio.xlsx +0 -0
  224. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/all_weather.yaml +0 -0
  225. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/balanced_60_40.yaml +0 -0
  226. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/barbell.yaml +0 -0
  227. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/bogleheads_three_fund.yaml +0 -0
  228. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/buffett_90_10.yaml +0 -0
  229. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/conservative_income.yaml +0 -0
  230. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/global_60_40.yaml +0 -0
  231. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/global_equity_growth.yaml +0 -0
  232. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/golden_butterfly.yaml +0 -0
  233. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/permanent_portfolio.yaml +0 -0
  234. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/small_cap_value_tilt.yaml +0 -0
  235. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/target_date_glidepath.yaml +0 -0
  236. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/portfolio/presets/us_equity_sectors.yaml +0 -0
  237. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/py.typed +0 -0
  238. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/ratios/__init__.py +0 -0
  239. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/ratios/helpers.py +0 -0
  240. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/ratios/liquidity_model.py +0 -0
  241. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/__init__.py +0 -0
  242. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/backtesting_model.py +0 -0
  243. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/copula_model.py +0 -0
  244. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/covar_model.py +0 -0
  245. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/risk/evar_model.py +0 -0
  246. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/technicals/__init__.py +0 -0
  247. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/technicals/breadth_model.py +0 -0
  248. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/technicals/momentum_model.py +0 -0
  249. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/technicals/overlap_model.py +0 -0
  250. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/technicals/seasonality_model.py +0 -0
  251. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/technicals/volatility_model.py +0 -0
  252. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/utilities/dataframe_model.py +0 -0
  253. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/utilities/excel_model.py +0 -0
  254. {financetoolkit-2.3.1 → financetoolkit-2.3.3}/financetoolkit/utilities/validation_model.py +0 -0
@@ -1,197 +1,194 @@
1
- # Finance Toolkit Ignored Files
2
- *.csv
3
- *.xlsx
4
- *.xls
5
- *.ipynb
6
- cached/
7
- debugging.py
8
- .planning/
9
-
10
- # Finance Toolkit Example Datasets
11
- !financetoolkit/portfolio/example_datasets/*.xlsx
12
- !financetoolkit/portfolio/example_datasets/*.csv
13
-
14
- # Finance Toolkit Normalization Files
15
- !financetoolkit/normalization/*.csv
16
-
17
- # Finance Toolkit Tests
18
- !tests/datasets/*.xlsx
19
- !tests/*/csv/*/*.csv
20
- !tests/csv/*/*.csv
21
-
22
- # VS Code
23
- .agents
24
- .vscode/
25
- .claude/
26
- *.sh
27
-
28
- # Claude
29
- CLAUDE.md
30
-
31
- # Specific files for the MCP Bundle
32
- !financetoolkit/mcp_server/mcpb/build-mcpb.sh
33
-
34
- # Byte-compiled / optimized / DLL files
35
- __pycache__/
36
- *.py[cod]
37
- *$py.class
38
- .DS_Store
39
- .ipynb_checkpoints/
40
- .DS_Store
41
-
42
- # C extensions
43
- *.so
44
-
45
- # Distribution / packaging
46
- .Python
47
- build/
48
- develop-eggs/
49
- dist/
50
- downloads/
51
- eggs/
52
- .eggs/
53
- lib/
54
- lib64/
55
- parts/
56
- sdist/
57
- var/
58
- wheels/
59
- share/python-wheels/
60
- *.egg-info/
61
- .installed.cfg
62
- *.egg
63
- MANIFEST
64
-
65
- # PyInstaller
66
- # Usually these files are written by a python script from a template
67
- # before PyInstaller builds the exe, so as to inject date/other infos into it.
68
- *.manifest
69
- *.spec
70
-
71
- # Installer logs
72
- pip-log.txt
73
- pip-delete-this-directory.txt
74
-
75
- # Unit test / coverage reports
76
- htmlcov/
77
- .tox/
78
- .nox/
79
- .coverage
80
- .coverage.*
81
- .cache
82
- nosetests.xml
83
- coverage.xml
84
- *.cover
85
- *.py,cover
86
- .hypothesis/
87
- .pytest_cache/
88
- cover/
89
-
90
- # Translations
91
- *.mo
92
- *.pot
93
-
94
- # Django stuff:
95
- *.log
96
- local_settings.py
97
- db.sqlite3
98
- db.sqlite3-journal
99
-
100
- # Flask stuff:
101
- instance/
102
- .webassets-cache
103
-
104
- # Scrapy stuff:
105
- .scrapy
106
-
107
- # Sphinx documentation
108
- docs/_build/
109
-
110
- # PyBuilder
111
- .pybuilder/
112
- target/
113
-
114
- # Jupyter Notebook
115
- .ipynb_checkpoints
116
-
117
- # IPython
118
- profile_default/
119
- ipython_config.py
120
-
121
- # pyenv
122
- # For a library or package, you might want to ignore these files since the code is
123
- # intended to run in multiple environments; otherwise, check them in:
124
- # .python-version
125
-
126
- # pipenv
127
- # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
128
- # However, in case of collaboration, if having platform-specific dependencies or dependencies
129
- # having no cross-platform support, pipenv may install dependencies that don't work, or not
130
- # install all needed dependencies.
131
- #Pipfile.lock
132
-
133
- # poetry
134
- # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
135
- # This is especially recommended for binary packages to ensure reproducibility, and is more
136
- # commonly ignored for libraries.
137
- # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
138
- #poetry.lock
139
-
140
- # pdm
141
- # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
142
- #pdm.lock
143
- # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
144
- # in version control.
145
- # https://pdm.fming.dev/#use-with-ide
146
- .pdm.toml
147
-
148
- # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
149
- __pypackages__/
150
-
151
- # Celery stuff
152
- celerybeat-schedule
153
- celerybeat.pid
154
-
155
- # SageMath parsed files
156
- *.sage.py
157
-
158
- # Environments
159
- .env
160
- .venv
161
- env/
162
- venv/
163
- ENV/
164
- env.bak/
165
- venv.bak/
166
-
167
- # Spyder project settings
168
- .spyderproject
169
- .spyproject
170
-
171
- # Rope project settings
172
- .ropeproject
173
-
174
- # mkdocs documentation
175
- /site
176
-
177
- # mypy
178
- .mypy_cache/
179
- .dmypy.json
180
- dmypy.json
181
-
182
- # Pyre type checker
183
- .pyre/
184
-
185
- # pytype static type analyzer
186
- .pytype/
187
-
188
- # Cython debug symbols
189
- cython_debug/
190
-
191
- # PyCharm
192
- # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
193
- # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
194
- # and can be added to the global gitignore or merged into this file. For a more nuclear
195
- # option (not recommended) you can uncomment the following to ignore the entire idea folder.
196
- #.idea/
1
+ # Finance Toolkit Ignored Files
2
+ *.csv
3
+ *.xlsx
4
+ *.xls
5
+ *.ipynb
6
+ cached/
7
+ debugging.py
8
+ .planning/
9
+
10
+ # Finance Toolkit Example Datasets
11
+ !financetoolkit/portfolio/example_datasets/*.xlsx
12
+ !financetoolkit/portfolio/example_datasets/*.csv
13
+
14
+ # Finance Toolkit Normalization Files
15
+ !financetoolkit/normalization/*.csv
16
+
17
+ # Finance Toolkit Tests
18
+ !tests/datasets/*.xlsx
19
+ !tests/*/csv/*/*.csv
20
+ !tests/csv/*/*.csv
21
+
22
+ # VS Code
23
+ .agents
24
+ .vscode/
25
+ .claude/
26
+ *.sh
27
+
28
+ # Claude
29
+ CLAUDE.md
30
+
31
+ # Byte-compiled / optimized / DLL files
32
+ __pycache__/
33
+ *.py[cod]
34
+ *$py.class
35
+ .DS_Store
36
+ .ipynb_checkpoints/
37
+ .DS_Store
38
+
39
+ # C extensions
40
+ *.so
41
+
42
+ # Distribution / packaging
43
+ .Python
44
+ build/
45
+ develop-eggs/
46
+ dist/
47
+ downloads/
48
+ eggs/
49
+ .eggs/
50
+ lib/
51
+ lib64/
52
+ parts/
53
+ sdist/
54
+ var/
55
+ wheels/
56
+ share/python-wheels/
57
+ *.egg-info/
58
+ .installed.cfg
59
+ *.egg
60
+ MANIFEST
61
+
62
+ # PyInstaller
63
+ # Usually these files are written by a python script from a template
64
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
65
+ *.manifest
66
+ *.spec
67
+
68
+ # Installer logs
69
+ pip-log.txt
70
+ pip-delete-this-directory.txt
71
+
72
+ # Unit test / coverage reports
73
+ htmlcov/
74
+ .tox/
75
+ .nox/
76
+ .coverage
77
+ .coverage.*
78
+ .cache
79
+ nosetests.xml
80
+ coverage.xml
81
+ *.cover
82
+ *.py,cover
83
+ .hypothesis/
84
+ .pytest_cache/
85
+ cover/
86
+
87
+ # Translations
88
+ *.mo
89
+ *.pot
90
+
91
+ # Django stuff:
92
+ *.log
93
+ local_settings.py
94
+ db.sqlite3
95
+ db.sqlite3-journal
96
+
97
+ # Flask stuff:
98
+ instance/
99
+ .webassets-cache
100
+
101
+ # Scrapy stuff:
102
+ .scrapy
103
+
104
+ # Sphinx documentation
105
+ docs/_build/
106
+
107
+ # PyBuilder
108
+ .pybuilder/
109
+ target/
110
+
111
+ # Jupyter Notebook
112
+ .ipynb_checkpoints
113
+
114
+ # IPython
115
+ profile_default/
116
+ ipython_config.py
117
+
118
+ # pyenv
119
+ # For a library or package, you might want to ignore these files since the code is
120
+ # intended to run in multiple environments; otherwise, check them in:
121
+ # .python-version
122
+
123
+ # pipenv
124
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
125
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
126
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
127
+ # install all needed dependencies.
128
+ #Pipfile.lock
129
+
130
+ # poetry
131
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
132
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
133
+ # commonly ignored for libraries.
134
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
135
+ #poetry.lock
136
+
137
+ # pdm
138
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
139
+ #pdm.lock
140
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
141
+ # in version control.
142
+ # https://pdm.fming.dev/#use-with-ide
143
+ .pdm.toml
144
+
145
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
146
+ __pypackages__/
147
+
148
+ # Celery stuff
149
+ celerybeat-schedule
150
+ celerybeat.pid
151
+
152
+ # SageMath parsed files
153
+ *.sage.py
154
+
155
+ # Environments
156
+ .env
157
+ .venv
158
+ env/
159
+ venv/
160
+ ENV/
161
+ env.bak/
162
+ venv.bak/
163
+
164
+ # Spyder project settings
165
+ .spyderproject
166
+ .spyproject
167
+
168
+ # Rope project settings
169
+ .ropeproject
170
+
171
+ # mkdocs documentation
172
+ /site
173
+
174
+ # mypy
175
+ .mypy_cache/
176
+ .dmypy.json
177
+ dmypy.json
178
+
179
+ # Pyre type checker
180
+ .pyre/
181
+
182
+ # pytype static type analyzer
183
+ .pytype/
184
+
185
+ # Cython debug symbols
186
+ cython_debug/
187
+
188
+ # PyCharm
189
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
190
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
191
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
192
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
193
+ #.idea/
197
194
  articles/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: financetoolkit
3
- Version: 2.3.1
3
+ Version: 2.3.3
4
4
  Summary: Transparent and Efficient Financial Analysis
5
5
  Project-URL: Homepage, https://www.jeroenbouma.com/projects/financetoolkit
6
6
  Project-URL: Documentation, https://www.jeroenbouma.com/projects/financetoolkit/docs
@@ -26,7 +26,7 @@ Requires-Dist: openpyxl>=3.1
26
26
  Requires-Dist: pandas>=3.0
27
27
  Requires-Dist: python-calamine>=0.3.0; python_full_version < '3.15'
28
28
  Requires-Dist: pyyaml>=6.0
29
- Requires-Dist: requests>=2.32
29
+ Requires-Dist: requests>=2.32.4
30
30
  Requires-Dist: scipy>=1.10
31
31
  Requires-Dist: xlrd>=2.0
32
32
  Requires-Dist: yfinance
@@ -34,6 +34,7 @@ Provides-Extra: econometrics
34
34
  Requires-Dist: linearmodels>=6.0; extra == 'econometrics'
35
35
  Requires-Dist: statsmodels>=0.14; extra == 'econometrics'
36
36
  Provides-Extra: mcp
37
+ Requires-Dist: cryptography>=42; extra == 'mcp'
37
38
  Requires-Dist: fastmcp>=3.4.2; extra == 'mcp'
38
39
  Requires-Dist: linearmodels>=6.0; extra == 'mcp'
39
40
  Requires-Dist: mcp[cli]<2,>=1.27.0; extra == 'mcp'
@@ -362,7 +363,7 @@ Options usually price more risk than follows, as their sellers want to be paid f
362
363
 
363
364
  All three are listed in the United States and valued on earnings that lie years ahead, which makes US inflation and interest rates the backdrop to their share prices. In 2022, the year the maximum drawdown above shows each of them falling by more than half, inflation reached 9% and the Federal Reserve raised its policy rate from 0.12% to 4.38%.
364
365
 
365
- The [economics](https://www.jeroenbouma.com/projects/financetoolkit/docs/economics) module covers 60+ countries with 50+ indicators, from GDP and unemployment to money supply and interest rates, and the [fixed income](https://www.jeroenbouma.com/projects/financetoolkit/docs/fixedincome) module adds bond yields, yield curves, central bank rates and bond and derivative valuations. Both are reached through the same Toolkit instance, or on their own with `from financetoolkit import Economics, FixedIncome`:
366
+ The [economics](https://www.jeroenbouma.com/projects/financetoolkit/docs/economics) module covers 60+ countries with 50+ indicators, from GDP and unemployment to money supply and interest rates, and the [fixed income](https://www.jeroenbouma.com/projects/financetoolkit/docs/fixedincome) module adds bond yields, yield curves, central bank rates and calculations on individual bonds. Both are reached through the same Toolkit instance, or on their own with `from financetoolkit import Economics, FixedIncome`:
366
367
 
367
368
  ```python
368
369
  # Inflation on the same month a year earlier and the Federal Reserve's policy rate
@@ -492,7 +493,7 @@ The three US funds and SMH largely hold the same companies, with SOXX and SMH sh
492
493
 
493
494
  ## Building a Diversified Portfolio
494
495
 
495
- A fund spreads the risk over the sector, but the sector still moves as one. The [portfolio](https://www.jeroenbouma.com/projects/financetoolkit/docs/portfolio-optimization) module builds portfolios from the tickers of any Toolkit: minimum variance, maximum Sharpe ratio, mean-variance, risk parity, Hierarchical Risk Parity, minimum CVaR and Black-Litterman weights, the efficient frontier, risk contributions, stress tests and attribution. Below the semiconductor fund is combined with health care (XLV), energy (XLE), long-term Treasuries (TLT) and gold (GLD):
496
+ A fund spreads the risk over the sector, but the sector still moves as one. The [portfolio](https://www.jeroenbouma.com/projects/financetoolkit/docs/portfolio-optimization) module builds portfolios from the tickers of any Toolkit: minimum variance, maximum Sharpe ratio, mean-variance, risk parity, Hierarchical Risk Parity, Hierarchical Equal Risk Contribution, Nested Clustered Optimization, minimum CVaR, minimum drawdown, maximum Omega and CVaR ratio, Black-Litterman, maximum diversification, minimum tracking error and growth optimal (Kelly) weights, the efficient frontier, risk contributions, stress tests and attribution. Below the semiconductor fund is combined with health care (XLV), energy (XLE), long-term Treasuries (TLT) and gold (GLD):
496
497
 
497
498
  ```python
498
499
  # Initialize the Toolkit for funds across sectors and asset classes from 2021 to 2025
@@ -744,6 +745,8 @@ Alternatively, if your company's root certificate is already installed in your o
744
745
 
745
746
  If none of this is possible, you can accept the risk and allow requests with an API key to be sent without verification by setting `FINANCETOOLKIT_ALLOW_UNVERIFIED_SSL=1` in the same way as above. Only do so on a network you trust: the connection is then encrypted to whoever answers it, which may not be the website you think you are talking to, and your API key is readable to them.
746
747
 
748
+ To go the other way and never send a request without verification, not even one without an API key, set `FINANCETOOLKIT_ALLOW_UNVERIFIED_SSL=0`. A hosted MCP server (the `sse` or `streamable-http` transport) does this by default, since the data it retrieves reaches every user through its cache.
749
+
747
750
  > **Are you part of FinancialModelingPrep?**
748
751
 
749
752
  *No, I am not*. I've merely picked them as the primary data provider given that they have a generous free tier and fair pricing compared to other providers. Therefore, any questions related to the data should go through [their contact form](https://site.financialmodelingprep.com/contact). When it comes to any type of ratios, performance metrics, risk metrics, technical indicators or economic indicators, feel free to reach out to me as this is my own work.
@@ -318,7 +318,7 @@ Options usually price more risk than follows, as their sellers want to be paid f
318
318
 
319
319
  All three are listed in the United States and valued on earnings that lie years ahead, which makes US inflation and interest rates the backdrop to their share prices. In 2022, the year the maximum drawdown above shows each of them falling by more than half, inflation reached 9% and the Federal Reserve raised its policy rate from 0.12% to 4.38%.
320
320
 
321
- The [economics](https://www.jeroenbouma.com/projects/financetoolkit/docs/economics) module covers 60+ countries with 50+ indicators, from GDP and unemployment to money supply and interest rates, and the [fixed income](https://www.jeroenbouma.com/projects/financetoolkit/docs/fixedincome) module adds bond yields, yield curves, central bank rates and bond and derivative valuations. Both are reached through the same Toolkit instance, or on their own with `from financetoolkit import Economics, FixedIncome`:
321
+ The [economics](https://www.jeroenbouma.com/projects/financetoolkit/docs/economics) module covers 60+ countries with 50+ indicators, from GDP and unemployment to money supply and interest rates, and the [fixed income](https://www.jeroenbouma.com/projects/financetoolkit/docs/fixedincome) module adds bond yields, yield curves, central bank rates and calculations on individual bonds. Both are reached through the same Toolkit instance, or on their own with `from financetoolkit import Economics, FixedIncome`:
322
322
 
323
323
  ```python
324
324
  # Inflation on the same month a year earlier and the Federal Reserve's policy rate
@@ -448,7 +448,7 @@ The three US funds and SMH largely hold the same companies, with SOXX and SMH sh
448
448
 
449
449
  ## Building a Diversified Portfolio
450
450
 
451
- A fund spreads the risk over the sector, but the sector still moves as one. The [portfolio](https://www.jeroenbouma.com/projects/financetoolkit/docs/portfolio-optimization) module builds portfolios from the tickers of any Toolkit: minimum variance, maximum Sharpe ratio, mean-variance, risk parity, Hierarchical Risk Parity, minimum CVaR and Black-Litterman weights, the efficient frontier, risk contributions, stress tests and attribution. Below the semiconductor fund is combined with health care (XLV), energy (XLE), long-term Treasuries (TLT) and gold (GLD):
451
+ A fund spreads the risk over the sector, but the sector still moves as one. The [portfolio](https://www.jeroenbouma.com/projects/financetoolkit/docs/portfolio-optimization) module builds portfolios from the tickers of any Toolkit: minimum variance, maximum Sharpe ratio, mean-variance, risk parity, Hierarchical Risk Parity, Hierarchical Equal Risk Contribution, Nested Clustered Optimization, minimum CVaR, minimum drawdown, maximum Omega and CVaR ratio, Black-Litterman, maximum diversification, minimum tracking error and growth optimal (Kelly) weights, the efficient frontier, risk contributions, stress tests and attribution. Below the semiconductor fund is combined with health care (XLV), energy (XLE), long-term Treasuries (TLT) and gold (GLD):
452
452
 
453
453
  ```python
454
454
  # Initialize the Toolkit for funds across sectors and asset classes from 2021 to 2025
@@ -700,6 +700,8 @@ Alternatively, if your company's root certificate is already installed in your o
700
700
 
701
701
  If none of this is possible, you can accept the risk and allow requests with an API key to be sent without verification by setting `FINANCETOOLKIT_ALLOW_UNVERIFIED_SSL=1` in the same way as above. Only do so on a network you trust: the connection is then encrypted to whoever answers it, which may not be the website you think you are talking to, and your API key is readable to them.
702
702
 
703
+ To go the other way and never send a request without verification, not even one without an API key, set `FINANCETOOLKIT_ALLOW_UNVERIFIED_SSL=0`. A hosted MCP server (the `sse` or `streamable-http` transport) does this by default, since the data it retrieves reaches every user through its cache.
704
+
703
705
  > **Are you part of FinancialModelingPrep?**
704
706
 
705
707
  *No, I am not*. I've merely picked them as the primary data provider given that they have a generous free tier and fair pricing compared to other providers. Therefore, any questions related to the data should go through [their contact form](https://site.financialmodelingprep.com/contact). When it comes to any type of ratios, performance metrics, risk metrics, technical indicators or economic indicators, feel free to reach out to me as this is my own work.
@@ -2,9 +2,11 @@
2
2
 
3
3
  __docformat__ = "google"
4
4
 
5
+ import contextlib
5
6
  import os
6
7
  import platform
7
8
  import time
9
+ import zlib
8
10
  from dataclasses import dataclass, field
9
11
  from datetime import date, datetime, timedelta
10
12
  from pathlib import Path
@@ -280,7 +282,7 @@ class Cache:
280
282
  if enabled:
281
283
  try:
282
284
  self._backend = SQLiteBackend(self._location)
283
- except Exception as error: # pylint: disable=broad-except
285
+ except Exception as error:
284
286
  # A cache is an optimization, so a database that cannot be opened just disables it.
285
287
  self._enabled = False
286
288
 
@@ -317,7 +319,7 @@ class Cache:
317
319
  EVICTION_INTERVAL_SECONDS,
318
320
  excluded_sources=frozenset({policy_model.MCP}),
319
321
  )
320
- except Exception as error: # pylint: disable=broad-except
322
+ except Exception as error:
321
323
  # Eviction is housekeeping, so a failure here is not surfaced.
322
324
  logger.debug("Could not evict stale cache entries: %s", error)
323
325
  return
@@ -478,7 +480,7 @@ class Cache:
478
480
  ever_covered, fresh_covered, payload = self._backend.read_entity_state(
479
481
  key, entity, minimum_fetched_at
480
482
  )
481
- except Exception as error: # pylint: disable=broad-except
483
+ except Exception as error:
482
484
  # A read that fails mid-session is a cache miss, not a failed call.
483
485
  logger.debug(
484
486
  "Could not read cached %s.%s for %s: %s",
@@ -512,8 +514,8 @@ class Cache:
512
514
  plan.cached[entity] = frame_model.slice_frame(
513
515
  stored, start, end, date_axis
514
516
  )
515
- except Exception as error: # pylint: disable=broad-except
516
- # An unreadable payload is a miss: ask the source for the lot.
517
+ except Exception as error:
518
+ # An unreadable payload (one in another format, such as a pickle, is never read) is a miss: ask the source for the lot. # noqa: E501
517
519
  logger.debug(
518
520
  "Could not decode cached %s.%s for %s: %s",
519
521
  source,
@@ -523,6 +525,10 @@ class Cache:
523
525
  )
524
526
  plan.missing[entity] = [request]
525
527
 
528
+ # Removed with its coverage, so the rows fetched now are not recorded as merged with ranges that are no longer held. # noqa: E501
529
+ with contextlib.suppress(Exception):
530
+ self._backend.delete_entity(key, entity)
531
+
526
532
  return plan
527
533
 
528
534
  def store(
@@ -581,6 +587,10 @@ class Cache:
581
587
  coverage_start = min(coverage_start, bounds[0])
582
588
  coverage_end = max(coverage_end, bounds[1])
583
589
 
590
+ # A bar of a session that has not closed is a snapshot: the day stays uncovered, so the next call asks for it again. # noqa: E501
591
+ if policy_model.get_policy(source, dataset).settles_at_close:
592
+ coverage_end = min(coverage_end, policy_model.get_last_closed_session())
593
+
584
594
  if coverage_start <= coverage_end:
585
595
  coverage = (coverage_start, coverage_end)
586
596
 
@@ -595,11 +605,12 @@ class Cache:
595
605
  Returns:
596
606
  bytes: The payload to store in its place.
597
607
  """
598
- existing = (
599
- serialization_model.decode_dataframe(existing_payload)
600
- if existing_payload is not None
601
- else None
602
- )
608
+ existing = None
609
+
610
+ # A payload that can't be read (another format, such as a pickle) is replaced.
611
+ if existing_payload is not None:
612
+ with contextlib.suppress(ValueError, zlib.error):
613
+ existing = serialization_model.decode_dataframe(existing_payload)
603
614
 
604
615
  return serialization_model.encode_dataframe(
605
616
  frame_model.merge_frames(existing, data, date_axis)
@@ -616,7 +627,7 @@ class Cache:
616
627
  dataset=dataset,
617
628
  compaction_threshold=COVERAGE_COMPACTION_THRESHOLD,
618
629
  )
619
- except Exception as error: # pylint: disable=broad-except
630
+ except Exception as error:
620
631
  # A cache write must never break the call that produced the data.
621
632
  logger.debug(
622
633
  "Could not cache %s.%s for %s: %s", source, dataset, entity, error
@@ -672,7 +683,7 @@ class Cache:
672
683
  return None
673
684
 
674
685
  return serialization_model.decode_object(payload)
675
- except Exception as error: # pylint: disable=broad-except
686
+ except Exception as error:
676
687
  # Any read failure is reported as a miss, so the caller falls back to the source.
677
688
  logger.debug(
678
689
  "Could not read cached %s.%s for %s: %s", source, dataset, entity, error
@@ -695,7 +706,8 @@ class Cache:
695
706
  source (str): The external data source.
696
707
  dataset (str): The dataset within that source.
697
708
  entity (str): The entity the data belongs to.
698
- data (Any): The value to store. Any picklable object is accepted.
709
+ data (Any): The value to store: a DataFrame, Series or Index, a scalar, or a
710
+ list, tuple or dictionary of these (see serialization_model.encode_object).
699
711
  parameters (dict[str, Any] | None): Parameters that change the data.
700
712
  """
701
713
  if not self.serves(source):
@@ -711,7 +723,7 @@ class Cache:
711
723
  source=source,
712
724
  dataset=dataset,
713
725
  )
714
- except Exception as error: # pylint: disable=broad-except
726
+ except Exception as error:
715
727
  logger.debug(
716
728
  "Could not cache %s.%s for %s: %s", source, dataset, entity, error
717
729
  )
@@ -792,7 +804,7 @@ class Cache:
792
804
 
793
805
  try:
794
806
  return self._backend.get_contents()
795
- except Exception as error: # pylint: disable=broad-except
807
+ except Exception as error:
796
808
  logger.warning("Could not read the cache contents: %s", error)
797
809
 
798
810
  return []
@@ -820,7 +832,7 @@ class Cache:
820
832
  return self._backend.remove_expired_entries(
821
833
  ttl, source=source, dataset=dataset
822
834
  )
823
- except Exception as error: # pylint: disable=broad-except
835
+ except Exception as error:
824
836
  # Eviction is housekeeping on a timer, so a failure here is not surfaced.
825
837
  logger.debug("Could not evict expired cache entries: %s", error)
826
838