Folionomiq

Measures a portfolio from price history: real bets, look-through, past crises in money. No advice.

사용해야 할까요

품질 및 안전성

A
설명 품질
97%
스키마 완전성
91%
이름 품질
85%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~14,208토큰 (도구 정의)
~6.8 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 11.10%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "folionomiq": {
      "url": "https://folionomiq.com/mcp"
    }
  }
}

원격 엔드포인트

https://folionomiq.com/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (22)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
🟢measure_portfolio(holdings, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "measure_portfolioArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "structure": {
      "description": "How many independent bets the holdings add up to and who carries the risk.",
      "properties": {
        "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."
        },
        "max_risk_contribution": {
          "type": [
            "number",
            "null"
          ],
          "description": "That holding's share of the risk, 0 to 1."
        },
        "max_weight_ticker": {
          "type": [
            "string",
            "null"
          ],
          "description": "The largest holding by money."
        },
        "max_weight": {
          "type": [
            "number",
            "null"
          ],
          "description": "Its share of the money, 0 to 1."
        },
        "risk_contributions": {
          "description": "[ticker, share of risk] pairs."
        },
        "top_factor_share": {
          "type": [
            "number",
            "null"
          ],
          "description": "Share of the movement explained by the single strongest common factor."
        },
        "recent": {
          "description": "The same figures over the recent years only."
        },
        "data": {
          "description": "Where the prices came from and what was missing or repaired.",
          "properties": {
            "source": {
              "type": [
                "string",
                "null"
              ],
              "description": "Price source."
            },
            "currency": {
              "type": [
                "string",
                "null"
              ],
              "description": "Currency the figures are in."
            },
            "as_of": {
              "type": [
                "string",
                "null"
              ],
              "description": "Last date of price history used."
            },
            "missing": {
              "description": "Tickers with no usable history (left out)."
            },
            "standins": {
              "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
            }
          }
        }
      }
    },
    "lookthrough": {
      "description": "What the portfolio owns through its funds.",
      "properties": {
        "n_funds": {
          "type": [
            "number",
            "null"
          ],
          "description": "Funds looked through."
        },
        "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."
        },
        "exposures": {
          "description": "[company, share of the whole portfolio] pairs, largest first."
        },
        "top_symbol": {
          "type": [
            "string",
            "null"
          ],
          "description": "The largest single company underneath."
        },
        "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."
        },
        "sectors": {
          "description": "[sector, share] pairs."
        },
        "refused": {
          "description": "Funds whose breakdown the data vendor refused."
        },
        "opaque": {
          "description": "Holdings with no breakdown to look through."
        },
        "data": {
          "description": "Where the prices came from and what was missing or repaired.",
          "properties": {
            "source": {
              "type": [
                "string",
                "null"
              ],
              "description": "Price source."
            },
            "currency": {
              "type": [
                "string",
                "null"
              ],
              "description": "Currency the figures are in."
            },
            "as_of": {
              "type": [
                "string",
                "null"
              ],
              "description": "Last date of price history used."
            },
            "missing": {
              "description": "Tickers with no usable history (left out)."
            },
            "standins": {
              "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
            }
          }
        }
      }
    },
    "stress": {
      "description": "What past crises did to this mix, replayed on its holdings.",
      "properties": {
        "scenarios": {
          "type": [
            "array",
            "null"
          ],
          "description": "One entry per crisis.",
          "items": {
            "type": "object",
            "properties": {
              "scenario": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Crisis name."
              },
              "status": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Whether the holdings' history covers it."
              },
              "total_return": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Return over the crisis window."
              },
              "max_drawdown": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Worst peak-to-trough fall."
              },
              "worst_day": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Worst single day."
              },
              "recovery_days": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Days to recover the previous peak; null if not yet."
              },
              "start": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Window start."
              },
              "end": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Window end."
              }
            }
          }
        },
        "window_start": {
          "type": [
            "string",
            "null"
          ],
          "description": "First date all holdings have prices."
        },
        "limited_by": {
          "type": [
            "string",
            "null"
          ],
          "description": "The holding whose short history limits the window."
        },
        "data": {
          "description": "Where the prices came from and what was missing or repaired.",
          "properties": {
            "source": {
              "type": [
                "string",
                "null"
              ],
              "description": "Price source."
            },
            "currency": {
              "type": [
                "string",
                "null"
              ],
              "description": "Currency the figures are in."
            },
            "as_of": {
              "type": [
                "string",
                "null"
              ],
              "description": "Last date of price history used."
            },
            "missing": {
              "description": "Tickers with no usable history (left out)."
            },
            "standins": {
              "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
            }
          }
        }
      }
    },
    "report": {
      "description": "The numbered report: every figure beside its method.",
      "properties": {
        "markdown": {
          "type": [
            "string",
            "null"
          ],
          "description": "The report as markdown, figures numbered F1, F2…"
        },
        "receipt": {
          "type": [
            "string",
            "null"
          ],
          "description": "A short plain-text receipt of the same figures."
        },
        "facts": {
          "description": "One entry per figure: id, label, value, method, window, limit."
        },
        "start": {
          "type": [
            "string",
            "null"
          ],
          "description": "Window start."
        },
        "end": {
          "type": [
            "string",
            "null"
          ],
          "description": "Window end."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "The full measurement of one portfolio."
}
🟢compare_portfolios(portfolios, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "portfolios": {
      "additionalProperties": {
        "additionalProperties": {
          "type": "number"
        },
        "type": "object"
      },
      "description": "Two to eight portfolios, {label: {ticker: weight}}. Labels are shortened to letters and digits.",
      "title": "Portfolios",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "portfolios"
  ],
  "title": "compare_portfoliosArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "start": {
      "type": [
        "string",
        "null"
      ],
      "description": "Shared window start."
    },
    "end": {
      "type": [
        "string",
        "null"
      ],
      "description": "Shared window end."
    },
    "metrics": {
      "description": "Per portfolio label: growth, volatility, worst fall and related figures."
    },
    "series": {
      "description": "Per portfolio label: the growth path over the window."
    },
    "correlation": {
      "description": "Per pair of labels: how the portfolios moved together."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "Up to eight portfolios measured on one shared window."
}
🟢test_a_change(current, proposed, base, start, end)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "current": {
      "additionalProperties": {
        "type": "number"
      },
      "description": "What is held now, {ticker: weight}.",
      "title": "Current",
      "type": "object"
    },
    "proposed": {
      "additionalProperties": {
        "type": "number"
      },
      "description": "What would be held after the change, {ticker: weight}.",
      "title": "Proposed",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    },
    "start": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional window start, YYYY-MM-DD.",
      "title": "Start"
    },
    "end": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional window end, YYYY-MM-DD.",
      "title": "End"
    }
  },
  "required": [
    "current",
    "proposed"
  ],
  "title": "test_a_changeArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "summary": {
      "type": [
        "string",
        "null"
      ],
      "description": "One sentence on what the change moves."
    },
    "deltas": {
      "description": "Per measure: label, before, after, direction, unit."
    },
    "axes": {
      "description": "Per axis: label, the question it answers, before, after."
    },
    "historical": {
      "description": "Per past crisis: before and after."
    },
    "improved": {
      "description": "Measures that moved one way."
    },
    "worsened": {
      "description": "Measures that moved the other way."
    },
    "similar": {
      "description": "Measures that barely moved."
    },
    "window": {
      "description": "The shared window: start, end, years, which holding set it, crises inside."
    },
    "introduces": {
      "description": "Risk the proposed holdings add that the current ones did not carry."
    },
    "limitations": {
      "description": "What this comparison cannot show."
    },
    "kind": {
      "type": [
        "string",
        "null"
      ],
      "description": "Kind of figures (counterfactual)."
    },
    "kind_means": {
      "type": [
        "string",
        "null"
      ],
      "description": "What that kind means."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "The current and the proposed portfolio on the same history. The 'after' figures are counterfactual: that portfolio was not held."
}
🟢search_symbols(query, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "query": {
      "description": "A fund or company name, a ticker, or an ISIN.",
      "maxLength": 40,
      "title": "Query",
      "type": "string"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "query"
  ],
  "title": "search_symbolsArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "results": {
      "type": "array",
      "description": "Matches, best first.",
      "items": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ticker as the exchange lists it; pass this to the measuring tools."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Fund or company name."
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "description": "ETF, equity, fund…"
          },
          "exchange": {
            "type": [
              "string",
              "null"
            ],
            "description": "Exchange."
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "description": "Trading currency."
          },
          "experimental": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True for listings nobody here has checked."
          }
        }
      }
    }
  },
  "required": [
    "results"
  ],
  "description": "Listings matching the query."
}
🟢validate_symbols(tickers, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "tickers": {
      "description": "Tickers to check, up to 150.",
      "items": {
        "type": "string"
      },
      "maxItems": 150,
      "title": "Tickers",
      "type": "array"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "tickers"
  ],
  "title": "validate_symbolsArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "valid": {
      "description": "Per ticker: true when it has usable price history."
    },
    "problems": {
      "description": "Per failing ticker: why."
    },
    "suggestions": {
      "description": "Per ambiguous ticker: the closest listing."
    },
    "currencies": {
      "description": "Per ticker: its trading currency."
    },
    "base": {
      "type": [
        "string",
        "null"
      ],
      "description": "Base currency."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    }
  },
  "required": [
    "valid"
  ],
  "description": "Which tickers can be measured."
}
🟢portfolio_structure(holdings, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "portfolio_structureArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "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."
    },
    "max_risk_contribution": {
      "type": [
        "number",
        "null"
      ],
      "description": "That holding's share of the risk, 0 to 1."
    },
    "max_weight_ticker": {
      "type": [
        "string",
        "null"
      ],
      "description": "The largest holding by money."
    },
    "max_weight": {
      "type": [
        "number",
        "null"
      ],
      "description": "Its share of the money, 0 to 1."
    },
    "risk_contributions": {
      "description": "[ticker, share of risk] pairs."
    },
    "top_factor_share": {
      "type": [
        "number",
        "null"
      ],
      "description": "Share of the movement explained by the single strongest common factor."
    },
    "recent": {
      "description": "The same figures over the recent years only."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "How many independent bets the holdings add up to and who carries the risk."
}
🟢look_through(holdings, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "look_throughArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "n_funds": {
      "type": [
        "number",
        "null"
      ],
      "description": "Funds looked through."
    },
    "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."
    },
    "exposures": {
      "description": "[company, share of the whole portfolio] pairs, largest first."
    },
    "top_symbol": {
      "type": [
        "string",
        "null"
      ],
      "description": "The largest single company underneath."
    },
    "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."
    },
    "sectors": {
      "description": "[sector, share] pairs."
    },
    "refused": {
      "description": "Funds whose breakdown the data vendor refused."
    },
    "opaque": {
      "description": "Holdings with no breakdown to look through."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "What the portfolio owns through its funds."
}
🟢past_crises(holdings, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "past_crisesArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "scenarios": {
      "type": [
        "array",
        "null"
      ],
      "description": "One entry per crisis.",
      "items": {
        "type": "object",
        "properties": {
          "scenario": {
            "type": [
              "string",
              "null"
            ],
            "description": "Crisis name."
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "description": "Whether the holdings' history covers it."
          },
          "total_return": {
            "type": [
              "number",
              "null"
            ],
            "description": "Return over the crisis window."
          },
          "max_drawdown": {
            "type": [
              "number",
              "null"
            ],
            "description": "Worst peak-to-trough fall."
          },
          "worst_day": {
            "type": [
              "number",
              "null"
            ],
            "description": "Worst single day."
          },
          "recovery_days": {
            "type": [
              "number",
              "null"
            ],
            "description": "Days to recover the previous peak; null if not yet."
          },
          "start": {
            "type": [
              "string",
              "null"
            ],
            "description": "Window start."
          },
          "end": {
            "type": [
              "string",
              "null"
            ],
            "description": "Window end."
          }
        }
      }
    },
    "window_start": {
      "type": [
        "string",
        "null"
      ],
      "description": "First date all holdings have prices."
    },
    "limited_by": {
      "type": [
        "string",
        "null"
      ],
      "description": "The holding whose short history limits the window."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "What past crises did to this mix, replayed on its holdings."
}
🟢portfolio_report(holdings, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "portfolio_reportArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "markdown": {
      "type": [
        "string",
        "null"
      ],
      "description": "The report as markdown, figures numbered F1, F2…"
    },
    "receipt": {
      "type": [
        "string",
        "null"
      ],
      "description": "A short plain-text receipt of the same figures."
    },
    "facts": {
      "description": "One entry per figure: id, label, value, method, window, limit."
    },
    "start": {
      "type": [
        "string",
        "null"
      ],
      "description": "Window start."
    },
    "end": {
      "type": [
        "string",
        "null"
      ],
      "description": "Window end."
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "The numbered report: every figure beside its method."
}
🟢factor_exposure(holdings, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "factor_exposureArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "model": {
      "type": [
        "string",
        "null"
      ],
      "description": "Factor model used."
    },
    "betas": {
      "description": "Sensitivity per factor: mkt_rf (market), smb (small minus big), hml (value minus growth), mom (momentum)."
    },
    "t_stats": {
      "description": "t-statistic per factor; below about 2 in size, not distinguishable from zero."
    },
    "r_squared": {
      "type": [
        "number",
        "null"
      ],
      "description": "Share of the daily movement the factors explain, 0 to 1."
    },
    "alpha_annual": {
      "type": [
        "number",
        "null"
      ],
      "description": "Return not explained by the factors, per year (estimated, not a skill measure)."
    },
    "years": {
      "type": [
        "number",
        "null"
      ],
      "description": "Years of history used."
    },
    "frequency": {
      "type": [
        "string",
        "null"
      ],
      "description": "Data frequency."
    },
    "poor_fit": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "True when the factors explain little."
    },
    "fit_caveat": {
      "type": [
        "string",
        "null"
      ],
      "description": "Why the fit is poor, when it is."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "A four-factor regression of the portfolio's daily returns."
}
🟢currency_effect(holdings, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "currency_effectArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "base": {
      "type": [
        "string",
        "null"
      ],
      "description": "Base currency."
    },
    "headline": {
      "type": [
        "string",
        "null"
      ],
      "description": "One sentence summary."
    },
    "by_currency": {
      "description": "[currency, share of the money] pairs, by listing currency."
    },
    "foreign_share": {
      "type": [
        "number",
        "null"
      ],
      "description": "Share of the money priced outside the base currency."
    },
    "unhedged": {
      "description": "Growth, volatility and worst fall as held."
    },
    "hedged": {
      "description": "The same with the currency moves removed."
    },
    "share_of_vol": {
      "type": [
        "number",
        "null"
      ],
      "description": "Share of the volatility that comes from exchange rates."
    },
    "cagr_from_currency": {
      "type": [
        "number",
        "null"
      ],
      "description": "Growth per year added (or removed) by exchange rates."
    },
    "limitations": {
      "description": "What this cannot show (listing currency is not earning currency)."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "What exchange rates did to the portfolio, seen from the base currency."
}
🟢health_axes(holdings, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "health_axesArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "axes": {
      "description": "Per axis: key, label, the question it answers, band, kind, drivers (each with label, value, unit and a plain reading)."
    },
    "headline": {
      "type": [
        "string",
        "null"
      ],
      "description": "One sentence across the axes."
    },
    "subscores": {
      "description": "The individual measured readings behind the axes."
    },
    "kinds": {
      "description": "What each kind of figure means (observed, replayed, estimated…)."
    },
    "inputs": {
      "description": "What was measured: holdings, window, what was left out."
    },
    "limitations": {
      "description": "What these axes cannot show."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "The portfolio along separate axes; readings, no overall score."
}
🟢sweep_holding(holdings, ticker, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "ticker": {
      "description": "The holding to sweep; must be one of `holdings`.",
      "maxLength": 20,
      "title": "Ticker",
      "type": "string"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings",
    "ticker"
  ],
  "title": "sweep_holdingArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "ticker": {
      "type": [
        "string",
        "null"
      ],
      "description": "The holding swept."
    },
    "points": {
      "description": "Per weight: weight, vol (volatility), risk_share (that holding's share of the risk), effective_bets, top_factor_share."
    },
    "knee": {
      "type": [
        "number",
        "null"
      ],
      "description": "Weight below which most of the change happens, when there is one."
    },
    "total_change": {
      "type": [
        "number",
        "null"
      ],
      "description": "Change in volatility from none to the current weight."
    },
    "note": {
      "type": [
        "string",
        "null"
      ],
      "description": "One sentence on where the change comes from."
    },
    "redistribution": {
      "type": [
        "string",
        "null"
      ],
      "description": "How the rest of the money is spread at each point."
    },
    "kind": {
      "type": [
        "string",
        "null"
      ],
      "description": "Kind of figures (counterfactual)."
    },
    "start": {
      "type": [
        "string",
        "null"
      ],
      "description": "Window start."
    },
    "end": {
      "type": [
        "string",
        "null"
      ],
      "description": "Window end."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "One holding at every weight from none to all (counterfactual)."
}
🟢reverse_stress(holdings, loss, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "loss": {
      "default": 0.2,
      "description": "The loss to explain, as a fraction: 0.25 = lose a quarter.",
      "exclusiveMinimum": 0.005,
      "maximum": 0.95,
      "title": "Loss",
      "type": "number"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "reverse_stressArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "target": {
      "type": [
        "number",
        "null"
      ],
      "description": "The loss explained, as a negative fraction."
    },
    "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."
    },
    "coverage": {
      "type": [
        "number",
        "null"
      ],
      "description": "Share of the portfolio's movement these directions explain."
    },
    "window_days": {
      "type": [
        "number",
        "null"
      ],
      "description": "Length of the move considered, in trading days."
    },
    "window_start": {
      "type": [
        "string",
        "null"
      ],
      "description": "Record start."
    },
    "window_end": {
      "type": [
        "string",
        "null"
      ],
      "description": "Record end."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "The least extreme market moves that would produce the given loss."
}
🟢return_history(holdings, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "return_historyArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "cagr": {
      "type": [
        "number",
        "null"
      ],
      "description": "Growth per year over the record."
    },
    "stats": {
      "description": "best_month, worst_month, best_year, worst_year, pct_positive, n_months, var95, cvar95, real_cagr (after inflation)."
    },
    "yearly": {
      "description": "Return per calendar year, aligned with `years`."
    },
    "years": {
      "description": "Calendar years."
    },
    "months": {
      "description": "Month names, aligned with each row of `grid`."
    },
    "grid": {
      "description": "Monthly returns: one row per year, null where the record has no month."
    },
    "rolling_stats": {
      "description": "Any 12 months in a row: min, max, percentiles, share negative."
    },
    "distribution": {
      "description": "Histogram of monthly returns: centers, counts."
    },
    "drift": {
      "description": "Per holding: target weight and how far it drifted between rebalances."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "The mix's record: yearly and monthly returns, rolling 12 months, drift."
}
🟢plain_findings(holdings, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "plain_findingsArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "insights": {
      "description": "Per finding: key, title, detail, severity (info or warning), evidence."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "A few findings in plain words, each with its evidence."
}
🟢last_price(tickers, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "tickers": {
      "description": "Tickers, up to 50.",
      "items": {
        "type": "string"
      },
      "maxItems": 50,
      "title": "Tickers",
      "type": "array"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "tickers"
  ],
  "title": "last_priceArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "prices": {
      "description": "Per ticker: latest close in the base currency."
    },
    "native_prices": {
      "description": "Per ticker: latest close in its own currency."
    },
    "currencies": {
      "description": "Per ticker: its trading currency."
    },
    "base": {
      "type": [
        "string",
        "null"
      ],
      "description": "Base currency."
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "Date of the close."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    }
  },
  "required": [
    "prices"
  ],
  "description": "Latest close per ticker; single figures, no history."
}
🟢asset_info(ticker)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "ticker": {
      "description": "One ticker, as the exchange lists it.",
      "maxLength": 20,
      "title": "Ticker",
      "type": "string"
    }
  },
  "required": [
    "ticker"
  ],
  "title": "asset_infoArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "ticker": {
      "type": [
        "string",
        "null"
      ],
      "description": "Ticker."
    },
    "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."
    },
    "fund": {
      "description": "For a fund: is_fund, holdings ([symbol, weight] pairs), sectors."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    }
  },
  "required": [
    "ticker"
  ],
  "description": "One fund or share."
}
🟢simulate_paths(holdings, years, monthly, haircut, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "years": {
      "default": 20,
      "description": "Years to run the paths, 1 to 40.",
      "maximum": 40,
      "minimum": 1,
      "title": "Years",
      "type": "integer"
    },
    "monthly": {
      "default": 0,
      "description": "Amount added every month, in the base currency.",
      "maximum": 1000000,
      "minimum": 0,
      "title": "Monthly",
      "type": "number"
    },
    "haircut": {
      "default": 0,
      "description": "Yearly return removed from every path, as a fraction (0.02 = assume 2% a year less than the record paid).",
      "maximum": 0.15,
      "minimum": 0,
      "title": "Haircut",
      "type": "number"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings"
  ],
  "title": "simulate_pathsArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "refused": {
      "description": "Present when no paths were drawn: the reasons, in words."
    },
    "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."
    },
    "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."
    },
    "terminal_real": {
      "description": "The same in today's money."
    },
    "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)."
    },
    "prob_below_real": {
      "type": [
        "number",
        "null"
      ],
      "description": "The same after inflation."
    },
    "years": {
      "description": "Time axis of the bands, in years."
    },
    "bands": {
      "description": "Percentile paths over time: p5 … p95, aligned with `years`."
    },
    "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."
    },
    "historical_cagr": {
      "type": [
        "number",
        "null"
      ],
      "description": "Growth per year the record paid."
    },
    "kind": {
      "type": [
        "string",
        "null"
      ],
      "description": "simulated."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "Paths resampled from the record (SIMULATED), or the reasons they were refused."
}
🟢walk_forward(tickers, holdings, objective, train_years, step_months, ...)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "tickers": {
      "description": "The candidate holdings, 2 to 30.",
      "items": {
        "type": "string"
      },
      "maxItems": 30,
      "minItems": 2,
      "title": "Tickers",
      "type": "array"
    },
    "holdings": {
      "anyOf": [
        {
          "additionalProperties": {
            "type": "number"
          },
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional: the portfolio actually held, {ticker: weight}, measured on the same span for comparison.",
      "title": "Holdings"
    },
    "objective": {
      "default": "max_sharpe",
      "description": "What each refit maximises or minimises: max_sharpe, min_variance, min_drawdown, min_cvar or max_quadratic_utility.",
      "title": "Objective",
      "type": "string"
    },
    "train_years": {
      "default": 3,
      "description": "Years of history each refit sees.",
      "maximum": 15,
      "minimum": 1,
      "title": "Train Years",
      "type": "number"
    },
    "step_months": {
      "default": 12,
      "description": "Months each fitted mix is held.",
      "maximum": 36,
      "minimum": 1,
      "title": "Step Months",
      "type": "integer"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "tickers"
  ],
  "title": "walk_forwardArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "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."
    },
    "fitted_window": {
      "description": "First and last date of shared history."
    },
    "objective": {
      "type": [
        "string",
        "null"
      ],
      "description": "What each refit optimised."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "An allocation method tested out of sample; no allocation is returned."
}
🟢check_before_you_buy(holdings, add, amount, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "add": {
      "description": "The one ticker being considered.",
      "maxLength": 20,
      "title": "Add",
      "type": "string"
    },
    "amount": {
      "description": "How much of it, in the same units as `holdings` (money when holdings are amounts).",
      "exclusiveMinimum": 0,
      "title": "Amount",
      "type": "number"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings",
    "add",
    "amount"
  ],
  "title": "check_before_you_buyArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "add": {
      "type": [
        "string",
        "null"
      ],
      "description": "The ticker considered."
    },
    "amount": {
      "type": [
        "number",
        "null"
      ],
      "description": "How much of it."
    },
    "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."
    },
    "bets": {
      "description": "Independent bets before and after."
    },
    "top_risk": {
      "description": "The holding carrying the most risk, and its share, before and after."
    },
    "crises": {
      "description": "Per past crisis: fall before and after, as fractions."
    },
    "total_before": {
      "type": [
        "number",
        "null"
      ],
      "description": "Portfolio size before."
    },
    "total_after": {
      "type": [
        "number",
        "null"
      ],
      "description": "Portfolio size after."
    },
    "window": {
      "description": "The shared price window."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "One addition measured on the portfolio it would join (counterfactual)."
}
🟢living_off_it(holdings, withdrawal, years, amount, base)

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.

