{"record":{"id":"9ed092fac815db5f","repo":"nautechsystems/nautilus_trader","slug":"no-tearsheet-chart-registered-under-chart-name","errorCode":null,"errorMessage":"No tearsheet chart registered under '{chart_name}'.{hint} Register one with `register_tearsheet_chart`. Available: {available}","messagePattern":"No tearsheet chart registered under '(.+?)'\\.(.+?) Register one with `register_tearsheet_chart`\\. Available: (.+?)","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"python/nautilus_trader/analysis/tearsheet.py","lineNumber":1678,"sourceCode":"    )\n\n    chart_idx = 0\n\n    for row in range(1, rows + 1):\n        for col in range(1, cols + 1):\n            if chart_idx >= len(config.charts):\n                break\n\n            chart = config.charts[chart_idx]\n            chart_idx += 1\n\n            chart_name = chart.name\n\n            if chart_name not in _TEARSHEET_CHART_SPECS:\n                available = \", \".join(sorted(_TEARSHEET_CHART_SPECS))\n                suggestions = get_close_matches(chart_name, _TEARSHEET_CHART_SPECS, n=3, cutoff=0.6)\n                hint = f\" Did you mean: {', '.join(suggestions)}?\" if suggestions else \"\"\n                raise KeyError(\n                    f\"No tearsheet chart registered under '{chart_name}'.{hint} \"\n                    f\"Register one with `register_tearsheet_chart`. Available: {available}\",\n                )\n\n            renderer = _TEARSHEET_CHART_SPECS[chart_name][\"renderer\"]\n\n            chart_kwargs = chart.kwargs()\n\n            renderer(\n                fig=fig,\n                row=row,\n                col=col,\n                returns=returns,\n                stats_pnls=stats_pnls,\n                stats_returns=stats_returns,\n                stats_general=stats_general,\n                theme_config=theme_config,\n                benchmark_returns=benchmark_returns,","sourceCodeStart":1660,"sourceCodeEnd":1696,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/a4b06ed870971b5671d12754ea138a3ab99b1dec/python/nautilus_trader/analysis/tearsheet.py#L1660-L1696","documentation":"Raised while _create_tearsheet_figure iterates TearsheetConfig.charts: a configured chart name is not in the _TEARSHEET_CHART_SPECS registry. The message includes up to 3 difflib 'did you mean' suggestions (cutoff 0.6) and the sorted list of registered names, so typos are usually self-evident. Custom chart names only exist after an explicit register_tearsheet_chart call in the same process.","triggerScenarios":"Passing TearsheetConfig(charts=[TearsheetChart(name=...)]) with a misspelled built-in name (e.g. 'equtiy' instead of 'equity'), or referencing a custom chart that was never registered via register_tearsheet_chart before create_tearsheet runs; also copy-pasting a chart list from another process/version where additional charts had been registered.","commonSituations":"Typos in TearsheetChart names; disabling/selecting charts by string in a config file; reusing a saved TearsheetConfig from an older nautilus_trader version whose chart names changed; forgetting that registration is per-process and happens in a script that was not run.","solutions":["Read the 'Available:' list in the error and correct the chart name to a registered one","If the suggestion hint names your intended chart, apply that exact spelling","For custom charts, call register_tearsheet_chart(name, subplot_type, title, renderer) before create_tearsheet in the same process","Print registered specs to audit names: python -c \"from nautilus_trader.analysis.tearsheet import _TEARSHEET_CHART_SPECS; print(sorted(_TEARSHEET_CHART_SPECS))\""],"exampleFix":"# before\nconfig = TearsheetConfig(charts=[TearsheetChart(name='rolling_sharpe')])\n# KeyError: No tearsheet chart registered under 'rolling_sharpe' ... Available: ..., rolling-sharpe, ...\n\n# after\nconfig = TearsheetConfig(charts=[TearsheetChart(name='rolling-sharpe')])","handlingStrategy":"validation","validationCode":"from nautilus_trader.analysis.tearsheet import _TEARSHEET_CHART_SPECS\n\nnames = [c.name for c in config.charts]\nunknown = [n for n in names if n not in _TEARSHEET_CHART_SPECS]\nassert not unknown, f'Unknown chart names: {unknown}; registered: {sorted(_TEARSHEET_CHART_SPECS)}'","typeGuard":null,"tryCatchPattern":"try:\n    create_tearsheet(returns=result, config=config)\nexcept KeyError as e:\n    # message contains suggestions + available names\n    raise ValueError(f'Bad chart config: {e}') from None","preventionTips":["Define chart names as module constants instead of inline strings","Register all custom charts in one startup function called before any tearsheet generation","Diff configured names against sorted(_TEARSHEET_CHART_SPECS) in config tests"],"tags":["python","tearsheet","registry-lookup","typo","keyerror","did-you-mean"],"backgroundTag":"unregistered-key-lookup","analyzedSha":"a4b06ed870971b5671d12754ea138a3ab99b1dec","analyzedAt":"2026-08-16T22:54:50.089Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}