financetoolkit 2.3.1__tar.gz → 2.3.2__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 (237) hide show
  1. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/.gitignore +193 -196
  2. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/PKG-INFO +1 -1
  3. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/cache/cache_controller.py +4 -0
  4. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/cache/policy_model.py +61 -3
  5. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/discovery/discovery_controller.py +239 -22
  6. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/discovery/discovery_model.py +169 -5
  7. financetoolkit-2.3.2/financetoolkit/earnings_model.py +113 -0
  8. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/bis_model.py +67 -0
  9. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/economics_controller.py +406 -0
  10. financetoolkit-2.3.2/financetoolkit/economics/nyfed_model.py +120 -0
  11. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/etf/etf_controller.py +442 -0
  12. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/etf/etf_model.py +93 -0
  13. financetoolkit-2.3.2/financetoolkit/finra_model.py +311 -0
  14. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/fixedincome_controller.py +114 -0
  15. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fmp_model.py +431 -0
  16. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/historical_model.py +16 -0
  17. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/config.yaml +53 -31
  18. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/formatting_model.py +11 -1
  19. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/mcp_controller.py +10 -7
  20. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/mcpb/.mcpbignore +0 -1
  21. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/mcpb/README.md +7 -16
  22. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/mcpb/manifest.json +19 -19
  23. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/mcpb/pyproject.toml +2 -2
  24. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/registry_controller.py +161 -17
  25. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/setup_model.py +106 -71
  26. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/tools_model.py +16 -1
  27. financetoolkit-2.3.2/financetoolkit/models/damodaran_model.py +255 -0
  28. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/growth_model.py +88 -0
  29. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/intrinsic_model.py +173 -6
  30. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/models_controller.py +953 -33
  31. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/quality_model.py +49 -0
  32. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/performance/performance_controller.py +853 -6
  33. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/performance/performance_model.py +660 -0
  34. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/construction_controller.py +149 -38
  35. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/optimization_model.py +181 -2
  36. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/ratios/ratios_controller.py +793 -99
  37. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/risk_controller.py +552 -1
  38. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/risk_model.py +210 -0
  39. financetoolkit-2.3.2/financetoolkit/technicals/pattern_model.py +579 -0
  40. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/technicals/technicals_controller.py +754 -11
  41. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/toolkit_controller.py +936 -21
  42. financetoolkit-2.3.2/financetoolkit/utilities/factor_model.py +745 -0
  43. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/utilities/statistics_model.py +97 -4
  44. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/yfinance_model.py +22 -8
  45. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/pyproject.toml +1 -1
  46. financetoolkit-2.3.1/financetoolkit/mcp_server/mcpb/build-mcpb.sh +0 -103
  47. financetoolkit-2.3.1/financetoolkit/models/damodaran_model.py +0 -84
  48. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/LICENSE.txt +0 -0
  49. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/README.md +0 -0
  50. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/__init__.py +0 -0
  51. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/cache/__init__.py +0 -0
  52. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/cache/coverage_model.py +0 -0
  53. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/cache/frame_model.py +0 -0
  54. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/cache/request_model.py +0 -0
  55. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/cache/serialization_model.py +0 -0
  56. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/cache/sqlite_model.py +0 -0
  57. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/cache/ticker_model.py +0 -0
  58. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/currencies_model.py +0 -0
  59. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/discovery/__init__.py +0 -0
  60. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/__init__.py +0 -0
  61. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/causal_inference_model.py +0 -0
  62. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/causality_model.py +0 -0
  63. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/cointegration_model.py +0 -0
  64. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/data_model.py +0 -0
  65. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/diagnostics_model.py +0 -0
  66. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/econometrics_controller.py +0 -0
  67. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/event_study_model.py +0 -0
  68. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/fama_macbeth_model.py +0 -0
  69. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/forecast_evaluation_model.py +0 -0
  70. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/hypothesis_testing_model.py +0 -0
  71. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/pairs_trading_model.py +0 -0
  72. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/panel_data_model.py +0 -0
  73. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/regime_model.py +0 -0
  74. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/regression_model.py +0 -0
  75. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/specification_tests_model.py +0 -0
  76. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/state_space_model.py +0 -0
  77. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/time_series_model.py +0 -0
  78. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/econometrics/unitroot_model.py +0 -0
  79. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/__init__.py +0 -0
  80. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/bls_model.py +0 -0
  81. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/boe_model.py +0 -0
  82. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/boj_model.py +0 -0
  83. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/cboe_model.py +0 -0
  84. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/dnb_model.py +0 -0
  85. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/ecb_model.py +0 -0
  86. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/eex_model.py +0 -0
  87. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/esrb_model.py +0 -0
  88. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/eurostat_model.py +0 -0
  89. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/fmp_model.py +0 -0
  90. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/frb_model.py +0 -0
  91. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/fred_model.py +0 -0
  92. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/freddie_mac_model.py +0 -0
  93. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/gmdb_model.py +0 -0
  94. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/helpers.py +0 -0
  95. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/ibge_model.py +0 -0
  96. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/imf_model.py +0 -0
  97. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/macrohistory_model.py +0 -0
  98. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/mof_model.py +0 -0
  99. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/nber_model.py +0 -0
  100. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/ngfs_model.py +0 -0
  101. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/oecd_model.py +0 -0
  102. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/ons_model.py +0 -0
  103. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/sbj_model.py +0 -0
  104. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/shiller_model.py +0 -0
  105. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/stoxx_model.py +0 -0
  106. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/treasury_model.py +0 -0
  107. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/economics/yfinance_model.py +0 -0
  108. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/etf/__init__.py +0 -0
  109. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/__init__.py +0 -0
  110. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/boc_model.py +0 -0
  111. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/bond_model.py +0 -0
  112. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/bundesbank_model.py +0 -0
  113. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/curve_model.py +0 -0
  114. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/derivative_model.py +0 -0
  115. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/ecb_model.py +0 -0
  116. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/eiopa_model.py +0 -0
  117. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/esma_model.py +0 -0
  118. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/euribor_model.py +0 -0
  119. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/fed_model.py +0 -0
  120. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/fiscaldata_model.py +0 -0
  121. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/fmp_model.py +0 -0
  122. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/fred_model.py +0 -0
  123. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/helpers.py +0 -0
  124. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/norgesbank_model.py +0 -0
  125. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/rba_model.py +0 -0
  126. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/riksbank_model.py +0 -0
  127. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/short_rate_model.py +0 -0
  128. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fixedincome/yieldcurve_model.py +0 -0
  129. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/fundamentals_model.py +0 -0
  130. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/helpers.py +0 -0
  131. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/__init__.py +0 -0
  132. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/__main__.py +0 -0
  133. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/analytics_model.py +0 -0
  134. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/auth_model.py +0 -0
  135. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/coercion_model.py +0 -0
  136. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/diagnostics_model.py +0 -0
  137. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/inspection_controller.py +0 -0
  138. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/mcpb/LICENSE +0 -0
  139. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/mcpb/finance_toolkit_icon.png +0 -0
  140. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/provider_model.py +0 -0
  141. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/series_model.py +0 -0
  142. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/static/apple-touch-icon.png +0 -0
  143. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/static/favicon-32.png +0 -0
  144. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/static/favicon.ico +0 -0
  145. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/mcp_server/stats_page_model.py +0 -0
  146. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/__init__.py +0 -0
  147. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/altman_model.py +0 -0
  148. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/beneish_model.py +0 -0
  149. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/credit_model.py +0 -0
  150. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/dupont_model.py +0 -0
  151. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/enterprise_model.py +0 -0
  152. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/eva_model.py +0 -0
  153. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/fulmer_model.py +0 -0
  154. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/grover_model.py +0 -0
  155. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/helpers.py +0 -0
  156. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/ohlson_model.py +0 -0
  157. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/peers_model.py +0 -0
  158. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/piotroski_model.py +0 -0
  159. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/springate_model.py +0 -0
  160. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/wacc_model.py +0 -0
  161. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/models/zmijewski_model.py +0 -0
  162. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/normalization/balance.csv +0 -0
  163. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/normalization/balance_yf.csv +0 -0
  164. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/normalization/cash.csv +0 -0
  165. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/normalization/cash_yf.csv +0 -0
  166. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/normalization/income.csv +0 -0
  167. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/normalization/income_yf.csv +0 -0
  168. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/normalization/statistics.csv +0 -0
  169. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/normalization/statistics_yf.csv +0 -0
  170. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/normalization_model.py +0 -0
  171. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/__init__.py +0 -0
  172. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/binomial_trees_model.py +0 -0
  173. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/black_scholes_model.py +0 -0
  174. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/exotics_model.py +0 -0
  175. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/greeks_model.py +0 -0
  176. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/helpers.py +0 -0
  177. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/market_metrics_model.py +0 -0
  178. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/options_controller.py +0 -0
  179. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/options_model.py +0 -0
  180. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/risk_neutral_density_model.py +0 -0
  181. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/options/svi_model.py +0 -0
  182. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/performance/__init__.py +0 -0
  183. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/performance/helpers.py +0 -0
  184. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/__init__.py +0 -0
  185. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/attribution_model.py +0 -0
  186. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/config.yaml +0 -0
  187. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/definition_model.py +0 -0
  188. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/example_datasets/example_portfolio.csv +0 -0
  189. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/example_datasets/example_portfolio.xlsx +0 -0
  190. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/helpers.py +0 -0
  191. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/overview_model.py +0 -0
  192. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/portfolio_controller.py +0 -0
  193. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/portfolio_model.py +0 -0
  194. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/all_weather.yaml +0 -0
  195. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/balanced_60_40.yaml +0 -0
  196. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/barbell.yaml +0 -0
  197. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/bogleheads_three_fund.yaml +0 -0
  198. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/buffett_90_10.yaml +0 -0
  199. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/conservative_income.yaml +0 -0
  200. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/global_60_40.yaml +0 -0
  201. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/global_equity_growth.yaml +0 -0
  202. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/golden_butterfly.yaml +0 -0
  203. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/permanent_portfolio.yaml +0 -0
  204. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/small_cap_value_tilt.yaml +0 -0
  205. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/target_date_glidepath.yaml +0 -0
  206. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/portfolio/presets/us_equity_sectors.yaml +0 -0
  207. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/py.typed +0 -0
  208. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/ratios/__init__.py +0 -0
  209. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/ratios/efficiency_model.py +0 -0
  210. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/ratios/helpers.py +0 -0
  211. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/ratios/liquidity_model.py +0 -0
  212. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/ratios/profitability_model.py +0 -0
  213. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/ratios/solvency_model.py +0 -0
  214. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/ratios/valuation_model.py +0 -0
  215. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/__init__.py +0 -0
  216. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/backtesting_model.py +0 -0
  217. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/copula_model.py +0 -0
  218. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/covar_model.py +0 -0
  219. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/cvar_model.py +0 -0
  220. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/evar_model.py +0 -0
  221. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/garch_model.py +0 -0
  222. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/helpers.py +0 -0
  223. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/market_liquidity_model.py +0 -0
  224. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/realized_volatility_model.py +0 -0
  225. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/risk/var_model.py +0 -0
  226. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/technicals/__init__.py +0 -0
  227. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/technicals/breadth_model.py +0 -0
  228. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/technicals/momentum_model.py +0 -0
  229. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/technicals/overlap_model.py +0 -0
  230. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/technicals/seasonality_model.py +0 -0
  231. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/technicals/volatility_model.py +0 -0
  232. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/utilities/dataframe_model.py +0 -0
  233. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/utilities/error_model.py +0 -0
  234. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/utilities/excel_model.py +0 -0
  235. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/utilities/logger_model.py +0 -0
  236. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/financetoolkit/utilities/requests_model.py +0 -0
  237. {financetoolkit-2.3.1 → financetoolkit-2.3.2}/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.2
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
@@ -581,6 +581,10 @@ class Cache:
581
581
  coverage_start = min(coverage_start, bounds[0])