입력 스키마

{
  "type": "object",
  "properties": {
    "holdings": {
      "additionalProperties": {
        "type": "number"
      },
      "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).",
      "title": "Holdings",
      "type": "object"
    },
    "withdrawal": {
      "description": "Taken each year, in today's money; raised with the real price index of the base currency.",
      "exclusiveMinimum": 0,
      "title": "Withdrawal",
      "type": "number"
    },
    "years": {
      "default": 30,
      "description": "How many years, 5 to 50.",
      "maximum": 50,
      "minimum": 5,
      "title": "Years",
      "type": "integer"
    },
    "amount": {
      "anyOf": [
        {
          "exclusiveMinimum": 0,
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "How much is in the portfolio, when `holdings` are weights rather than money.",
      "title": "Amount"
    },
    "base": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Currency every figure is expressed in (USD, EUR, GBP, CAD…). Default USD.",
      "title": "Base"
    }
  },
  "required": [
    "holdings",
    "withdrawal"
  ],
  "title": "living_off_itArguments"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "amount": {
      "type": [
        "number",
        "null"
      ],
      "description": "Money in the portfolio at each start."
    },
    "withdrawal": {
      "type": [
        "number",
        "null"
      ],
      "description": "Taken each year, in start-month money, raised with prices."
    },
    "rate": {
      "type": [
        "number",
        "null"
      ],
      "description": "withdrawal / amount."
    },
    "years": {
      "type": [
        "number",
        "null"
      ],
      "description": "Span asked for."
    },
    "record": {
      "description": "start, end and years of the shared monthly record."
    },
    "testable_years": {
      "type": [
        "number",
        "null"
      ],
      "description": "The longest span the record can test in full."
    },
    "n_starts": {
      "type": [
        "number",
        "null"
      ],
      "description": "Starts followed (at least a year)."
    },
    "n_complete": {
      "type": [
        "number",
        "null"
      ],
      "description": "Starts old enough for the full span."
    },
    "n_complete_lasted": {
      "type": [
        "number",
        "null"
      ],
      "description": "Of those, how many lasted."
    },
    "n_ran_out": {
      "type": [
        "number",
        "null"
      ],
      "description": "Starts, complete or not, where the money ran out."
    },
    "n_going": {
      "type": [
        "number",
        "null"
      ],
      "description": "Recent starts not run out so far, span not over."
    },
    "worst": {
      "description": "The worst start: start, ran_out, months, low_real, low_at, end_real."
    },
    "safe_rate": {
      "type": [
        "number",
        "null"
      ],
      "description": "Highest yearly rate that ran out from no start; null if no start is complete."
    },
    "starts": {
      "description": "A sample of starts (every sixth): start, complete, months, ran_out, low_real, end_real."
    },
    "inflation": {
      "description": "Price index used: source, last_published, assumed."
    },
    "data": {
      "description": "Where the prices came from and what was missing or repaired.",
      "properties": {
        "source": {
          "type": [
            "string",
            "null"
          ],
          "description": "Price source."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "Currency the figures are in."
        },
        "as_of": {
          "type": [
            "string",
            "null"
          ],
          "description": "Last date of price history used."
        },
        "missing": {
          "description": "Tickers with no usable history (left out)."
        },
        "standins": {
          "description": "Holdings measured through a stand-in with longer history: ticker, proxy, index, from, until, evidence."
        }
      }
    },
    "_fence": {
      "type": [
        "string",
        "null"
      ],
      "description": "What these figures are and are not: descriptive, no forecast, no advice. Repeat its sense when presenting the result."
    }
  },
  "required": [
    "_fence"
  ],
  "description": "Withdrawals replayed on the portfolio's own monthly history (replayed)."
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 22개
검증됨버전이 기록되지 않음도구 22개