Servidor MCP

Folionomiq

com.folionomiq/folionomiq
Datos y analítica Finanzas e inversión Público y accesible MCP 2025-11-25

Qué hace este MCP

Measures portfolio structure and historical performance, including diversification, factor exposure, drawdowns, crises, withdrawals and counterfactual changes.

asset_info
One fund or share: what it is and holds
One fund or share on its own, no portfolio needed: name, type, exchange, yearly cost when published, its measured return, volatility and worst fall, and for a fund its largest holdings and sectors.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'asset_infoArguments', 'required': ['ticker'], 'properties': {'ticker': {'type': 'string', 'title': 'Ticker', 'maxLength': 20, 'description': 'One ticker, as the exchange lists it.'}}}
Esquema de salida
{'type': 'object', 'required': ['ticker'], 'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'fund': {'description': 'For a fund: is_fund, holdings ([symbol, weight] pairs), sectors.'}, 'meta': {'description': 'name, type, category, expense_ratio, currency, exchange, fund_family, total_assets, sector, isin.'}, 'stats': {'description': 'last, ret_1y, vol, max_drawdown, years, start, end.'}, 'ticker': {'type': ['string', 'null'], 'description': 'Ticker.'}}, 'description': 'One fund or share.'}
check_before_you_buy
Check before you buy
Before adding one new holding, with a given amount, to an existing portfolio: how much of it is already owned through the current funds (from the fund's SEC filing when there is one), whether it adds an independent bet, and what past crises would have done with it included. For any other change (removing, reweighting, several at once), test_a_change. Counterfactual; never says whether to buy.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'check_before_you_buyArguments', 'required': ['holdings', 'add', 'amount'], 'properties': {'add': {'type': 'string', 'title': 'Add', 'maxLength': 20, 'description': 'The one ticker being considered.'}, 'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'amount': {'type': 'number', 'title': 'Amount', 'description': 'How much of it, in the same units as `holdings` (money when holdings are amounts).', 'exclusiveMinimum': 0}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'add': {'type': ['string', 'null'], 'description': 'The ticker considered.'}, 'bets': {'description': 'Independent bets before and after.'}, 'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'amount': {'type': ['number', 'null'], 'description': 'How much of it.'}, 'crises': {'description': 'Per past crisis: fall before and after, as fractions.'}, 'window': {'description': 'The shared price window.'}, 'overlap': {'description': 'How much of it is already owned: kind (fund, stock, opaque); for a fund already_share (share of its money in companies already held), seen_share, shared ([company, weight in it, weight in the portfolio]), source, as_of; for a stock already (share of the portfolio) and via.'}, 'top_risk': {'description': 'The holding carrying the most risk, and its share, before and after.'}, 'total_after': {'type': ['number', 'null'], 'description': 'Portfolio size after.'}, 'total_before': {'type': ['number', 'null'], 'description': 'Portfolio size before.'}}, 'description': 'One addition measured on the portfolio it would join (counterfactual).'}
compare_portfolios
Compare portfolios side by side
Two to eight separate portfolios (not a change to one) measured over one shared window of price history: growth, volatility, worst fall, and how each moved against the others. For a before-and-after of one portfolio, test_a_change. Says what each was; does not say which to hold.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'compare_portfoliosArguments', 'required': ['portfolios'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'portfolios': {'type': 'object', 'title': 'Portfolios', 'description': 'Two to eight portfolios, {label: {ticker: weight}}. Labels are shortened to letters and digits.', 'additionalProperties': {'type': 'object', 'additionalProperties': {'type': 'number'}}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'end': {'type': ['string', 'null'], 'description': 'Shared window end.'}, 'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'start': {'type': ['string', 'null'], 'description': 'Shared window start.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'series': {'description': 'Per portfolio label: the growth path over the window.'}, 'metrics': {'description': 'Per portfolio label: growth, volatility, worst fall and related figures.'}, 'correlation': {'description': 'Per pair of labels: how the portfolios moved together.'}}, 'description': 'Up to eight portfolios measured on one shared window.'}
currency_effect
What exchange rates did to it
For a portfolio held in one currency but priced partly in others: how much of it is outside the base currency, and what exchange-rate moves added to its growth, volatility and worst fall compared with the same holdings currency-hedged. Needs base set to the holder's currency to mean anything.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'currency_effectArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'base': {'type': ['string', 'null'], 'description': 'Base currency.'}, 'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'hedged': {'description': 'The same with the currency moves removed.'}, 'headline': {'type': ['string', 'null'], 'description': 'One sentence summary.'}, 'unhedged': {'description': 'Growth, volatility and worst fall as held.'}, 'by_currency': {'description': '[currency, share of the money] pairs, by listing currency.'}, 'limitations': {'description': 'What this cannot show (listing currency is not earning currency).'}, 'share_of_vol': {'type': ['number', 'null'], 'description': 'Share of the volatility that comes from exchange rates.'}, 'foreign_share': {'type': ['number', 'null'], 'description': 'Share of the money priced outside the base currency.'}, 'cagr_from_currency': {'type': ['number', 'null'], 'description': 'Growth per year added (or removed) by exchange rates.'}}, 'description': 'What exchange rates did to the portfolio, seen from the base currency.'}
factor_exposure
Sensitivity to common return patterns
How one portfolio's daily moves line up with four common patterns (the market, small versus large companies, value versus growth, momentum), which of those sensitivities are distinguishable from zero, and how much of the movement the patterns explain.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'factor_exposureArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'betas': {'description': 'Sensitivity per factor: mkt_rf (market), smb (small minus big), hml (value minus growth), mom (momentum).'}, 'model': {'type': ['string', 'null'], 'description': 'Factor model used.'}, 'years': {'type': ['number', 'null'], 'description': 'Years of history used.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 't_stats': {'description': 't-statistic per factor; below about 2 in size, not distinguishable from zero.'}, 'poor_fit': {'type': ['boolean', 'null'], 'description': 'True when the factors explain little.'}, 'frequency': {'type': ['string', 'null'], 'description': 'Data frequency.'}, 'r_squared': {'type': ['number', 'null'], 'description': 'Share of the daily movement the factors explain, 0 to 1.'}, 'fit_caveat': {'type': ['string', 'null'], 'description': 'Why the fit is poor, when it is.'}, 'alpha_annual': {'type': ['number', 'null'], 'description': 'Return not explained by the factors, per year (estimated, not a skill measure).'}}, 'description': "A four-factor regression of the portfolio's daily returns."}
health_axes
The portfolio along separate axes
One portfolio answered along three separate questions (what is its risk built from, how did it behave when markets broke, what did it pay for the risk taken), each with its own reading and figures. For whether anything is off in how it is built, rather than what it is. Readings, not a grade: no overall score is returned.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'health_axesArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'axes': {'description': 'Per axis: key, label, the question it answers, band, kind, drivers (each with label, value, unit and a plain reading).'}, 'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'kinds': {'description': 'What each kind of figure means (observed, replayed, estimated…).'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'inputs': {'description': 'What was measured: holdings, window, what was left out.'}, 'headline': {'type': ['string', 'null'], 'description': 'One sentence across the axes.'}, 'subscores': {'description': 'The individual measured readings behind the axes.'}, 'limitations': {'description': 'What these axes cannot show.'}}, 'description': 'The portfolio along separate axes; readings, no overall score.'}
last_price
Latest close
The latest daily close for each ticker, in the base currency and in its own, with the date, for turning a number of shares into an amount. A single figure per ticker; no price history is returned.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'last_priceArguments', 'required': ['tickers'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'tickers': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Tickers', 'maxItems': 50, 'description': 'Tickers, up to 50.'}}}
Esquema de salida
{'type': 'object', 'required': ['prices'], 'properties': {'base': {'type': ['string', 'null'], 'description': 'Base currency.'}, 'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'as_of': {'type': ['string', 'null'], 'description': 'Date of the close.'}, 'prices': {'description': 'Per ticker: latest close in the base currency.'}, 'currencies': {'description': 'Per ticker: its trading currency.'}, 'native_prices': {'description': 'Per ticker: latest close in its own currency.'}}, 'description': 'Latest close per ticker; single figures, no history.'}
living_off_it
Living off it: withdrawals replayed
For someone living off a portfolio: replays a yearly withdrawal, raised with real inflation, from every start month the portfolio's own history allows; how many starts lasted the full span, how many ran out and when, the lowest point from the worst start, and the highest yearly rate that ran out from no start in the record. Replayed, not simulated; a count of starts, never a probability; a span the record is too short for is said, not invented.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'living_off_itArguments', 'required': ['holdings', 'withdrawal'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'years': {'type': 'integer', 'title': 'Years', 'default': 30, 'maximum': 50, 'minimum': 5, 'description': 'How many years, 5 to 50.'}, 'amount': {'anyOf': [{'type': 'number', 'exclusiveMinimum': 0}, {'type': 'null'}], 'title': 'Amount', 'default': None, 'description': 'How much is in the portfolio, when `holdings` are weights rather than money.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}, 'withdrawal': {'type': 'number', 'title': 'Withdrawal', 'description': "Taken each year, in today's money; raised with the real price index of the base currency.", 'exclusiveMinimum': 0}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'rate': {'type': ['number', 'null'], 'description': 'withdrawal / amount.'}, 'worst': {'description': 'The worst start: start, ran_out, months, low_real, low_at, end_real.'}, 'years': {'type': ['number', 'null'], 'description': 'Span asked for.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'amount': {'type': ['number', 'null'], 'description': 'Money in the portfolio at each start.'}, 'record': {'description': 'start, end and years of the shared monthly record.'}, 'starts': {'description': 'A sample of starts (every sixth): start, complete, months, ran_out, low_real, end_real.'}, 'n_going': {'type': ['number', 'null'], 'description': 'Recent starts not run out so far, span not over.'}, 'n_starts': {'type': ['number', 'null'], 'description': 'Starts followed (at least a year).'}, 'inflation': {'description': 'Price index used: source, last_published, assumed.'}, 'n_ran_out': {'type': ['number', 'null'], 'description': 'Starts, complete or not, where the money ran out.'}, 'safe_rate': {'type': ['number', 'null'], 'description': 'Highest yearly rate that ran out from no start; null if no start is complete.'}, 'n_complete': {'type': ['number', 'null'], 'description': 'Starts old enough for the full span.'}, 'withdrawal': {'type': ['number', 'null'], 'description': 'Taken each year, in start-month money, raised with prices.'}, 'testable_years': {'type': ['number', 'null'], 'description': 'The longest span the record can test in full.'}, 'n_complete_lasted': {'type': ['number', 'null'], 'description': 'Of those, how many lasted.'}}, 'description': "Withdrawals replayed on the portfolio's own monthly history (replayed)."}
look_through
What the funds hold underneath
Only the companies owned through the funds of one portfolio, added up across funds: the largest names and their share of the whole portfolio, names reached through more than one fund, sectors, and how much of the money this view covers. Figures are minimums: funds publish their largest holdings.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'look_throughArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'opaque': {'description': 'Holdings with no breakdown to look through.'}, 'n_funds': {'type': ['number', 'null'], 'description': 'Funds looked through.'}, 'refused': {'description': 'Funds whose breakdown the data vendor refused.'}, 'sectors': {'description': '[sector, share] pairs.'}, 'exposures': {'description': '[company, share of the whole portfolio] pairs, largest first.'}, 'top_symbol': {'type': ['string', 'null'], 'description': 'The largest single company underneath.'}, 'n_companies': {'type': ['number', 'null'], 'description': 'Distinct companies seen underneath.'}, 'covered_fraction': {'type': ['number', 'null'], 'description': 'Share of the money whose underlying holdings are visible, 0 to 1.'}, 'top_symbol_weight': {'type': ['number', 'null'], 'description': 'Its share of the whole portfolio.'}, 'duplicated_exposure': {'type': ['number', 'null'], 'description': 'Share held more than once through different funds.'}}, 'description': 'What the portfolio owns through its funds.'}
measure_portfolio
Measure a portfolio
The complete measurement of one portfolio in a single call: how many independent bets it holds, which holding carries risk out of line with its money, the companies owned through its funds (with how much of the money that view covers), what past crises did to it in money and how long it took to come back, and the numbered report. Each part is also available on its own, faster: portfolio_structure, look_through, past_crises, portfolio_report. Descriptive: no forecast, no advice.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'measure_portfolioArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'report': {'properties': {'end': {'type': ['string', 'null'], 'description': 'Window end.'}, 'facts': {'description': 'One entry per figure: id, label, value, method, window, limit.'}, 'start': {'type': ['string', 'null'], 'description': 'Window start.'}, 'receipt': {'type': ['string', 'null'], 'description': 'A short plain-text receipt of the same figures.'}, 'markdown': {'type': ['string', 'null'], 'description': 'The report as markdown, figures numbered F1, F2…'}}, 'description': 'The numbered report: every figure beside its method.'}, 'stress': {'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'scenarios': {'type': ['array', 'null'], 'items': {'type': 'object', 'properties': {'end': {'type': ['string', 'null'], 'description': 'Window end.'}, 'start': {'type': ['string', 'null'], 'description': 'Window start.'}, 'status': {'type': ['string', 'null'], 'description': "Whether the holdings' history covers it."}, 'scenario': {'type': ['string', 'null'], 'description': 'Crisis name.'}, 'worst_day': {'type': ['number', 'null'], 'description': 'Worst single day.'}, 'max_drawdown': {'type': ['number', 'null'], 'description': 'Worst peak-to-trough fall.'}, 'total_return': {'type': ['number', 'null'], 'description': 'Return over the crisis window.'}, 'recovery_days': {'type': ['number', 'null'], 'description': 'Days to recover the previous peak; null if not yet.'}}}, 'description': 'One entry per crisis.'}, 'limited_by': {'type': ['string', 'null'], 'description': 'The holding whose short history limits the window.'}, 'window_start': {'type': ['string', 'null'], 'description': 'First date all holdings have prices.'}}, 'description': 'What past crises did to this mix, replayed on its holdings.'}, 'structure': {'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'recent': {'description': 'The same figures over the recent years only.'}, 'max_weight': {'type': ['number', 'null'], 'description': 'Its share of the money, 0 to 1.'}, 'n_holdings': {'type': ['number', 'null'], 'description': 'Holdings measured.'}, 'effective_bets': {'type': ['number', 'null'], 'description': 'Effective number of independent bets (from correlations, not the ticker count).'}, 'max_risk_ticker': {'type': ['string', 'null'], 'description': "The holding carrying the largest share of the portfolio's risk."}, 'top_factor_share': {'type': ['number', 'null'], 'description': 'Share of the movement explained by the single strongest common factor.'}, 'max_weight_ticker': {'type': ['string', 'null'], 'description': 'The largest holding by money.'}, 'risk_contributions': {'description': '[ticker, share of risk] pairs.'}, 'max_risk_contribution': {'type': ['number', 'null'], 'description': "That holding's share of the risk, 0 to 1."}}, 'description': 'How many independent bets the holdings add up to and who carries the risk.'}, 'lookthrough': {'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'opaque': {'description': 'Holdings with no breakdown to look through.'}, 'n_funds': {'type': ['number', 'null'], 'description': 'Funds looked through.'}, 'refused': {'description': 'Funds whose breakdown the data vendor refused.'}, 'sectors': {'description': '[sector, share] pairs.'}, 'exposures': {'description': '[company, share of the whole portfolio] pairs, largest first.'}, 'top_symbol': {'type': ['string', 'null'], 'description': 'The largest single company underneath.'}, 'n_companies': {'type': ['number', 'null'], 'description': 'Distinct companies seen underneath.'}, 'covered_fraction': {'type': ['number', 'null'], 'description': 'Share of the money whose underlying holdings are visible, 0 to 1.'}, 'top_symbol_weight': {'type': ['number', 'null'], 'description': 'Its share of the whole portfolio.'}, 'duplicated_exposure': {'type': ['number', 'null'], 'description': 'Share held more than once through different funds.'}}, 'description': 'What the portfolio owns through its funds.'}}, 'description': 'The full measurement of one portfolio.'}
past_crises
What past crises did to this mix
Only past crises for one portfolio: 2008, 2020, 2022 and others inside its price history, with the fall, the worst day and the days it took to come back, in money when amounts are given. Crises before a holding existed are named as not tested. Measured, not forecast.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'past_crisesArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'scenarios': {'type': ['array', 'null'], 'items': {'type': 'object', 'properties': {'end': {'type': ['string', 'null'], 'description': 'Window end.'}, 'start': {'type': ['string', 'null'], 'description': 'Window start.'}, 'status': {'type': ['string', 'null'], 'description': "Whether the holdings' history covers it."}, 'scenario': {'type': ['string', 'null'], 'description': 'Crisis name.'}, 'worst_day': {'type': ['number', 'null'], 'description': 'Worst single day.'}, 'max_drawdown': {'type': ['number', 'null'], 'description': 'Worst peak-to-trough fall.'}, 'total_return': {'type': ['number', 'null'], 'description': 'Return over the crisis window.'}, 'recovery_days': {'type': ['number', 'null'], 'description': 'Days to recover the previous peak; null if not yet.'}}}, 'description': 'One entry per crisis.'}, 'limited_by': {'type': ['string', 'null'], 'description': 'The holding whose short history limits the window.'}, 'window_start': {'type': ['string', 'null'], 'description': 'First date all holdings have prices.'}}, 'description': 'What past crises did to this mix, replayed on its holdings.'}
plain_findings
The findings in plain words
Three or four plain-language sentences about one portfolio (what its risk is built from and its worst historical fall), each with the window it rests on. The shortest and fastest answer, with no tables and no numbered report; every figure is in measure_portfolio.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'plain_findingsArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'insights': {'description': 'Per finding: key, title, detail, severity (info or warning), evidence.'}}, 'description': 'A few findings in plain words, each with its evidence.'}
portfolio_report
The numbered report
Only the written report on one portfolio: every figure numbered F1, F2... beside the method and window behind it, so each can be quoted by its number. The same report measure_portfolio includes, without the other sections.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'portfolio_reportArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'end': {'type': ['string', 'null'], 'description': 'Window end.'}, 'facts': {'description': 'One entry per figure: id, label, value, method, window, limit.'}, 'start': {'type': ['string', 'null'], 'description': 'Window start.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'receipt': {'type': ['string', 'null'], 'description': 'A short plain-text receipt of the same figures.'}, 'markdown': {'type': ['string', 'null'], 'description': 'The report as markdown, figures numbered F1, F2…'}}, 'description': 'The numbered report: every figure beside its method.'}
portfolio_structure
How many real bets, and who carries the risk
Only the structure of one portfolio: how many independent bets its holdings add up to (from how their prices moved, not how many tickers there are), and each holding's share of the risk beside its share of the money, over the full record and over recent years.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'portfolio_structureArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'recent': {'description': 'The same figures over the recent years only.'}, 'max_weight': {'type': ['number', 'null'], 'description': 'Its share of the money, 0 to 1.'}, 'n_holdings': {'type': ['number', 'null'], 'description': 'Holdings measured.'}, 'effective_bets': {'type': ['number', 'null'], 'description': 'Effective number of independent bets (from correlations, not the ticker count).'}, 'max_risk_ticker': {'type': ['string', 'null'], 'description': "The holding carrying the largest share of the portfolio's risk."}, 'top_factor_share': {'type': ['number', 'null'], 'description': 'Share of the movement explained by the single strongest common factor.'}, 'max_weight_ticker': {'type': ['string', 'null'], 'description': 'The largest holding by money.'}, 'risk_contributions': {'description': '[ticker, share of risk] pairs.'}, 'max_risk_contribution': {'type': ['number', 'null'], 'description': "That holding's share of the risk, 0 to 1."}}, 'description': 'How many independent bets the holdings add up to and who carries the risk.'}
return_history
The record, month by month
What one portfolio returned over its record: growth per year (and after inflation), best and worst months and years, the range of any 12 months in a row, monthly returns by year, and how far the weights drift between rebalances. Past record, not a forecast.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'return_historyArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'cagr': {'type': ['number', 'null'], 'description': 'Growth per year over the record.'}, 'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'grid': {'description': 'Monthly returns: one row per year, null where the record has no month.'}, 'drift': {'description': 'Per holding: target weight and how far it drifted between rebalances.'}, 'stats': {'description': 'best_month, worst_month, best_year, worst_year, pct_positive, n_months, var95, cvar95, real_cagr (after inflation).'}, 'years': {'description': 'Calendar years.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'months': {'description': 'Month names, aligned with each row of `grid`.'}, 'yearly': {'description': 'Return per calendar year, aligned with `years`.'}, 'distribution': {'description': 'Histogram of monthly returns: centers, counts.'}, 'rolling_stats': {'description': 'Any 12 months in a row: min, max, percentiles, share negative.'}}, 'description': "The mix's record: yearly and monthly returns, rolling 12 months, drift."}
reverse_stress
What it would take to lose that much
Starts from a loss the holder names (as a fraction: 0.25 is a quarter) and reports the least extreme combination of market moves that would produce it on this portfolio, beside the worst each of those moves actually did in the record. No probability is computed.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'reverse_stressArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'loss': {'type': 'number', 'title': 'Loss', 'default': 0.2, 'maximum': 0.95, 'description': 'The loss to explain, as a fraction: 0.25 = lose a quarter.', 'exclusiveMinimum': 0.005}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'line': {'type': ['string', 'null'], 'description': 'One sentence: what it would take.'}, 'moves': {'description': 'Per market direction: label, plain wording, shock needed, sensitivity (beta), share of the loss, worst_seen in the record over the same number of days.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'target': {'type': ['number', 'null'], 'description': 'The loss explained, as a negative fraction.'}, 'coverage': {'type': ['number', 'null'], 'description': "Share of the portfolio's movement these directions explain."}, 'window_end': {'type': ['string', 'null'], 'description': 'Record end.'}, 'window_days': {'type': ['number', 'null'], 'description': 'Length of the move considered, in trading days.'}, 'window_start': {'type': ['string', 'null'], 'description': 'Record start.'}}, 'description': 'The least extreme market moves that would produce the given loss.'}
search_symbols
Find a ticker by name
Finds the ticker when the holder gives a name, part of a ticker or an ISIN (for example 'Vanguard total world' gives VT), with the exchange it trades on. Useful before a measurement whenever a ticker is not certain. Listings nobody here has checked are marked unchecked.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'search_symbolsArguments', 'required': ['query'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'query': {'type': 'string', 'title': 'Query', 'maxLength': 40, 'description': 'A fund or company name, a ticker, or an ISIN.'}}}
Esquema de salida
{'type': 'object', 'required': ['results'], 'properties': {'results': {'type': 'array', 'items': {'type': 'object', 'properties': {'name': {'type': ['string', 'null'], 'description': 'Fund or company name.'}, 'type': {'type': ['string', 'null'], 'description': 'ETF, equity, fund…'}, 'symbol': {'type': ['string', 'null'], 'description': 'Ticker as the exchange lists it; pass this to the measuring tools.'}, 'currency': {'type': ['string', 'null'], 'description': 'Trading currency.'}, 'exchange': {'type': ['string', 'null'], 'description': 'Exchange.'}, 'experimental': {'type': ['boolean', 'null'], 'description': 'True for listings nobody here has checked.'}}}, 'description': 'Matches, best first.'}}, 'description': 'Listings matching the query.'}
simulate_paths
Paths drawn from the record (simulated)
Simulated, not a forecast: 4,000 paths resampled from one portfolio's own price history, with optional monthly additions; where the middle path and the outer tenths end after the years asked, in money and in today's money, and the share of paths ending below what was put in. It assumes the future pays what the record paid, and it is refused when the record is too short or too extreme for the years asked.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'simulate_pathsArguments', 'required': ['holdings'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'years': {'type': 'integer', 'title': 'Years', 'default': 20, 'maximum': 40, 'minimum': 1, 'description': 'Years to run the paths, 1 to 40.'}, 'haircut': {'type': 'number', 'title': 'Haircut', 'default': 0.0, 'maximum': 0.15, 'minimum': 0, 'description': 'Yearly return removed from every path, as a fraction (0.02 = assume 2% a year less than the record paid).'}, 'monthly': {'type': 'number', 'title': 'Monthly', 'default': 0.0, 'maximum': 1000000, 'minimum': 0, 'description': 'Amount added every month, in the base currency.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'kind': {'type': ['string', 'null'], 'description': 'simulated.'}, 'bands': {'description': 'Percentile paths over time: p5 … p95, aligned with `years`.'}, 'years': {'description': 'Time axis of the bands, in years.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'refused': {'description': 'Present when no paths were drawn: the reasons, in words.'}, 'invested': {'type': ['number', 'null'], 'description': 'Money put in over the years asked.'}, 'terminal': {'description': 'Where the paths end, by percentile: p5, p10, p25, p50, p75, p90, p95.'}, 'youngest': {'type': ['string', 'null'], 'description': 'When refused: the holding whose short history cut the record.'}, 'assumption': {'type': ['string', 'null'], 'description': 'The assumption every path rests on.'}, 'sample_years': {'type': ['number', 'null'], 'description': 'Years of shared history the paths are drawn from.'}, 'extrapolation': {'type': ['number', 'null'], 'description': 'Years asked divided by years of history.'}, 'terminal_real': {'description': "The same in today's money."}, 'historical_cagr': {'type': ['number', 'null'], 'description': 'Growth per year the record paid.'}, 'prob_below_real': {'type': ['number', 'null'], 'description': 'The same after inflation.'}, 'prob_below_invested': {'type': ['number', 'null'], 'description': 'Share of paths ending below what was put in (a share of simulated paths, not a probability of the future).'}}, 'description': 'Paths resampled from the record (SIMULATED), or the reasons they were refused.'}
sweep_holding
One holding across its whole range
One holding already in the portfolio, measured at every weight from none to all (the rest of the money redistributed in proportion): volatility, its share of the risk and the independent bets at each point, and whether most of the change comes from the first slice. For how much of it is enough to change anything. Counterfactual; never says what weight to hold.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'sweep_holdingArguments', 'required': ['holdings', 'ticker'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'ticker': {'type': 'string', 'title': 'Ticker', 'maxLength': 20, 'description': 'The holding to sweep; must be one of `holdings`.'}, 'holdings': {'type': 'object', 'title': 'Holdings', 'description': "What is held: {ticker: weight or amount}. Weights need not sum to one; amounts in the base currency are also accepted (then the crises are shown in money). 1 to 100 holdings. Tickers as the exchange lists them (VOO, VWCE.DE, XAW.TO; 'CASH.USD' for cash).", 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'end': {'type': ['string', 'null'], 'description': 'Window end.'}, 'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'kind': {'type': ['string', 'null'], 'description': 'Kind of figures (counterfactual).'}, 'knee': {'type': ['number', 'null'], 'description': 'Weight below which most of the change happens, when there is one.'}, 'note': {'type': ['string', 'null'], 'description': 'One sentence on where the change comes from.'}, 'start': {'type': ['string', 'null'], 'description': 'Window start.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'points': {'description': "Per weight: weight, vol (volatility), risk_share (that holding's share of the risk), effective_bets, top_factor_share."}, 'ticker': {'type': ['string', 'null'], 'description': 'The holding swept.'}, 'total_change': {'type': ['number', 'null'], 'description': 'Change in volatility from none to the current weight.'}, 'redistribution': {'type': ['string', 'null'], 'description': 'How the rest of the money is spread at each point.'}}, 'description': 'One holding at every weight from none to all (counterfactual).'}
test_a_change
Before and after a proposed change
Any change to one portfolio, measured before it is made: the current and the proposed holdings side by side on the same price history (structure, risk, worst falls, and what the change adds or removes). For a single new holding, check_before_you_buy says more; for one holding at every weight, sweep_holding. The 'after' figures are counterfactual. Never says whether to make the change.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'test_a_changeArguments', 'required': ['current', 'proposed'], 'properties': {'end': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'End', 'default': None, 'description': 'Optional window end, YYYY-MM-DD.'}, 'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'start': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Start', 'default': None, 'description': 'Optional window start, YYYY-MM-DD.'}, 'current': {'type': 'object', 'title': 'Current', 'description': 'What is held now, {ticker: weight}.', 'additionalProperties': {'type': 'number'}}, 'proposed': {'type': 'object', 'title': 'Proposed', 'description': 'What would be held after the change, {ticker: weight}.', 'additionalProperties': {'type': 'number'}}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'axes': {'description': 'Per axis: label, the question it answers, before, after.'}, 'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'kind': {'type': ['string', 'null'], 'description': 'Kind of figures (counterfactual).'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'deltas': {'description': 'Per measure: label, before, after, direction, unit.'}, 'window': {'description': 'The shared window: start, end, years, which holding set it, crises inside.'}, 'similar': {'description': 'Measures that barely moved.'}, 'summary': {'type': ['string', 'null'], 'description': 'One sentence on what the change moves.'}, 'improved': {'description': 'Measures that moved one way.'}, 'worsened': {'description': 'Measures that moved the other way.'}, 'historical': {'description': 'Per past crisis: before and after.'}, 'introduces': {'description': 'Risk the proposed holdings add that the current ones did not carry.'}, 'kind_means': {'type': ['string', 'null'], 'description': 'What that kind means.'}, 'limitations': {'description': 'What this comparison cannot show.'}}, 'description': "The current and the proposed portfolio on the same history. The 'after' figures are counterfactual: that portfolio was not held."}
validate_symbols
Check symbols before measuring
Checks a list of tickers before a measurement: which have usable price history, which do not, and the closest listing where a symbol is ambiguous.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'validate_symbolsArguments', 'required': ['tickers'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'tickers': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Tickers', 'maxItems': 150, 'description': 'Tickers to check, up to 150.'}}}
Esquema de salida
{'type': 'object', 'required': ['valid'], 'properties': {'base': {'type': ['string', 'null'], 'description': 'Base currency.'}, 'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, 'valid': {'description': 'Per ticker: true when it has usable price history.'}, 'problems': {'description': 'Per failing ticker: why.'}, 'currencies': {'description': 'Per ticker: its trading currency.'}, 'suggestions': {'description': 'Per ambiguous ticker: the closest listing.'}}, 'description': 'Which tickers can be measured.'}
walk_forward
Would refitting have helped? (out of sample)
Whether re-optimising an allocation would have helped: refit on the years before each date, hold it on prices it had not seen, repeat, and compare that record with the portfolio actually held and with equal weight. Says whether refitting bought anything measurable. Returns the record, never an allocation to hold.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'title': 'walk_forwardArguments', 'required': ['tickers'], 'properties': {'base': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Base', 'default': None, 'description': 'Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.'}, 'tickers': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Tickers', 'maxItems': 30, 'minItems': 2, 'description': 'The candidate holdings, 2 to 30.'}, 'holdings': {'anyOf': [{'type': 'object', 'additionalProperties': {'type': 'number'}}, {'type': 'null'}], 'title': 'Holdings', 'default': None, 'description': 'Optional: the portfolio actually held, {ticker: weight}, measured on the same span for comparison.'}, 'objective': {'type': 'string', 'title': 'Objective', 'default': 'max_sharpe', 'description': 'What each refit maximises or minimises: max_sharpe, min_variance, min_drawdown, min_cvar or max_quadratic_utility.'}, 'step_months': {'type': 'integer', 'title': 'Step Months', 'default': 12, 'maximum': 36, 'minimum': 1, 'description': 'Months each fitted mix is held.'}, 'train_years': {'type': 'number', 'title': 'Train Years', 'default': 3.0, 'maximum': 15, 'minimum': 1, 'description': 'Years of history each refit sees.'}}}
Esquema de salida
{'type': 'object', 'required': ['_fence'], 'properties': {'data': {'properties': {'as_of': {'type': ['string', 'null'], 'description': 'Last date of price history used.'}, 'source': {'type': ['string', 'null'], 'description': 'Price source.'}, 'missing': {'description': 'Tickers with no usable history (left out).'}, 'currency': {'type': ['string', 'null'], 'description': 'Currency the figures are in.'}, 'standins': {'description': 'Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence.'}}, 'description': 'Where the prices came from and what was missing or repaired.'}, '_fence': {'type': ['string', 'null'], 'description': 'What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result.'}, 'objective': {'type': ['string', 'null'], 'description': 'What each refit optimised.'}, 'fitted_window': {'description': 'First and last date of shared history.'}, 'out_of_sample': {'description': 'start, end, n_refits, train_years, step_months, mean_turnover, verdict (one sentence on the record), limitations, tracks (per track: label, cagr, vol, sharpe, max_drawdown, nav), refits (date, turnover); or `unavailable` with the reason.'}}, 'description': 'An allocation method tested out of sample; no allocation is returned.'}
Modificado
living_off_it
2 de October de 2026 a las 02:41
Modificado
check_before_you_buy
2 de October de 2026 a las 02:41
Modificado
walk_forward
2 de October de 2026 a las 02:41
Modificado
simulate_paths
2 de October de 2026 a las 02:41
Modificado
asset_info
2 de October de 2026 a las 02:41
Modificado
last_price
2 de October de 2026 a las 02:41
Modificado
plain_findings
2 de October de 2026 a las 02:41
Modificado
return_history
2 de October de 2026 a las 02:41
Modificado
reverse_stress
2 de October de 2026 a las 02:41
Modificado
sweep_holding
2 de October de 2026 a las 02:41
Modificado
health_axes
2 de October de 2026 a las 02:41
Modificado
currency_effect
2 de October de 2026 a las 02:41
Modificado
factor_exposure
2 de October de 2026 a las 02:41
Modificado
portfolio_report
2 de October de 2026 a las 02:41
Modificado
past_crises
2 de October de 2026 a las 02:41
Modificado
look_through
2 de October de 2026 a las 02:41
Modificado
portfolio_structure
2 de October de 2026 a las 02:41
Modificado
validate_symbols
2 de October de 2026 a las 02:41
Modificado
search_symbols
2 de October de 2026 a las 02:41
Modificado
test_a_change
2 de October de 2026 a las 02:41
Modificado
compare_portfolios
2 de October de 2026 a las 02:41
Modificado
measure_portfolio
2 de October de 2026 a las 02:41
Añadido
living_off_it
26 de September de 2026 a las 02:40
Añadido
check_before_you_buy
26 de September de 2026 a las 02:40
Añadido
walk_forward
26 de September de 2026 a las 02:40
Añadido
simulate_paths
26 de September de 2026 a las 02:40
Añadido
asset_info
26 de September de 2026 a las 02:40
Añadido
last_price
26 de September de 2026 a las 02:40
Añadido
plain_findings
26 de September de 2026 a las 02:40
Añadido
return_history
26 de September de 2026 a las 02:40