financetoolkit 2.3.2__tar.gz → 2.3.4__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 (260) hide show
  1. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/PKG-INFO +11 -7
  2. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/README.md +8 -5
  3. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/cache_controller.py +36 -20
  4. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/frame_model.py +12 -2
  5. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/policy_model.py +31 -2
  6. financetoolkit-2.3.4/financetoolkit/cache/serialization_model.py +526 -0
  7. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/sqlite_model.py +37 -44
  8. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/currencies_model.py +0 -2
  9. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/discovery/discovery_controller.py +412 -79
  10. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/discovery/discovery_model.py +314 -36
  11. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/causal_inference_model.py +0 -2
  12. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/data_model.py +19 -4
  13. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/diagnostics_model.py +338 -0
  14. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/econometrics_controller.py +928 -23
  15. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/forecast_evaluation_model.py +2 -25
  16. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/hypothesis_testing_model.py +0 -2
  17. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/panel_data_model.py +0 -2
  18. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/regression_model.py +0 -2
  19. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/specification_tests_model.py +2 -6
  20. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/state_space_model.py +15 -14
  21. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/unitroot_model.py +7 -35
  22. financetoolkit-2.3.4/financetoolkit/economics/bea_model.py +67 -0
  23. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/bis_model.py +7 -0
  24. financetoolkit-2.3.4/financetoolkit/economics/bls_model.py +232 -0
  25. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/boe_model.py +20 -0
  26. financetoolkit-2.3.4/financetoolkit/economics/boj_model.py +206 -0
  27. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/cboe_model.py +4 -1
  28. financetoolkit-2.3.4/financetoolkit/economics/census_model.py +109 -0
  29. financetoolkit-2.3.4/financetoolkit/economics/dol_model.py +101 -0
  30. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/economics_controller.py +3291 -613
  31. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/eurostat_model.py +82 -8
  32. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/fmp_model.py +211 -25
  33. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/fred_model.py +94 -86
  34. financetoolkit-2.3.4/financetoolkit/economics/futures_model.py +263 -0
  35. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/gmdb_model.py +152 -23
  36. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/helpers.py +378 -19
  37. financetoolkit-2.3.4/financetoolkit/economics/imf_model.py +449 -0
  38. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/ngfs_model.py +2 -0
  39. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/oecd_model.py +4 -53
  40. financetoolkit-2.3.4/financetoolkit/economics/portwatch_model.py +189 -0
  41. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/sbj_model.py +2 -2
  42. financetoolkit-2.3.4/financetoolkit/economics/world_bank_model.py +96 -0
  43. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/yfinance_model.py +10 -1
  44. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/etf/etf_controller.py +146 -47
  45. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/finra_model.py +4 -4
  46. financetoolkit-2.3.4/financetoolkit/fixedincome/bond_data_model.py +303 -0
  47. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/bond_model.py +6 -6
  48. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/curve_model.py +5 -15
  49. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/derivative_model.py +4 -2
  50. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/eiopa_model.py +3 -7
  51. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/esma_model.py +2 -0
  52. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/fixedincome_controller.py +2703 -1948
  53. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/fmp_model.py +3 -2
  54. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/fred_model.py +45 -0
  55. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/helpers.py +35 -0
  56. financetoolkit-2.3.4/financetoolkit/fixedincome/hqm_model.py +253 -0
  57. financetoolkit-2.3.4/financetoolkit/fixedincome/loan_model.py +153 -0
  58. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/riksbank_model.py +3 -3
  59. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/short_rate_model.py +2 -4
  60. financetoolkit-2.3.4/financetoolkit/fixedincome/treasurydirect_model.py +214 -0
  61. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/yieldcurve_model.py +2 -4
  62. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fmp_model.py +422 -72
  63. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fundamentals_model.py +0 -2
  64. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/helpers.py +516 -24
  65. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/historical_model.py +45 -46
  66. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/__main__.py +1 -1
  67. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/analytics_model.py +100 -12
  68. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/auth_model.py +444 -101
  69. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/coercion_model.py +61 -0
  70. financetoolkit-2.3.4/financetoolkit/mcp_server/config.yaml +1171 -0
  71. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/diagnostics_model.py +11 -42
  72. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/formatting_model.py +249 -20
  73. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/inspection_controller.py +2 -7
  74. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcp_controller.py +198 -78
  75. financetoolkit-2.3.4/financetoolkit/mcp_server/mcpb/manifest.json +190 -0
  76. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcpb/pyproject.toml +2 -2
  77. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/provider_model.py +255 -109
  78. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/registry_controller.py +451 -112
  79. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/setup_model.py +91 -14
  80. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/tools_model.py +54 -4
  81. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/altman_model.py +124 -34
  82. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/beneish_model.py +0 -2
  83. financetoolkit-2.3.4/financetoolkit/models/chs_model.py +367 -0
  84. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/credit_model.py +11 -5
  85. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/fulmer_model.py +11 -36
  86. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/grover_model.py +5 -3
  87. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/growth_model.py +8 -5
  88. financetoolkit-2.3.4/financetoolkit/models/helpers.py +340 -0
  89. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/intrinsic_model.py +9 -10
  90. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/models_controller.py +1791 -959
  91. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/ohlson_model.py +21 -15
  92. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/quality_model.py +6 -2
  93. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/springate_model.py +6 -4
  94. financetoolkit-2.3.4/financetoolkit/models/taffler_model.py +179 -0
  95. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/wacc_model.py +27 -12
  96. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/zmijewski_model.py +5 -3
  97. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/balance_yf.csv +1 -0
  98. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/statistics_yf.csv +1 -0
  99. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization_model.py +42 -21
  100. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/binomial_trees_model.py +10 -3
  101. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/black_scholes_model.py +16 -44
  102. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/exotics_model.py +4 -22
  103. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/helpers.py +82 -18
  104. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/market_metrics_model.py +0 -2
  105. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/options_controller.py +580 -250
  106. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/options_model.py +13 -14
  107. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/risk_neutral_density_model.py +0 -2
  108. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/svi_model.py +1 -3
  109. financetoolkit-2.3.4/financetoolkit/performance/helpers.py +93 -0
  110. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/performance/performance_controller.py +934 -110
  111. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/performance/performance_model.py +627 -66
  112. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/attribution_model.py +61 -7
  113. financetoolkit-2.3.4/financetoolkit/portfolio/backtest_model.py +313 -0
  114. financetoolkit-2.3.4/financetoolkit/portfolio/construction_controller.py +4773 -0
  115. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/definition_model.py +0 -2
  116. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/helpers.py +2 -19
  117. financetoolkit-2.3.4/financetoolkit/portfolio/optimization_model.py +4009 -0
  118. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/overview_model.py +3 -4
  119. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/portfolio_controller.py +73 -50
  120. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/portfolio_model.py +7 -1
  121. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/efficiency_model.py +167 -0
  122. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/profitability_model.py +280 -0
  123. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/ratios_controller.py +8521 -4497
  124. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/solvency_model.py +255 -0
  125. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/valuation_model.py +289 -3
  126. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/copula_model.py +4 -3
  127. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/cvar_model.py +2 -0
  128. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/garch_model.py +8 -4
  129. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/helpers.py +20 -20
  130. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/market_liquidity_model.py +7 -3
  131. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/realized_volatility_model.py +54 -12
  132. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/risk_controller.py +458 -122
  133. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/risk_model.py +142 -56
  134. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/var_model.py +5 -20
  135. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/technicals_controller.py +416 -636
  136. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/toolkit_controller.py +663 -381
  137. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/dataframe_model.py +75 -4
  138. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/error_model.py +6 -5
  139. financetoolkit-2.3.4/financetoolkit/utilities/logger_model.py +145 -0
  140. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/requests_model.py +38 -12
  141. financetoolkit-2.3.4/financetoolkit/utilities/sources_model.py +358 -0
  142. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/statistics_model.py +293 -21
  143. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/yfinance_model.py +137 -37
  144. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/pyproject.toml +21 -26
  145. financetoolkit-2.3.2/financetoolkit/cache/serialization_model.py +0 -160
  146. financetoolkit-2.3.2/financetoolkit/economics/bls_model.py +0 -115
  147. financetoolkit-2.3.2/financetoolkit/economics/boj_model.py +0 -111
  148. financetoolkit-2.3.2/financetoolkit/economics/imf_model.py +0 -212
  149. financetoolkit-2.3.2/financetoolkit/mcp_server/config.yaml +0 -1046
  150. financetoolkit-2.3.2/financetoolkit/mcp_server/mcpb/manifest.json +0 -190
  151. financetoolkit-2.3.2/financetoolkit/models/helpers.py +0 -43
  152. financetoolkit-2.3.2/financetoolkit/performance/helpers.py +0 -86
  153. financetoolkit-2.3.2/financetoolkit/portfolio/construction_controller.py +0 -1659
  154. financetoolkit-2.3.2/financetoolkit/portfolio/optimization_model.py +0 -987
  155. financetoolkit-2.3.2/financetoolkit/utilities/logger_model.py +0 -58
  156. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/.gitignore +0 -0
  157. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/LICENSE.txt +0 -0
  158. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/__init__.py +0 -0
  159. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/__init__.py +0 -0
  160. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/coverage_model.py +0 -0
  161. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/request_model.py +0 -0
  162. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/ticker_model.py +0 -0
  163. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/discovery/__init__.py +0 -0
  164. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/earnings_model.py +0 -0
  165. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/__init__.py +0 -0
  166. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/causality_model.py +0 -0
  167. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/cointegration_model.py +0 -0
  168. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/event_study_model.py +0 -0
  169. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/fama_macbeth_model.py +0 -0
  170. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/pairs_trading_model.py +0 -0
  171. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/regime_model.py +0 -0
  172. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/time_series_model.py +0 -0
  173. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/__init__.py +0 -0
  174. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/dnb_model.py +0 -0
  175. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/ecb_model.py +0 -0
  176. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/eex_model.py +0 -0
  177. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/esrb_model.py +0 -0
  178. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/frb_model.py +0 -0
  179. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/freddie_mac_model.py +0 -0
  180. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/ibge_model.py +0 -0
  181. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/macrohistory_model.py +0 -0
  182. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/mof_model.py +0 -0
  183. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/nber_model.py +0 -0
  184. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/nyfed_model.py +0 -0
  185. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/ons_model.py +0 -0
  186. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/shiller_model.py +0 -0
  187. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/stoxx_model.py +0 -0
  188. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/treasury_model.py +0 -0
  189. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/etf/__init__.py +0 -0
  190. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/etf/etf_model.py +0 -0
  191. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/__init__.py +0 -0
  192. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/boc_model.py +0 -0
  193. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/bundesbank_model.py +0 -0
  194. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/ecb_model.py +0 -0
  195. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/euribor_model.py +0 -0
  196. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/fed_model.py +0 -0
  197. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/fiscaldata_model.py +0 -0
  198. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/norgesbank_model.py +0 -0
  199. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/rba_model.py +0 -0
  200. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/__init__.py +0 -0
  201. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcpb/.mcpbignore +0 -0
  202. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcpb/LICENSE +0 -0
  203. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcpb/README.md +0 -0
  204. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcpb/finance_toolkit_icon.png +0 -0
  205. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/series_model.py +0 -0
  206. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/static/apple-touch-icon.png +0 -0
  207. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/static/favicon-32.png +0 -0
  208. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/static/favicon.ico +0 -0
  209. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/stats_page_model.py +0 -0
  210. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/__init__.py +0 -0
  211. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/damodaran_model.py +0 -0
  212. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/dupont_model.py +0 -0
  213. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/enterprise_model.py +0 -0
  214. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/eva_model.py +0 -0
  215. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/peers_model.py +0 -0
  216. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/piotroski_model.py +0 -0
  217. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/balance.csv +0 -0
  218. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/cash.csv +0 -0
  219. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/cash_yf.csv +0 -0
  220. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/income.csv +0 -0
  221. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/income_yf.csv +0 -0
  222. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/statistics.csv +0 -0
  223. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/__init__.py +0 -0
  224. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/greeks_model.py +0 -0
  225. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/performance/__init__.py +0 -0
  226. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/__init__.py +0 -0
  227. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/config.yaml +0 -0
  228. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/example_datasets/example_portfolio.csv +0 -0
  229. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/example_datasets/example_portfolio.xlsx +0 -0
  230. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/all_weather.yaml +0 -0
  231. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/balanced_60_40.yaml +0 -0
  232. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/barbell.yaml +0 -0
  233. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/bogleheads_three_fund.yaml +0 -0
  234. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/buffett_90_10.yaml +0 -0
  235. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/conservative_income.yaml +0 -0
  236. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/global_60_40.yaml +0 -0
  237. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/global_equity_growth.yaml +0 -0
  238. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/golden_butterfly.yaml +0 -0
  239. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/permanent_portfolio.yaml +0 -0
  240. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/small_cap_value_tilt.yaml +0 -0
  241. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/target_date_glidepath.yaml +0 -0
  242. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/us_equity_sectors.yaml +0 -0
  243. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/py.typed +0 -0
  244. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/__init__.py +0 -0
  245. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/helpers.py +0 -0
  246. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/liquidity_model.py +0 -0
  247. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/__init__.py +0 -0
  248. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/backtesting_model.py +0 -0
  249. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/covar_model.py +0 -0
  250. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/evar_model.py +0 -0
  251. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/__init__.py +0 -0
  252. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/breadth_model.py +0 -0
  253. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/momentum_model.py +0 -0
  254. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/overlap_model.py +0 -0
  255. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/pattern_model.py +0 -0
  256. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/seasonality_model.py +0 -0
  257. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/volatility_model.py +0 -0
  258. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/excel_model.py +0 -0
  259. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/factor_model.py +0 -0
  260. {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/validation_model.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: financetoolkit
3
- Version: 2.3.2
3
+ Version: 2.3.4
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
@@ -584,7 +585,7 @@ https://github.com/user-attachments/assets/96ad5288-d83d-4497-a345-1841c48c29d5
584
585
 
585
586
  ### Remote server
586
587
 
587
- Connect directly to the hosted server at `https://financetoolkit.jeroenbouma.com/mcp`. Nothing needs to be installed locally. On first connection your client opens an OAuth consent page asking for your FMP API key; enter it once and the server handles authentication from there.
588
+ Connect directly to the hosted server at `https://financetoolkit.jeroenbouma.com/mcp`. Nothing needs to be installed locally. On first connection your client opens an OAuth consent page asking for your FMP API key (and, optionally, a FRED API key for the corporate bond series); enter it once and the server handles authentication from there.
588
589
 
589
590
  | Client | Steps |
590
591
  |:---|:---|
@@ -592,8 +593,8 @@ Connect directly to the hosted server at `https://financetoolkit.jeroenbouma.com
592
593
  | **Claude.ai** | Customize → Connectors → Add custom connector → paste the URL |
593
594
  | **Claude Code** | `claude mcp add --transport http finance-toolkit https://financetoolkit.jeroenbouma.com/mcp` |
594
595
  | **VS Code** | Command Palette → MCP: Add Server → HTTP → paste the URL |
595
- | **Cursor** | Settings → Features → MCP Servers → Add new → http → paste the URL |
596
- | **Windsurf** | Settings → MCP Servers → Add Server → Remote/HTTP → paste the URL |
596
+ | **Cursor** | Cursor Settings → Tools & MCP → New MCP Server → add `"finance-toolkit": { "url": "<URL>" }` |
597
+ | **Windsurf** | Cascade panel → MCPs → Configure → add `"finance-toolkit": { "serverUrl": "<URL>" }` and refresh |
597
598
 
598
599
  ### Local installation
599
600
 
@@ -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.
@@ -773,6 +776,7 @@ The Finance Toolkit has been mentioned in various blogposts, research papers, ne
773
776
  - [Fundamental Analysis using Muli-Agent System and Agentic RAG](https://connect.cfauk.org/HigherLogic/System/DownloadDocumentFile.ashx?DocumentFileKey=3ae6f3fc-593a-04ec-c3b8-be5643cab479&forceDialog=0)
774
777
 
775
778
  **Newsletters & Social Media**
779
+ - [Stack to Street podcast: Your AI Shouldn't Guess the Formula](https://www.stacktostreet.com/episodes/financetoolkit/)
776
780
  - [LinkedIn #1](https://www.linkedin.com/posts/jerry-liu-64390071_this-is-an-extremely-comprehensive-100-activity-7340897396471623681-plI4?utm_source=share&utm_medium=member_desktop&rcm=ACoAABhYAQUBkaNnlBjz_IYBRfaurU68rfoZPE8) and [Linkedin #2](https://www.linkedin.com/posts/pyquant-news_getting-clean-fundamental-data-used-to-be-activity-7314273012927651841-KXP3?utm_source=share&utm_medium=member_desktop&rcm=ACoAABhYAQUBkaNnlBjz_IYBRfaurU68rfoZPE8)
777
781
  - [Facebook](https://www.facebook.com/groups/techtitansgroup/posts/1515790739748239/)
778
782
  - [Quant Seeker](https://www.quantseeker.com/p/weekly-research-recap)
@@ -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
@@ -540,7 +540,7 @@ https://github.com/user-attachments/assets/96ad5288-d83d-4497-a345-1841c48c29d5
540
540
 
541
541
  ### Remote server
542
542
 
543
- Connect directly to the hosted server at `https://financetoolkit.jeroenbouma.com/mcp`. Nothing needs to be installed locally. On first connection your client opens an OAuth consent page asking for your FMP API key; enter it once and the server handles authentication from there.
543
+ Connect directly to the hosted server at `https://financetoolkit.jeroenbouma.com/mcp`. Nothing needs to be installed locally. On first connection your client opens an OAuth consent page asking for your FMP API key (and, optionally, a FRED API key for the corporate bond series); enter it once and the server handles authentication from there.
544
544
 
545
545
  | Client | Steps |
546
546
  |:---|:---|
@@ -548,8 +548,8 @@ Connect directly to the hosted server at `https://financetoolkit.jeroenbouma.com
548
548
  | **Claude.ai** | Customize → Connectors → Add custom connector → paste the URL |
549
549
  | **Claude Code** | `claude mcp add --transport http finance-toolkit https://financetoolkit.jeroenbouma.com/mcp` |
550
550
  | **VS Code** | Command Palette → MCP: Add Server → HTTP → paste the URL |
551
- | **Cursor** | Settings → Features → MCP Servers → Add new → http → paste the URL |
552
- | **Windsurf** | Settings → MCP Servers → Add Server → Remote/HTTP → paste the URL |
551
+ | **Cursor** | Cursor Settings → Tools & MCP → New MCP Server → add `"finance-toolkit": { "url": "<URL>" }` |
552
+ | **Windsurf** | Cascade panel → MCPs → Configure → add `"finance-toolkit": { "serverUrl": "<URL>" }` and refresh |
553
553
 
554
554
  ### Local installation
555
555
 
@@ -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.
@@ -729,6 +731,7 @@ The Finance Toolkit has been mentioned in various blogposts, research papers, ne
729
731
  - [Fundamental Analysis using Muli-Agent System and Agentic RAG](https://connect.cfauk.org/HigherLogic/System/DownloadDocumentFile.ashx?DocumentFileKey=3ae6f3fc-593a-04ec-c3b8-be5643cab479&forceDialog=0)
730
732
 
731
733
  **Newsletters & Social Media**
734
+ - [Stack to Street podcast: Your AI Shouldn't Guess the Formula](https://www.stacktostreet.com/episodes/financetoolkit/)
732
735
  - [LinkedIn #1](https://www.linkedin.com/posts/jerry-liu-64390071_this-is-an-extremely-comprehensive-100-activity-7340897396471623681-plI4?utm_source=share&utm_medium=member_desktop&rcm=ACoAABhYAQUBkaNnlBjz_IYBRfaurU68rfoZPE8) and [Linkedin #2](https://www.linkedin.com/posts/pyquant-news_getting-clean-fundamental-data-used-to-be-activity-7314273012927651841-KXP3?utm_source=share&utm_medium=member_desktop&rcm=ACoAABhYAQUBkaNnlBjz_IYBRfaurU68rfoZPE8)
733
736
  - [Facebook](https://www.facebook.com/groups/techtitansgroup/posts/1515790739748239/)
734
737
  - [Quant Seeker](https://www.quantseeker.com/p/weekly-research-recap)
@@ -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
@@ -20,7 +22,7 @@ from financetoolkit.cache import (
20
22
  serialization_model,
21
23
  )
22
24
  from financetoolkit.cache.sqlite_model import SCHEMA_VERSION, SQLiteBackend
23
- from financetoolkit.utilities import logger_model
25
+ from financetoolkit.utilities import logger_model, sources_model
24
26
 
25
27
  logger = logger_model.get_logger()
26
28
 
@@ -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
@@ -431,8 +433,8 @@ class Cache:
431
433
  parameters (dict[str, Any] | None): Parameters that change the data.
432
434
  date_axis (int): 0 when the index holds the dates, 1 when the columns do. Defaults to 0.
433
435
  reference_date (date | None): The date the revision window is measured
434
- back from when the requested range has no end or ends after it. Defaults to today;
435
- mainly useful for testing.
436
+ back from when the requested range has no end or ends after it. Defaults to None,
437
+ which uses today; mainly useful for testing.
436
438
 
437
439
  Returns:
438
440
  CachePlan: The cached data per entity and the gaps still to be fetched.
@@ -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,13 @@ 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
+
532
+ if plan.cached:
533
+ sources_model.record_source(source)
534
+
526
535
  return plan
527
536
 
528
537
  def store(
@@ -599,11 +608,12 @@ class Cache:
599
608
  Returns:
600
609
  bytes: The payload to store in its place.
601
610
  """
602
- existing = (
603
- serialization_model.decode_dataframe(existing_payload)
604
- if existing_payload is not None
605
- else None
606
- )
611
+ existing = None
612
+
613
+ # A payload that can't be read (another format, such as a pickle) is replaced.
614
+ if existing_payload is not None:
615
+ with contextlib.suppress(ValueError, zlib.error):
616
+ existing = serialization_model.decode_dataframe(existing_payload)
607
617
 
608
618
  return serialization_model.encode_dataframe(
609
619
  frame_model.merge_frames(existing, data, date_axis)
@@ -620,7 +630,7 @@ class Cache:
620
630
  dataset=dataset,
621
631
  compaction_threshold=COVERAGE_COMPACTION_THRESHOLD,
622
632
  )
623
- except Exception as error: # pylint: disable=broad-except
633
+ except Exception as error:
624
634
  # A cache write must never break the call that produced the data.
625
635
  logger.debug(
626
636
  "Could not cache %s.%s for %s: %s", source, dataset, entity, error
@@ -675,8 +685,13 @@ class Cache:
675
685
  if time.time() - updated_at > effective_ttl:
676
686
  return None
677
687
 
678
- return serialization_model.decode_object(payload)
679
- except Exception as error: # pylint: disable=broad-except
688
+ value = serialization_model.decode_object(payload)
689
+ # A cached MCP answer names the sources it was computed from itself.
690
+ if source != policy_model.MCP:
691
+ sources_model.record_source(source)
692
+
693
+ return value
694
+ except Exception as error:
680
695
  # Any read failure is reported as a miss, so the caller falls back to the source.
681
696
  logger.debug(
682
697
  "Could not read cached %s.%s for %s: %s", source, dataset, entity, error
@@ -699,7 +714,8 @@ class Cache:
699
714
  source (str): The external data source.
700
715
  dataset (str): The dataset within that source.
701
716
  entity (str): The entity the data belongs to.
702
- data (Any): The value to store. Any picklable object is accepted.
717
+ data (Any): The value to store: a DataFrame, Series or Index, a scalar, or a
718
+ list, tuple or dictionary of these (see serialization_model.encode_object).
703
719
  parameters (dict[str, Any] | None): Parameters that change the data.
704
720
  """
705
721
  if not self.serves(source):
@@ -715,7 +731,7 @@ class Cache:
715
731
  source=source,
716
732
  dataset=dataset,
717
733
  )
718
- except Exception as error: # pylint: disable=broad-except
734
+ except Exception as error:
719
735
  logger.debug(
720
736
  "Could not cache %s.%s for %s: %s", source, dataset, entity, error
721
737
  )
@@ -796,7 +812,7 @@ class Cache:
796
812
 
797
813
  try:
798
814
  return self._backend.get_contents()
799
- except Exception as error: # pylint: disable=broad-except
815
+ except Exception as error:
800
816
  logger.warning("Could not read the cache contents: %s", error)
801
817
 
802
818
  return []
@@ -824,7 +840,7 @@ class Cache:
824
840
  return self._backend.remove_expired_entries(
825
841
  ttl, source=source, dataset=dataset
826
842
  )
827
- except Exception as error: # pylint: disable=broad-except
843
+ except Exception as error:
828
844
  # Eviction is housekeeping on a timer, so a failure here is not surfaced.
829
845
  logger.debug("Could not evict expired cache entries: %s", error)
830
846
 
@@ -124,6 +124,10 @@ def slice_frame(
124
124
  the caller. Labels that cannot be parsed as dates are kept, which matters for
125
125
  statement frames that carry non-date columns alongside the reporting periods.
126
126
 
127
+ A period is kept when it overlaps the window, as a fresh request truncates it: a
128
+ start date of 31 December 2014 keeps the year 2014. A cached frame is then the same
129
+ as the one a fresh request returns, so no answer depends on what the cache holds.
130
+
127
131
  Args:
128
132
  data (pd.DataFrame | pd.Series): The frame to slice.
129
133
  start (str | date | None): Inclusive start of the window. None leaves it open.
@@ -147,9 +151,14 @@ def slice_frame(
147
151
  # is not a date.
148
152
  keep = vectorised.isna()
149
153
  within = np.ones(len(axis), dtype=bool)
154
+ last_days = (
155
+ axis.to_timestamp(how="end").normalize()
156
+ if isinstance(axis, pd.PeriodIndex)
157
+ else vectorised
158
+ )
150
159
 
151
160
  if start_date is not None:
152
- within &= vectorised >= pd.Timestamp(start_date)
161
+ within &= last_days >= pd.Timestamp(start_date)
153
162
  if end_date is not None:
154
163
  within &= vectorised <= pd.Timestamp(end_date)
155
164
 
@@ -167,7 +176,8 @@ def slice_frame(
167
176
  mask.append(True)
168
177
  continue
169
178
 
170
- within_start = start_date is None or label_date >= start_date
179
+ last_day = label.end_time.date() if isinstance(label, pd.Period) else label_date
180
+ within_start = start_date is None or last_day >= start_date
171
181
  within_end = end_date is None or label_date <= end_date
172
182
  mask.append(within_start and within_end)
173
183
 
@@ -28,6 +28,9 @@ STATISTICS_BUREAU_OF_JAPAN = "StatisticsBureauOfJapan"
28
28
  US_TREASURY = "USTreasury"
29
29
  BUREAU_OF_LABOR_STATISTICS = "BLS"
30
30
  FREDDIE_MAC = "FreddieMac"
31
+ DEPARTMENT_OF_LABOR = "DepartmentOfLabor"
32
+ CENSUS_BUREAU = "CensusBureau"
33
+ BUREAU_OF_ECONOMIC_ANALYSIS = "BEA"
31
34
  FEDERAL_RESERVE_BOARD = "FederalReserveBoard"
32
35
  NATIONAL_BUREAU_OF_ECONOMIC_RESEARCH = "NBER"
33
36
  IBGE = "IBGE"
@@ -38,6 +41,8 @@ NORGES_BANK = "NorgesBank"
38
41
  EIOPA = "EIOPA"
39
42
  INTERNATIONAL_MONETARY_FUND = "IMF"
40
43
  SHILLER = "Shiller"
44
+ WORLD_BANK = "WorldBank"
45
+ IMF_PORTWATCH = "IMFPortWatch"
41
46
  CBOE = "Cboe"
42
47
  STOXX = "STOXX"
43
48
  RESERVE_BANK_OF_AUSTRALIA = "ReserveBankOfAustralia"
@@ -107,8 +112,8 @@ def get_last_closed_session(now: datetime | None = None) -> date:
107
112
  date.
108
113
 
109
114
  Args:
110
- now (datetime | None): The moment to judge, with a time zone. Defaults to the
111
- current time; mainly useful for testing.
115
+ now (datetime | None): The moment to judge, with a time zone. Defaults to None,
116
+ which uses the current time; mainly useful for testing.
112
117
 
113
118
  Returns:
114
119
  date: The last date whose daily bars are final.
@@ -241,6 +246,7 @@ POLICIES: dict[str, CachePolicy] = {
241
246
  f"{BANK_OF_ENGLAND}.millennium": CachePolicy(ttl_seconds=365 * DAY),
242
247
  f"{BANK_OF_ENGLAND}.curve_current_month": CachePolicy(ttl_seconds=DAY),
243
248
  f"{BANK_OF_JAPAN}.series": CachePolicy(ttl_seconds=DAY, revision_days=31),
249
+ f"{BANK_OF_JAPAN}.price_index": CachePolicy(ttl_seconds=DAY),
244
250
  f"{EUROPEAN_CENTRAL_BANK}.economics_series": CachePolicy(
245
251
  ttl_seconds=DAY, revision_days=31
246
252
  ),
@@ -249,6 +255,9 @@ POLICIES: dict[str, CachePolicy] = {
249
255
  f"{STATISTICS_BUREAU_OF_JAPAN}.series": CachePolicy(ttl_seconds=DAY),
250
256
  # The keyless BLS API allows 25 requests a day, so the latest releases are fetched once.
251
257
  f"{BUREAU_OF_LABOR_STATISTICS}.series": CachePolicy(ttl_seconds=DAY),
258
+ # The consumer prices are one request for every measure, kept for six hours so the
259
+ # month a release publishes appears the same day.
260
+ f"{BUREAU_OF_LABOR_STATISTICS}.consumer_prices": CachePolicy(ttl_seconds=DAY // 4),
252
261
  # A past year of the Treasury yield curve is final; only the current year changes.
253
262
  f"{US_TREASURY}.par_yield_curve": CachePolicy(ttl_seconds=DAY),
254
263
  f"{US_TREASURY}.par_yield_curve_year": CachePolicy(ttl_seconds=30 * DAY),
@@ -257,7 +266,17 @@ POLICIES: dict[str, CachePolicy] = {
257
266
  # Auctions are added several times a week; a past year's results are final.
258
267
  f"{US_TREASURY}.auctions": CachePolicy(ttl_seconds=DAY),
259
268
  f"{US_TREASURY}.auctions_year": CachePolicy(ttl_seconds=30 * DAY),
269
+ # The FedInvest prices of a day are completed with the end-of-day price the next
270
+ # business day; a day that has them is final.
271
+ f"{US_TREASURY}.fedinvest_prices": CachePolicy(ttl_seconds=3600),
272
+ f"{US_TREASURY}.fedinvest_prices_final": CachePolicy(ttl_seconds=365 * DAY),
260
273
  f"{FREDDIE_MAC}.series": CachePolicy(ttl_seconds=DAY),
274
+ f"{DEPARTMENT_OF_LABOR}.series": CachePolicy(ttl_seconds=DAY),
275
+ f"{CENSUS_BUREAU}.series": CachePolicy(ttl_seconds=DAY),
276
+ f"{BUREAU_OF_ECONOMIC_ANALYSIS}.series": CachePolicy(ttl_seconds=DAY),
277
+ # The HQM curve is published monthly in files of five years; a past file is final.
278
+ f"{US_TREASURY}.hqm": CachePolicy(ttl_seconds=DAY),
279
+ f"{US_TREASURY}.hqm_years": CachePolicy(ttl_seconds=30 * DAY),
261
280
  f"{IBGE}.series": CachePolicy(ttl_seconds=DAY),
262
281
  # Daily bond yields; a rerun only asks for the last month, since yields are not revised
263
282
  # but a holiday or late publication can leave the latest days open.
@@ -274,6 +293,11 @@ POLICIES: dict[str, CachePolicy] = {
274
293
  f"{INTERNATIONAL_MONETARY_FUND}.codelist": CachePolicy(ttl_seconds=30 * DAY),
275
294
  # Updated about once a month.
276
295
  f"{SHILLER}.stock_market_data": CachePolicy(ttl_seconds=7 * DAY),
296
+ # The Pink Sheet is updated in the first days of every month.
297
+ f"{WORLD_BANK}.commodity_prices": CachePolicy(ttl_seconds=7 * DAY),
298
+ # PortWatch adds the latest days once a week, on Tuesdays, and the chokepoints rarely.
299
+ f"{IMF_PORTWATCH}.chokepoint_transits": CachePolicy(ttl_seconds=DAY),
300
+ f"{IMF_PORTWATCH}.chokepoints": CachePolicy(ttl_seconds=30 * DAY),
277
301
  # Index histories published whole, one file per index, updated after every close.
278
302
  f"{CBOE}.index": CachePolicy(ttl_seconds=DAY),
279
303
  f"{CBOE}.option_chain": CachePolicy(ttl_seconds=900),
@@ -303,6 +327,11 @@ POLICIES: dict[str, CachePolicy] = {
303
327
  f"{INTERNATIONAL_MONETARY_FUND}.consumer_prices": CachePolicy(
304
328
  ttl_seconds=DAY, revision_days=365
305
329
  ),
330
+ # Government finance and national accounts, published quarterly or yearly and revised
331
+ # back years when a country revises its national accounts.
332
+ f"{INTERNATIONAL_MONETARY_FUND}.government_finance": CachePolicy(
333
+ ttl_seconds=7 * DAY, revision_days=1095
334
+ ),
306
335
  f"{EUROPEAN_CENTRAL_BANK}.convergence_yields": CachePolicy(
307
336
  ttl_seconds=DAY, revision_days=93
308
337
  ),