Measures a portfolio from price history: independent bets, what funds own, past crises. No advice.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
One fund or share on its own: name, type, exchange, yearly cost when published, measured return, volatility and worst fall, and for a fund its largest holdings and sectors. Typical questions: 'What is EQQQ.DE?'; 'Tell me about this ETF before I add it.'; 'What's inside VXUS?'. Instead: for a whole portfolio's companies, look_through. Non-US listings need the exchange suffix (VWCE.DE, IWDA.AS); search_symbols finds it. It does not recommend, predict or calculate tax.
One ticker, as the exchange lists it.
One fund or share on its own: name, type, exchange, yearly cost when published, measured return, volatility and worst fall, and for a fund its largest holdings and sectors. Typical questions: 'What is EQQQ.DE?'; 'Tell me about this ETF before I add it.'; 'What's inside VXUS?'. Instead: for a whole portfolio's companies, look_through. Non-US listings need the exchange suffix (VWCE.DE, IWDA.AS); search_symbols finds it. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| ticker* | string | One ticker, as the exchange lists it. |
{
"type": "object",
"title": "asset_infoArguments",
"required": [
"ticker"
],
"properties": {
"ticker": {
"type": "string",
"title": "Ticker",
"maxLength": 20,
"description": "One ticker, as the exchange lists it."
}
}
}Before adding one new holding to a portfolio: how much of it is already owned through the current funds, whether it adds an independent bet, what past crises would have done with it, and a decision sheet with three columns: now, the same money kept as cash, the money in the new holding. Typical questions: 'I'm thinking of adding $10,000 of QQQ with new cash: what changes versus keeping it in cash?'; 'Check before I buy SCHD.'; 'Test adding an ETF to my portfolio.'. Instead: for selling, reweighting or several changes at once, test_a_change. The 'after' portfolio was never held; it never says whether to buy. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| add* | string | The one ticker being considered. |
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| amount* | number | How much of it, in the same units as `holdings` (money when holdings are amounts). |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"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": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"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: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}Two to eight separate portfolios on one shared window of prices. In: {label: {ticker: weight}}. Out: growth, volatility, worst fall, and how each moved against the others. Typical questions: 'Compare 60/40 with an all-world fund.'; 'Which of these three mixes fell less in 2022?'; 'Put my portfolio next to the S&P 500.'. Instead: for one portfolio before and after a change, test_a_change or check_before_you_buy. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| portfolios* | object | Two to eight portfolios, {label: {ticker: weight}}. Labels are shortened to letters and digits. |
{
"type": "object",
"title": "compare_portfoliosArguments",
"required": [
"portfolios"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code 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"
}
}
}
}
}For a portfolio held in one currency but priced partly in others: how much is outside the base currency, and what exchange rates added to growth, volatility and the worst fall, against the same holdings currency-hedged. Typical questions: 'I'm in euros but hold US funds: what did the dollar do to me?'; 'How much currency risk is in this?'; 'Hedged or not, what was the difference?'. Limits: Only when some holdings are priced in another currency than the holder's. base must be set to the holder's currency. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"type": "object",
"title": "currency_effectArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}How a portfolio's daily moves line up with four common patterns: the market, small versus large, value versus growth, momentum. Out: each sensitivity, whether it can be told from zero, and how much of the movement the four explain. Typical questions: 'Am I a growth investor without knowing it?'; 'What style is my portfolio really exposed to?'; 'Is this tilted to small caps?'. Instead: for the number of independent bets, portfolio_structure. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"type": "object",
"title": "factor_exposureArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}One portfolio read along three separate questions: what its risk is built from, how it behaved when markets broke, and what it returned for the risk taken, each with its own figures and no overall score. Typical questions: 'Is anything off in how my portfolio is built?'; 'How did this hold up in bad markets, and was the return worth the swings?'; 'Check the construction of this portfolio.'. Instead: for the full measurement, measure_portfolio. An axis without enough history comes back without a reading. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"type": "object",
"title": "health_axesArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}The latest daily close for each ticker, in its own currency and in the base currency, with the date. Typical questions: 'What's the last price of VWCE?'; 'Turn 120 shares of VTI into dollars.'; 'Latest close for these tickers.'. Instead: for history and figures of one asset, asset_info. One price per ticker, no history. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| tickers* | array | Tickers, up to 50. |
{
"type": "object",
"title": "last_priceArguments",
"required": [
"tickers"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code 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."
}
}
}A yearly withdrawal, raised with real inflation, replayed from every start month the 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. Typical questions: 'Can I live off $1M taking $40,000 a year for 30 years?'; 'Would a 4% withdrawal have lasted on this portfolio?'; 'How long would this money have lasted in retirement?'. Instead: for money put in every month instead, monthly_plan. A count of past starts, never a probability. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| years | integer | How many years, 5 to 50. |
| amount | any | How much is in the portfolio, when `holdings` are weights rather than money. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
The companies a portfolio owns through its funds, added up across funds. In: holdings. Out: the largest companies with their share of the whole portfolio, companies reached through more than one fund, the part of the money that buys a company a second time, sectors, and how much of the money could be named. Typical questions: 'How much do my ETFs overlap?'; 'What companies do I really own through VTI, QQQ and VXUS?'; 'How much NVIDIA do I hold through my funds?'. Instead: for one fund on its own, asset_info. Figures are minimums where a fund shows only its largest holdings; the answer says how much of the money is named. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"type": "object",
"title": "look_throughArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}The full measurement of one portfolio in one call. In: holdings as weights or money amounts. Out: how many independent bets they make, each holding's share of the risk beside its share of the money, the companies owned through the funds, what past crises did and how long recovery took, and the numbered report. Typical questions: 'Analyze my portfolio: 60% VTI, 30% VXUS, 10% BND.'; 'What should I know about what I hold?'; 'Give me the full picture of this portfolio.'. Instead: for one narrow question use the narrower tool: portfolio_structure (spread of risk), look_through (companies), past_crises (crashes). For a quotable text with numbered figures, portfolio_report. For the shortest answer, plain_findings. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
The same amount bought on the first trading day of each month, replayed on a portfolio's own history with dividends reinvested: what it became against what was put in, the deepest point below the money put in, and the same plan from every possible starting January. Typical questions: 'If I put $500 a month into these, what would it have become?'; 'Dollar-cost averaging into VTI since 2007?'; 'Monthly investing: what was the hardest stretch?'. Instead: for withdrawals, living_off_it. For the record itself, return_history. Before taxes and fees. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| start | any | The year whose January the plan starts in; the record's first whole January when absent. |
| monthly* | number | Amount bought every month, in the base currency. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
What past crises did to one portfolio held as it is today: 2008, 2020, 2022 and the others inside its price history. In: holdings. Out: for each crisis the deepest fall, the worst day and the days until the previous high came back; crises before a holding existed are named as not tested. Typical questions: 'How much would 2008 have cost me with 60% VTI, 20% VXUS, 20% BND?'; 'What did the 2020 crash do to this mix?'; 'Simulate a market crash on my portfolio.'. Instead: for a loss chosen by the reader ('what would it take to lose 30%?'), reverse_stress. For the whole record, return_history. Holdings in money give each fall in money; in percentages the falls are percentages. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
Three or four plain sentences about one portfolio, how its risk is built and its worst historical fall, each with its window. Typical questions: 'Explain my portfolio simply.'; 'In plain words, what should I know?'; 'I'm new to investing: what does this portfolio look like?'. Instead: for the figures in full, measure_portfolio. For a quotable numbered report, portfolio_report. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"type": "object",
"title": "plain_findingsArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}The written report on one portfolio, every figure numbered F1, F2… beside its method and window. In: holdings. Out: a text to quote or keep. Typical questions: 'Write me a report on this portfolio I can keep.'; 'Give me the numbers with their sources.'; 'A citable summary of my portfolio, please.'. Instead: for the full structured measurement, measure_portfolio (which includes this report). For a few plain sentences, plain_findings. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"type": "object",
"title": "portfolio_reportArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}How many independent bets a portfolio's holdings make, from how their prices moved together rather than how many tickers there are, and each holding's share of the risk beside its share of the money, over the full record and recent years. Shares of the risk are Euler contributions and add up to 100%. Typical questions: 'Am I really diversified?'; 'Which of my holdings is behind most of the risk?'; 'Do my four funds move as one?'. Instead: for the companies inside the funds, look_through. For everything at once, measure_portfolio. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"type": "object",
"title": "portfolio_structureArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}What one portfolio returned over its record: growth per year before and after inflation, best and worst months and years, every 12-month stretch, returns by month and year, and weight drift between rebalances. Typical questions: 'How did this portfolio do over the years?'; 'What was its worst year?'; 'Returns after inflation, please.'. Instead: for crises only, past_crises. For money put in every month, monthly_plan. Past record, not a forecast. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| units | any | What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"type": "object",
"title": "return_historyArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}Starts from a loss the reader names and finds the least extreme combination of market moves that would cause it on this portfolio, beside the worst each move actually did in the record; also each single company on its own. Typical questions: 'What would it take to lose 30%?'; 'A third of my portfolio is my employer's stock: what would a crash in it take from me?'; 'How bad would markets have to get for me to lose a quarter?'. Instead: for what past crises actually did, past_crises. No probability is computed: it says how large the moves would be, not how likely. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| loss | number | The loss to explain, as a fraction: 0.25 = lose a quarter. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"type": "object",
"title": "reverse_stressArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code 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: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}Finds tickers from a name, part of a ticker or an ISIN, with the exchange of each listing. In: one search phrase. Out: up to ten listings, those not yet checked marked as such. Typical questions: 'What's the ticker for Vanguard FTSE All-World?'; 'Find IE00BK5BQT80.'; 'Is there a euro listing of the Nasdaq 100 ETF?'. Instead: when the tickers are already written down, validate_symbols. A bare US-style symbol can name a different fund than a European one with the same letters (EQQQ is a US ProShares fund; the Invesco UCITS fund is EQQQ.DE / EQQQ.L): give the exchange suffix. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| query* | string | A fund or company name, a ticker, or an ISIN. |
{
"type": "object",
"title": "search_symbolsArguments",
"required": [
"query"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code 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."
}
}
}One holding already in the portfolio, measured at every weight from none to all, the rest of the money shared out in proportion: volatility, its share of the risk and the number of independent bets at each point. Typical questions: 'How much BND does it take to change anything?'; 'Show me my portfolio with 0% to 100% QQQ.'; 'At what weight does gold start to matter here?'. Instead: for one specific change, test_a_change. For a holding not yet owned, check_before_you_buy. It never says which weight to hold. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| ticker* | string | The holding to sweep; must be one of `holdings`. |
| holdings* | object | What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {"VTI": 60, "VXUS": 20, "BND": 20}. |
{
"type": "object",
"title": "sweep_holdingArguments",
"required": [
"holdings",
"ticker"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code 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: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}Any change to one portfolio, measured before it is made: current and proposed holdings side by side on the same prices. In: two sets of holdings. Out: structure, share of the risk, falls in past crises, and what the change adds or removes; the figures are in the structured result. Typical questions: 'What happens if I sell half my QQQ and buy BND?'; 'Compare my portfolio now with this rebalanced version.'; 'I want to swap VXUS for VWO: before and after?'. Instead: for adding ONE new holding (how much of it is already owned, and a 'kept as cash' column) use check_before_you_buy. For one holding at every weight, sweep_holding. For separate unrelated portfolios, compare_portfolios. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| end | any | Optional window end, YYYY-MM-DD. |
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| start | any | Optional window start, YYYY-MM-DD. |
| current* | object | What is held now, {ticker: weight}. |
| proposed* | object | What would be held after the change, {ticker: weight}. |
{
"type": "object",
"title": "test_a_changeArguments",
"required": [
"current",
"proposed"
],
"properties": {
"end": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "End",
"default": null,
"description": "Optional window end, YYYY-MM-DD."
},
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"start": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Start",
"default": null,
"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"
}
}
}
}Checks tickers before a measurement. In: up to 150 tickers. Out: which have usable price history, their trading currency, and the closest listings for those that do not. Typical questions: 'Check these tickers before you measure: VWCE, EQQQ, CSPX.'; 'Are VTI and BND valid?'; 'Which of these symbols can you price?'. Instead: when only a name is known, search_symbols. It measures nothing. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| tickers* | array | Tickers to check, up to 150. |
{
"type": "object",
"title": "validate_symbolsArguments",
"required": [
"tickers"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code 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."
}
}
}Whether re-optimising an allocation would have helped: fit on the years before each date, hold on prices not yet seen, repeat, and compare with the portfolio held and with equal weights. Typical questions: 'Would an optimiser have beaten my portfolio?'; 'Test max-Sharpe out of sample on these funds.'; 'Does rebalancing to an optimised mix help?'. Limits: Only for that question; it is not for choosing weights and returns no allocation to hold. It does not recommend, predict or calculate tax.
| Argument | Type | Description |
|---|---|---|
| base | any | Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD. |
| tickers* | array | The candidate holdings, 2 to 30. |
| holdings | any | Optional: the portfolio actually held, {ticker: weight}, measured on the same span for comparison. |
| objective | string | What each refit maximises or minimises: max_sharpe, min_variance, min_drawdown, min_cvar or max_quadratic_utility. |
| step_months | integer | Months each fitted mix is held. |
| train_years | number | Years of history each refit sees. |
| withdrawal* | number | Taken each year, in today's money; raised with the real price index of the base currency. |
{
"type": "object",
"title": "living_off_itArguments",
"required": [
"holdings",
"withdrawal"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"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": null,
"description": "How much is in the portfolio, when `holdings` are weights rather than money."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"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
}
}
}{
"type": "object",
"title": "measure_portfolioArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}{
"type": "object",
"title": "monthly_planArguments",
"required": [
"holdings",
"monthly"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"start": {
"anyOf": [
{
"type": "integer",
"maximum": 2100,
"minimum": 1900
},
{
"type": "null"
}
],
"title": "Start",
"default": null,
"description": "The year whose January the plan starts in; the record's first whole January when absent."
},
"monthly": {
"type": "number",
"title": "Monthly",
"maximum": 1000000000,
"description": "Amount bought every month, in the base currency.",
"exclusiveMinimum": 0
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}{
"type": "object",
"title": "past_crisesArguments",
"required": [
"holdings"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code every figure is expressed in: USD, EUR, GBP, CAD… Default USD."
},
"units": {
"anyOf": [
{
"enum": [
"money",
"weights"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Units",
"default": null,
"description": "What the holdings' numbers are: 'money' (amounts in the base currency) or 'weights' (percentages or fractions). Omitted: holdings adding up to 1 or 100 are read as percentages, anything else as money, and the answer says so."
},
"holdings": {
"type": "object",
"title": "Holdings",
"description": "What is held: {ticker: number}, 1 to 100 holdings. Weights in any scale (60/20/20 or 0.6/0.2/0.2) or money amounts in the base currency (60000/20000/20000): `units` says which; without it, holdings adding up to 1 or 100 are read as percentages, anything else as money, which makes the falls come out in money. Tickers as the exchange lists them (VOO, VWCE.DE, EQQQ.DE, XAW.TO; 'CASH.USD' for cash). Example: {\"VTI\": 60, \"VXUS\": 20, \"BND\": 20}.",
"additionalProperties": {
"type": "number"
}
}
}
}{
"type": "object",
"title": "walk_forwardArguments",
"required": [
"tickers"
],
"properties": {
"base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Base",
"default": null,
"description": "Currency code 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": null,
"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,
"maximum": 15,
"minimum": 1,
"description": "Years of history each refit sees."
}
}
}