582
582
  coverage_end = max(coverage_end, bounds[1])
583
583
 
584
+ # 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
585
+ if policy_model.get_policy(source, dataset).settles_at_close:
586
+ coverage_end = min(coverage_end, policy_model.get_last_closed_session())
587
+
584
588
  if coverage_start <= coverage_end:
585
589
  coverage = (coverage_start, coverage_end)
586
590
 
@@ -3,6 +3,8 @@
3
3
  __docformat__ = "google"
4
4
 
5
5
  from dataclasses import dataclass
6
+ from datetime import date, datetime, time, timedelta
7
+ from zoneinfo import ZoneInfo
6
8
 
7
9
  DAY = 86400
8
10
 
@@ -46,6 +48,7 @@ MACROHISTORY = "Macrohistory"
46
48
  DE_NEDERLANDSCHE_BANK = "DeNederlandscheBank"
47
49
  EUROPEAN_SYSTEMIC_RISK_BOARD = "ESRB"
48
50
  DAMODARAN = "Damodaran"
51
+ FINRA = "FINRA"
49
52
 
50
53
  # The market risk premium is published per country, so it is one cache entry. The name
51
54
  # marks the premiums as decimals, so an entry holding percentages under another name is
@@ -77,10 +80,46 @@ class CachePolicy:
77
80
  re-requested once the stored range has gone stale. Zero means the whole
