A large release with new analytics throughout the package: factor analysis (predictive power) in every module, return decomposition, earnings surprises, ETF contributions, alternative betas, Morningstar's risk-adjusted return, drawdown tables, candlestick patterns and indicator summaries. New data comes from analyst targets, 13F ownership, FINRA short volume, historical index constituents, the NY Fed, the BIS and Damodaran. The MCP setup wizard now writes to the right places for Claude Desktop on Linux, Devin Desktop and VS Code.
Package
New analytics
- Factor analysis (predictive power):
get_factor_analysisin ratios, technicals, models, risk and performance tests any metric, a list of them or a collection (e.g.ratios="valuation") as a cross-sectional signal: information coefficient (mean, IR, t-stat), quantile returns, top-minus-bottom spread, turnover and rank autocorrelation, without look-ahead.performance.get_factor_analysisalso takes your own signal as a DataFrame (#335). - Returns explained:
models.get_return_decompositionsplits a price return into EPS growth × P/E change, plus dividends (#320).performance.get_beta_implied_returngives the beta-implied return, the actual return and the residual per period (#344).risk.get_move_significanceshows how unusual a move is: volatility multiple, percentile and "largest since" date (#324). - Earnings:
get_earnings_surprisegives EPS and revenue surprises, SUE, and the share's reaction against the benchmark per announcement (#321). - ETFs:
etf.get_contributiongives each holding's or sector's contribution to the return (also in index points), andetf.get_return_excludingthe return without chosen holdings or sectors (#322).etf.get_active_share(#339). - Performance: alternative betas via
get_beta(method=...): Blume, Vasicek, Dimson, Scholes-Williams, upside and downside (#325).get_kelly_criterionandget_return_statistics(profit factor, payoff ratio, expectancy, streaks, recovery factor) (#336). Morningstar Risk-Adjusted Return and Morningstar Risk, checked against Morningstar's April 2023 methodology (#339). - Risk:
get_drawdown_seriesandget_drawdown_table(#323), with the gain needed to recover:get_drawdown_series(recovery=True)and a Recovery Needed column (#350).get_move_significancealso gives the VaR Multiple, a move divided by its trailing VaR (#350). - Portfolio:
covariance=on every optimiser: sample, Ledoit-Wolf, OAS, semicovariance or exponential. Matches scikit-learn and PyPortfolioOpt (#326). - Models: H-model, three-stage DDM (
transition_periods=), justified P/E and P/B, andget_intrinsic_valuation(historical=True)(#341).get_quality_score, a Quality Minus Junk composite (#343). - Growth:
compound=Truewithgrowth=True, lag=ngives the n-period CAGR of statements, estimates and every ratio (#329). - Technicals:
get_candlestick_patterns, 15 patterns identical to TA-Lib, andget_signals(crossovers, RSI zones, band breaks, new highs/lows) (#338).get_indicator_summarygives an indicator's latest value, its percentile and rank in its own history, its extremes with dates, threshold crossings and the average returns after them (#348).
New data
- Analyst price targets, target history and monthly recommendations (#328). Institutional ownership from 13F filings (#333). FINRA daily short sale volume (#337).
- Index constituents on a past date, plus the dated changes (#330).
- NY Fed ACM Treasury term premium and Global Supply Chain Pressure Index (#331). BIS credit-to-GDP gap, debt service ratios and credit to GDP by sector (#332). Damodaran industry averages (#334).
Fixes
- A ticker without data no longer adds calendar days to the other tickers (#318).
- Yahoo Finance prices are taken unrepaired when yfinance's
repairextra (scikit-learn) is missing, instead of failing (#327). - A daily bar fetched before its session closed is asked for again after the close (#345).
- Technical indicators are calculated on a year of prices before the start date, so smoothed indicators (RSI, ATR, ADX, MACD, moving averages) no longer depend on it (#349).
- The daily P/E, P/B, earnings yield and dividend yield carry the latest reported figures to the latest close instead of dropping periods before the start date (#349).
get_factor_analysisleaves out a metric that fewer than three tickers have (e.g. the preferred dividend coverage ratio inratios.get_factor_analysis(metrics="all")), with a warning, instead of failing the whole analysis.
MCP server
limitselects rows per ticker in multi-ticker answers (#342).- A requested ticker that is also the benchmark is returned by methods without a benchmark, such as quotes (#346).
benchmark_ticker"None", "null" or "" means no benchmark (#318).- All new methods are available on their tools; there are still 25 router tools.
- A note says when the last daily row comes from an unclosed session (#345).
- Setup wizard (
financetoolkit-mcp-setup):- Claude Desktop's Linux path is
~/.config/Claude. - The Windsurf client is replaced by "Devin Desktop (Windsurf)" (
devin): it writes~/.config/devin/mcp_config.json, or the old Windsurf file where it still exists. - VS Code entries carry
"type": "stdio". - A new
copilotclient writes the global~/.copilot/mcp-config.json.
- Claude Desktop's Linux path is
server.jsonis published to the MCP Registry on every release (#319), andfinancetoolkit.mcpbis built and attached to every release by the release workflow (#351).
Removed
- The
windsurfchoice offinancetoolkit-mcp-setup --client; usedevin.
The version is 2.3.2 in pyproject.toml, server.json, the bundle manifest, mcp_server/mcpb/pyproject.toml (including the financetoolkit[mcp]== pin) and uv.lock.