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.
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/PKG-INFO +11 -7
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/README.md +8 -5
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/cache_controller.py +36 -20
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/frame_model.py +12 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/policy_model.py +31 -2
- financetoolkit-2.3.4/financetoolkit/cache/serialization_model.py +526 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/sqlite_model.py +37 -44
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/currencies_model.py +0 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/discovery/discovery_controller.py +412 -79
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/discovery/discovery_model.py +314 -36
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/causal_inference_model.py +0 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/data_model.py +19 -4
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/diagnostics_model.py +338 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/econometrics_controller.py +928 -23
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/forecast_evaluation_model.py +2 -25
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/hypothesis_testing_model.py +0 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/panel_data_model.py +0 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/regression_model.py +0 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/specification_tests_model.py +2 -6
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/state_space_model.py +15 -14
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/unitroot_model.py +7 -35
- financetoolkit-2.3.4/financetoolkit/economics/bea_model.py +67 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/bis_model.py +7 -0
- financetoolkit-2.3.4/financetoolkit/economics/bls_model.py +232 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/boe_model.py +20 -0
- financetoolkit-2.3.4/financetoolkit/economics/boj_model.py +206 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/cboe_model.py +4 -1
- financetoolkit-2.3.4/financetoolkit/economics/census_model.py +109 -0
- financetoolkit-2.3.4/financetoolkit/economics/dol_model.py +101 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/economics_controller.py +3291 -613
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/eurostat_model.py +82 -8
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/fmp_model.py +211 -25
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/fred_model.py +94 -86
- financetoolkit-2.3.4/financetoolkit/economics/futures_model.py +263 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/gmdb_model.py +152 -23
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/helpers.py +378 -19
- financetoolkit-2.3.4/financetoolkit/economics/imf_model.py +449 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/ngfs_model.py +2 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/oecd_model.py +4 -53
- financetoolkit-2.3.4/financetoolkit/economics/portwatch_model.py +189 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/sbj_model.py +2 -2
- financetoolkit-2.3.4/financetoolkit/economics/world_bank_model.py +96 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/yfinance_model.py +10 -1
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/etf/etf_controller.py +146 -47
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/finra_model.py +4 -4
- financetoolkit-2.3.4/financetoolkit/fixedincome/bond_data_model.py +303 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/bond_model.py +6 -6
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/curve_model.py +5 -15
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/derivative_model.py +4 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/eiopa_model.py +3 -7
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/esma_model.py +2 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/fixedincome_controller.py +2703 -1948
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/fmp_model.py +3 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/fred_model.py +45 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/helpers.py +35 -0
- financetoolkit-2.3.4/financetoolkit/fixedincome/hqm_model.py +253 -0
- financetoolkit-2.3.4/financetoolkit/fixedincome/loan_model.py +153 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/riksbank_model.py +3 -3
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/short_rate_model.py +2 -4
- financetoolkit-2.3.4/financetoolkit/fixedincome/treasurydirect_model.py +214 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/yieldcurve_model.py +2 -4
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fmp_model.py +422 -72
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fundamentals_model.py +0 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/helpers.py +516 -24
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/historical_model.py +45 -46
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/__main__.py +1 -1
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/analytics_model.py +100 -12
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/auth_model.py +444 -101
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/coercion_model.py +61 -0
- financetoolkit-2.3.4/financetoolkit/mcp_server/config.yaml +1171 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/diagnostics_model.py +11 -42
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/formatting_model.py +249 -20
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/inspection_controller.py +2 -7
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcp_controller.py +198 -78
- financetoolkit-2.3.4/financetoolkit/mcp_server/mcpb/manifest.json +190 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcpb/pyproject.toml +2 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/provider_model.py +255 -109
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/registry_controller.py +451 -112
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/setup_model.py +91 -14
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/tools_model.py +54 -4
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/altman_model.py +124 -34
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/beneish_model.py +0 -2
- financetoolkit-2.3.4/financetoolkit/models/chs_model.py +367 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/credit_model.py +11 -5
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/fulmer_model.py +11 -36
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/grover_model.py +5 -3
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/growth_model.py +8 -5
- financetoolkit-2.3.4/financetoolkit/models/helpers.py +340 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/intrinsic_model.py +9 -10
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/models_controller.py +1791 -959
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/ohlson_model.py +21 -15
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/quality_model.py +6 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/springate_model.py +6 -4
- financetoolkit-2.3.4/financetoolkit/models/taffler_model.py +179 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/wacc_model.py +27 -12
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/zmijewski_model.py +5 -3
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/balance_yf.csv +1 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/statistics_yf.csv +1 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization_model.py +42 -21
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/binomial_trees_model.py +10 -3
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/black_scholes_model.py +16 -44
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/exotics_model.py +4 -22
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/helpers.py +82 -18
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/market_metrics_model.py +0 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/options_controller.py +580 -250
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/options_model.py +13 -14
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/risk_neutral_density_model.py +0 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/svi_model.py +1 -3
- financetoolkit-2.3.4/financetoolkit/performance/helpers.py +93 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/performance/performance_controller.py +934 -110
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/performance/performance_model.py +627 -66
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/attribution_model.py +61 -7
- financetoolkit-2.3.4/financetoolkit/portfolio/backtest_model.py +313 -0
- financetoolkit-2.3.4/financetoolkit/portfolio/construction_controller.py +4773 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/definition_model.py +0 -2
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/helpers.py +2 -19
- financetoolkit-2.3.4/financetoolkit/portfolio/optimization_model.py +4009 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/overview_model.py +3 -4
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/portfolio_controller.py +73 -50
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/portfolio_model.py +7 -1
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/efficiency_model.py +167 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/profitability_model.py +280 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/ratios_controller.py +8521 -4497
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/solvency_model.py +255 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/valuation_model.py +289 -3
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/copula_model.py +4 -3
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/cvar_model.py +2 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/garch_model.py +8 -4
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/helpers.py +20 -20
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/market_liquidity_model.py +7 -3
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/realized_volatility_model.py +54 -12
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/risk_controller.py +458 -122
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/risk_model.py +142 -56
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/var_model.py +5 -20
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/technicals_controller.py +416 -636
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/toolkit_controller.py +663 -381
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/dataframe_model.py +75 -4
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/error_model.py +6 -5
- financetoolkit-2.3.4/financetoolkit/utilities/logger_model.py +145 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/requests_model.py +38 -12
- financetoolkit-2.3.4/financetoolkit/utilities/sources_model.py +358 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/statistics_model.py +293 -21
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/yfinance_model.py +137 -37
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/pyproject.toml +21 -26
- financetoolkit-2.3.2/financetoolkit/cache/serialization_model.py +0 -160
- financetoolkit-2.3.2/financetoolkit/economics/bls_model.py +0 -115
- financetoolkit-2.3.2/financetoolkit/economics/boj_model.py +0 -111
- financetoolkit-2.3.2/financetoolkit/economics/imf_model.py +0 -212
- financetoolkit-2.3.2/financetoolkit/mcp_server/config.yaml +0 -1046
- financetoolkit-2.3.2/financetoolkit/mcp_server/mcpb/manifest.json +0 -190
- financetoolkit-2.3.2/financetoolkit/models/helpers.py +0 -43
- financetoolkit-2.3.2/financetoolkit/performance/helpers.py +0 -86
- financetoolkit-2.3.2/financetoolkit/portfolio/construction_controller.py +0 -1659
- financetoolkit-2.3.2/financetoolkit/portfolio/optimization_model.py +0 -987
- financetoolkit-2.3.2/financetoolkit/utilities/logger_model.py +0 -58
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/.gitignore +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/LICENSE.txt +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/coverage_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/request_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/cache/ticker_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/discovery/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/earnings_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/causality_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/cointegration_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/event_study_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/fama_macbeth_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/pairs_trading_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/regime_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/econometrics/time_series_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/dnb_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/ecb_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/eex_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/esrb_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/frb_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/freddie_mac_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/ibge_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/macrohistory_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/mof_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/nber_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/nyfed_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/ons_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/shiller_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/stoxx_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/economics/treasury_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/etf/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/etf/etf_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/boc_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/bundesbank_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/ecb_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/euribor_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/fed_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/fiscaldata_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/norgesbank_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/fixedincome/rba_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcpb/.mcpbignore +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcpb/LICENSE +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcpb/README.md +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/mcpb/finance_toolkit_icon.png +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/series_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/static/apple-touch-icon.png +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/static/favicon-32.png +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/static/favicon.ico +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/mcp_server/stats_page_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/damodaran_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/dupont_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/enterprise_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/eva_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/peers_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/models/piotroski_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/balance.csv +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/cash.csv +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/cash_yf.csv +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/income.csv +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/income_yf.csv +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/normalization/statistics.csv +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/options/greeks_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/performance/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/config.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/example_datasets/example_portfolio.csv +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/example_datasets/example_portfolio.xlsx +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/all_weather.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/balanced_60_40.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/barbell.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/bogleheads_three_fund.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/buffett_90_10.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/conservative_income.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/global_60_40.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/global_equity_growth.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/golden_butterfly.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/permanent_portfolio.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/small_cap_value_tilt.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/target_date_glidepath.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/portfolio/presets/us_equity_sectors.yaml +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/py.typed +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/helpers.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/ratios/liquidity_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/backtesting_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/covar_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/risk/evar_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/__init__.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/breadth_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/momentum_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/overlap_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/pattern_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/seasonality_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/technicals/volatility_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/excel_model.py +0 -0
- {financetoolkit-2.3.2 → financetoolkit-2.3.4}/financetoolkit/utilities/factor_model.py +0 -0
- {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.
|
|
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
|
|
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 →
|
|
596
|
-
| **Windsurf** |
|
|
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
|
|
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 →
|
|
552
|
-
| **Windsurf** |
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
|
|
604
|
-
|
|
605
|
-
|
|
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:
|
|
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
|
-
|
|
679
|
-
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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 &=
|
|
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
|
-
|
|
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
|
|
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
|
),
|