78
81
  stale range is requested again, which is the right behaviour for sources
79
82
  that cannot be queried by date range anyway.
83
+ settles_at_close (bool): Whether the data holds a bar per trading day. The bar
84
+ of a session that is still trading changes until the close, so such a day
85
+ is only recorded as covered once every session has closed (see
86
+ `get_last_closed_session`) and is requested again until then.
80
87
  """
81
88
 
82
89
  ttl_seconds: int
83
90
  revision_days: int = 0
91
+ settles_at_close: bool = False
92
+
93
+
94
+ # The last major exchanges to close (New York, Toronto) close at 16:00 New York time; the
95
+ # half hour after it leaves time for the end-of-day bar to be published.
96
+ SESSION_CLOSE = time(16, 30)
97
+ SESSION_ZONE = ZoneInfo("America/New_York")
98
+
99
+
100
+ def get_last_closed_session(now: datetime | None = None) -> date:
101
+ """
102
+ The last day whose trading sessions have all closed, everywhere.
103
+
104
+ A daily bar fetched during the session is a snapshot of the latest price, not the
105
+ close, so a day only counts as final from 16:30 New York time, half an hour after the
106
+ last major exchanges have closed. Exchanges further east close earlier on the same
107
+ date.
108
+
109
+ Args:
110
+ now (datetime | None): The moment to judge, with a time zone. Defaults to the
111
+ current time; mainly useful for testing.
112
+
113
+ Returns:
114
+ date: The last date whose daily bars are final.
115
+ """
116
+ local = (now or datetime.now(SESSION_ZONE)).astimezone(SESSION_ZONE)
117
+
118
+ return (
119
+ local.date()
120
+ if local.time() >= SESSION_CLOSE
121
+ else local.date() - timedelta(days=1)
122
+ )
84
123
 
85
124
 
86
125
  # Point-in-time data has no date range, so only the TTL applies.
@@ -89,9 +128,11 @@ DEFAULT_POLICY = CachePolicy(ttl_seconds=DAY)
89
128
  POLICIES: dict[str, CachePolicy] = {
90
129
  # Splits and dividends restate recent bars, so only the last week is re-requested.
91
130
  f"{FINANCIAL_MODELING_PREP}.historical": CachePolicy(
92
- ttl_seconds=DAY, revision_days=7
131
+ ttl_seconds=DAY, revision_days=7, settles_at_close=True
132
+ ),
133
+ f"{YAHOO_FINANCE}.historical": CachePolicy(
134
+ ttl_seconds=DAY, revision_days=7, settles_at_close=True
93
135
  ),
94
- f"{YAHOO_FINANCE}.historical": CachePolicy(ttl_seconds=DAY, revision_days=7),
95
136
  # Intraday bars move continuously; only FinancialModelingPrep publishes them.
96
137
  f"{FINANCIAL_MODELING_PREP}.intraday": CachePolicy(
97
138
  ttl_seconds=900, revision_days=2
@@ -126,7 +167,11 @@ POLICIES: dict[str, CachePolicy] = {
126
167
  f"{FINANCIAL_MODELING_PREP}.stock_splits": CachePolicy(ttl_seconds=DAY),
127
168
  f"{FINANCIAL_MODELING_PREP}.shares_float": CachePolicy(ttl_seconds=DAY),
128
169
  f"{FINANCIAL_MODELING_PREP}.insider_trade_statistics": CachePolicy(ttl_seconds=DAY),
170
+ f"{FINANCIAL_MODELING_PREP}.institutional_ownership": CachePolicy(ttl_seconds=DAY),
129
171
  f"{FINANCIAL_MODELING_PREP}.stock_grades": CachePolicy(ttl_seconds=DAY),
172
+ f"{FINANCIAL_MODELING_PREP}.price_targets": CachePolicy(ttl_seconds=DAY),
173
+ f"{FINANCIAL_MODELING_PREP}.price_target_history": CachePolicy(ttl_seconds=DAY),
174
+ f"{FINANCIAL_MODELING_PREP}.analyst_recommendations": CachePolicy(ttl_seconds=DAY),
130
175
  # Fund holdings and allocations are republished daily by most issuers.
131
176
  f"{FINANCIAL_MODELING_PREP}.etf_holdings": CachePolicy(ttl_seconds=DAY),
132
177
  f"{FINANCIAL_MODELING_PREP}.etf_information": CachePolicy(ttl_seconds=DAY),
@@ -153,7 +198,9 @@ POLICIES: dict[str, CachePolicy] = {
153
198
  f"{YAHOO_FINANCE}.option_chain": CachePolicy(ttl_seconds=900),
154
199
  f"{YAHOO_FINANCE}.option_expiries": CachePolicy(ttl_seconds=DAY),
155
200
  # A forward curve fetches one contract per delivery month, so cache per contract.
156
- f"{YAHOO_FINANCE}.futures": CachePolicy(ttl_seconds=DAY, revision_days=7),
201
+ f"{YAHOO_FINANCE}.futures": CachePolicy(
202
+ ttl_seconds=DAY, revision_days=7, settles_at_close=True
203
+ ),
157
204
  # Macro sources revise heavily and publish on a lag, so the tail stays long.
158
205
  f"{FRED}.series": CachePolicy(ttl_seconds=DAY, revision_days=365),
159
206
  f"{OECD}.query": CachePolicy(ttl_seconds=DAY, revision_days=1095),
@@ -161,6 +208,7 @@ POLICIES: dict[str, CachePolicy] = {
161
208
  # Full history per series and no date range accepted, so only a TTL applies.
162
209
  f"{EUROPEAN_CENTRAL_BANK}.series": CachePolicy(ttl_seconds=DAY),
163
210
  f"{FEDERAL_RESERVE}.rate": CachePolicy(ttl_seconds=DAY),
211
+ f"{FEDERAL_RESERVE}.series": CachePolicy(ttl_seconds=DAY),
164
212
  # Statistical offices and central banks that publish a series whole and revise its
165
213
  # recent past; most release daily or monthly, so a day keeps the data current.
166
214
  # A rerun only asks for the revision window: a year of monthly releases for Eurostat,
@@ -178,6 +226,11 @@ POLICIES: dict[str, CachePolicy] = {
178
226
  f"{BANK_FOR_INTERNATIONAL_SETTLEMENTS}.commercial_property": CachePolicy(
179
227
  ttl_seconds=7 * DAY, revision_days=731
180
228
  ),
229
+ # Quarterly credit statistics, published about three months after the quarter and
230
+ # revised back years when GDP or the credit series are revised.
231
+ f"{BANK_FOR_INTERNATIONAL_SETTLEMENTS}.credit": CachePolicy(
232
+ ttl_seconds=7 * DAY, revision_days=731
233
+ ),
181
234
  f"{BANK_OF_ENGLAND}.series": CachePolicy(ttl_seconds=DAY, revision_days=31),
182
235
  # A workbook of a closed span of years no longer changes; the one running to the
183
236
  # present is republished monthly and the current month daily.
@@ -241,7 +294,12 @@ POLICIES: dict[str, CachePolicy] = {
241
294
  f"{EUROPEAN_SYSTEMIC_RISK_BOARD}.listing": CachePolicy(ttl_seconds=7 * DAY),
242
295
  # The default spreads of the synthetic rating table are updated once a year.
243
296
  f"{DAMODARAN}.synthetic_ratings": CachePolicy(ttl_seconds=30 * DAY),
297
+ # The industry datasets are updated every January.
298
+ f"{DAMODARAN}.industry_statistics": CachePolicy(ttl_seconds=30 * DAY),
244
299
  f"{FEDERAL_RESERVE_BOARD}.scenario": CachePolicy(ttl_seconds=30 * DAY),
300
+ # A published day of short sale volume does not change, but FINRA publishes the file of
301
+ # a day in the evening, so once a day has passed the last week is asked for again.
302
+ f"{FINRA}.short_volume": CachePolicy(ttl_seconds=DAY, revision_days=7),
245
303
  f"{INTERNATIONAL_MONETARY_FUND}.consumer_prices": CachePolicy(
246
304
  ttl_seconds=DAY, revision_days=365
247
305
  ),