{"openapi":"3.1.0","info":{"title":"九章量化 NineQuantAI API","description":"策略回测与美股行情数据接口\n\n## 响应格式\n\n所有 `/v1` 与 `/api` 接口返回同一个外壳：\n\n```json\n{\"code\": 0, \"message\": \"ok\", \"data\": {}}\n```\n\n出错时 `code` 为 HTTP 状态码，`data` 为 `null`。每个响应都带 `X-Request-Id`，\n反馈问题时附上它即可定位到具体那一次调用。\n\n## 鉴权\n\n`/v1` 接口用 API Key：请求头 `X-API-Key: nq_xxx`。\n`/api` 接口用登录后拿到的 `Authorization: Bearer <access_token>`。\n登录方式只有一种——邮箱验证码，平台不设密码。\n\n## 限流\n\n超限返回 `429`，响应体带 `retry_after`（秒），响应头带\n`Retry-After` 与 `X-RateLimit-Limit` / `X-RateLimit-Remaining` / `X-RateLimit-Reset`。\n\n| 套餐 | rate | api_keys_max | backtest_history_max | batch_symbols_max | kline_max_days | concurrent_backtests |\n|---|---|---|---|---|---|---|\n| 游客 | {'quote': {'limit': 30, 'window_sec': 60}, 'kline': {'limit': 30, 'window_sec': 60}, 'intraday': {'limit': 0, 'window_sec': 60}, 'static': {'limit': 30, 'window_sec': 60}, 'symbols': {'limit': 30, 'window_sec': 60}, 'batch': {'limit': 10, 'window_sec': 60}, 'backtest': {'limit': 5, 'window_sec': 60}, 'optimize': {'limit': 0, 'window_sec': 3600}, 'account': {'limit': 0, 'window_sec': 60}} | 0 | 0 | 25 | 730 | 1 |\n| 免费版 | {'quote': {'limit': 60, 'window_sec': 60}, 'kline': {'limit': 60, 'window_sec': 60}, 'intraday': {'limit': 60, 'window_sec': 60}, 'static': {'limit': 60, 'window_sec': 60}, 'symbols': {'limit': 60, 'window_sec': 60}, 'batch': {'limit': 20, 'window_sec': 60}, 'backtest': {'limit': 20, 'window_sec': 60}, 'optimize': {'limit': 0, 'window_sec': 3600}, 'account': {'limit': 120, 'window_sec': 60}} | 1 | 20 | 50 | None | 2 |\n| 专业版 | {'quote': {'limit': 300, 'window_sec': 60}, 'kline': {'limit': 300, 'window_sec': 60}, 'intraday': {'limit': 300, 'window_sec': 60}, 'static': {'limit': 300, 'window_sec': 60}, 'symbols': {'limit': 300, 'window_sec': 60}, 'batch': {'limit': 100, 'window_sec': 60}, 'backtest': {'limit': 60, 'window_sec': 60}, 'optimize': {'limit': 10, 'window_sec': 3600}, 'account': {'limit': 300, 'window_sec': 60}} | 5 | None | 100 | None | 5 |\n| 企业版 | {'quote': {'limit': 3000, 'window_sec': 60}, 'kline': {'limit': 3000, 'window_sec': 60}, 'intraday': {'limit': 3000, 'window_sec': 60}, 'static': {'limit': 3000, 'window_sec': 60}, 'symbols': {'limit': 3000, 'window_sec': 60}, 'batch': {'limit': 1000, 'window_sec': 60}, 'backtest': {'limit': 600, 'window_sec': 60}, 'optimize': {'limit': 200, 'window_sec': 3600}, 'account': {'limit': 600, 'window_sec': 60}} | 50 | None | 500 | None | 20 |\n\n## 数据口径（务必读）\n\n日线分**合并口径**（consolidated，汇总全部交易场所）与**单交易所口径**\n（single_venue）。实测两者收盘价最大偏差 3.5%~7.1%，单场成交量仅占合并量的\n23%~34% 且随季度漂移。**两种口径绝不可混用于同一次回测**，接口返回的每条数据都\n标注了 `venue_mode`，请据此判断。回测取数一律使用合并口径。\n\n## 数据时效\n\n当前分发模式：`eod_only`。为遵守交易所的数据分发规则，本接口只提供上一交易日及更早的收盘数据。\n每个行情响应都带 `timeliness` 字段，如实说明该批数据的时效，请不要假设它是实时的。\n\n## 语言\n\n响应中的提示文案支持简体中文、繁體中文、English。用 `Accept-Language` 头或\n`?lang=zh-TW` 指定，响应头 `Content-Language` 会回显实际使用的语言。\n\n---\n\n数据与回测结果仅供研究参考，不构成任何投资建议。本平台不提供任何下单能力，也不对接券商实盘交易。","version":"0.1.0","x-distribution-mode":"eod_only","contact":{"name":"九章量化 NineQuantAI","url":"https://us2.ninequantai.com"}},"paths":{"/api/plans":{"get":{"tags":["公共","公共"],"summary":"全部套餐与限额（公开）","operationId":"list_plans_api_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Plans Api Plans Get"}}}}}}},"/api/meta":{"get":{"tags":["公共","公共"],"summary":"部署元信息（公开）","operationId":"meta_api_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Meta Api Meta Get"}}}}}}},"/api/stats":{"get":{"tags":["公共","公共"],"summary":"真实运营统计（公开，60 秒缓存）","description":"首页运营数据。全部来自数据库真实计数，不写死。","operationId":"stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Api Stats Get"}}}}}}},"/api/articles":{"get":{"tags":["公共","公共"],"summary":"策略研究文章列表（公开）","description":"只返回已发布的文章，按发布时间倒序。\n\n某个 slug 在所请求语言下没有已发布稿时，用简体中文那一份顶上，并在该条的 `locale` 字段里如实标出实际语言 —— 对读者来说「看得懂但语言不对」远好过「页面不存在」，而翻译总是滞后于原文。","operationId":"list_articles_api_articles_get","parameters":[{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"语言标签。zh-CN / zh-TW / en，也接受 zh-Hant、zh-HK 这类别名；认不出时回落站点默认语言。","title":"Locale"},"description":"语言标签。zh-CN / zh-TW / en，也接受 zh-Hant、zh-HK 这类别名；认不出时回落站点默认语言。"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"strategy | backtest | data | concept","title":"Category"},"description":"strategy | backtest | data | concept"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Articles Api Articles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/articles/{slug}":{"get":{"tags":["公共","公共"],"summary":"策略研究文章详情（公开）","description":"返回 Markdown 原文（`body_md`）—— 渲染在前端，库里不存 HTML，两边各存一份必然漂移。\n\n`prev` / `next` 的顺序与列表页完全一致，否则读者按「下一篇」会跳来跳去。","operationId":"get_article_api_articles__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":120,"title":"Slug"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"语言标签。zh-CN / zh-TW / en，也接受 zh-Hant、zh-HK 这类别名；认不出时回落站点默认语言。","title":"Locale"},"description":"语言标签。zh-CN / zh-TW / en，也接受 zh-Hant、zh-HK 这类别名；认不出时回落站点默认语言。"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Article Api Articles  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/request-code":{"post":{"tags":["认证","鉴权"],"summary":"发送登录验证码","description":"向邮箱发送一次性登录验证码。\n\n这里刻意**完全不查 users 表**：无论邮箱是否已注册，走的都是同一条代码路径、\n同一份响应体、同一个耗时量级。一旦按注册状态分叉，响应差异（哪怕只是快慢）\n就会变成一个免费的「这个邮箱在你们站注册过吗」查询接口。","operationId":"request_code_api_auth_request_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RequestCodeOut_"}}}},"429":{"description":"触发防刷限额，响应头带 Retry-After 与 X-RateLimit-*"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify":{"post":{"tags":["认证","鉴权"],"summary":"校验验证码并登录（新邮箱自动注册）","description":"校验验证码，通过则登录；邮箱没有账号时当场开户。","operationId":"verify_code_api_auth_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_LoginOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/refresh":{"post":{"tags":["认证","鉴权"],"summary":"用刷新令牌换取新的令牌对","description":"刷新令牌并轮换。\n\n每次刷新都换发新的 refresh，旧的立即作废。旧令牌被第二次使用意味着它已经\n泄漏（正常客户端拿到新令牌后不会再用旧的），此时 assert_refresh_usable 会\n连带作废该用户的全部会话，真假两边都被迫重新登录。","operationId":"refresh_token_api_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TokenPairOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["认证","鉴权"],"summary":"登出，作废当前刷新令牌","description":"登出。\n\n幂等：令牌已过期、已作废甚至是伪造的，一律返回成功。登出接口报错只会让\n前端在「清不掉本地状态」和「反复重试」之间打转，没有任何安全收益 ——\n反正无效令牌本来就用不了。","operationId":"logout_api_auth_logout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoutIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_LogoutOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["认证","鉴权"],"summary":"获取当前登录用户信息","description":"返回当前登录用户。access token 与 API Key 两种凭证都认。","operationId":"me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_UserOut_"}}}}},"security":[{"Bearer":[]}]},"delete":{"tags":["认证","鉴权"],"summary":"注销账户（需重复输入邮箱确认）","description":"删除用户及其 Key / 回测 / 用量 / 验证码。软删除不满足「用户有权删除个人信息」的承诺，故物理删除。","operationId":"delete_me_api_auth_me_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_DeleteAccountOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Bearer":[]}]},"patch":{"tags":["认证","鉴权"],"summary":"修改昵称 / 界面语言","operationId":"update_me_api_auth_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdateIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_UserOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Bearer":[]}]}},"/api/account/keys":{"get":{"tags":["账户","account"],"summary":"我的 API Key 列表","operationId":"list_keys_api_account_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ApiKeyListData_"}}}}},"security":[{"Bearer":[]}]},"post":{"tags":["账户","account"],"summary":"创建 API Key（明文只返回一次）","description":"创建一个新 Key。\n\n数量上限来自套餐配置（free 1 个、pro 5 个），不在这里写死。\n停用状态的 Key 也计入配额：它仍然占着一行记录与一个可被重新启用的凭证，\n不计入的话用户可以靠反复停用来无限开 Key。","operationId":"create_key_api_account_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ApiKeyCreatedData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Bearer":[]}]}},"/api/account/keys/reset":{"post":{"tags":["账户","account"],"summary":"重置 API Key（作废全部旧 Key，签发一把新 Key）","description":"竞品控制台的「重置 Key」：旧 Key 立即失效。免费档为单 Key 模型，重置即替换。","operationId":"reset_key_api_account_keys_reset_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ApiKeyCreatedData_"}}}}},"security":[{"Bearer":[]}]}},"/api/account/keys/{key_id}":{"patch":{"tags":["账户","account"],"summary":"重命名或启停 API Key","operationId":"update_key_api_account_keys__key_id__patch","security":[{"Bearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyUpdateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ApiKeyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["账户","account"],"summary":"删除 API Key","description":"彻底删除。\n\n历史用量行通过 api_key_id 外键指向这条记录，先把它们的引用摘掉再删，\n否则外键约束会让删除失败——而用户的诉求「让这个 Key 立刻失效」不该被\n统计数据挡住。摘掉引用后那部分用量仍计在用户名下，总量不变。","operationId":"delete_key_api_account_keys__key_id__delete","security":[{"Bearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/usage":{"get":{"tags":["账户","account"],"summary":"近 N 天调用量统计","description":"按天与按端点两个维度返回，控制台一次请求就能画完两张图。\n\n按天序列会把没有调用的日子补成 0：前端拿到稀疏数据自己补洞，\n每换一个图表库就得重写一遍，不如后端一次补好。","operationId":"get_usage_api_account_usage_get","security":[{"Bearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_UsageData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/plan":{"get":{"tags":["账户","account"],"summary":"我的套餐、额度与已用量","description":"套餐详情。\n\n限流剩余量走 peek 只读查询，看一眼额度不会扣掉一次额度。\n注意：剩余量是按 **当前这条调用链的身份**（控制台的 JWT）算的，\n脚本用 API Key 调行情时是另一套独立的桶，两者互不相减——这正是\n「额度随 Key 发放」的设计意图。","operationId":"get_my_plan_api_account_plan_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PlanData_"}}}}},"security":[{"Bearer":[]}]}},"/api/backtest/run":{"post":{"tags":["回测","回测"],"summary":"运行回测","description":"跑一次回测并返回完整结果（指标卡 + K 线 + 交易清单 + 净值曲线）。\n\n游客可用，但不保存记录；登录用户默认保存，超出套餐条数上限时自动淘汰最旧的一条。\n\n响应里的 `data_range` 会如实说明实际使用的区间：请求区间早于数据起点时**不会静默截断**，而是把 `truncated`、`reason_codes` 和对应的中文提示一并返回。","operationId":"run_backtest_api_backtest_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BacktestRunIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_BacktestRunData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Bearer":[]}]}},"/api/backtest/strategies":{"get":{"tags":["回测","回测"],"summary":"可用策略与参数定义","description":"返回策略列表及其 `params_schema`，前端据此动态渲染参数面板 —— 新增策略只需实现引擎侧的插件，前端零改动。\n\n同时返回时间范围预设与默认成本假设，避免前端硬编码一份、后端另一份。","operationId":"list_strategies_api_backtest_strategies_get","security":[{"Bearer":[]}],"parameters":[{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"enum":["zh-CN","zh-TW","en"],"type":"string"},{"type":"null"}],"description":"界面语言，缺省按请求协商","title":"Locale"},"description":"界面语言，缺省按请求协商"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_StrategyListData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/backtest/history":{"get":{"tags":["回测","回测"],"summary":"我的回测记录","description":"只返回摘要指标，不读大对象，列表再长也不会被几 MB 的 K 线拖慢。","operationId":"list_history_api_backtest_history_get","security":[{"Bearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"enum":["zh-CN","zh-TW","en"],"type":"string"},{"type":"null"}],"title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_BacktestHistoryData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/backtest/shared/{slug}":{"get":{"tags":["回测","回测"],"summary":"查看分享的回测","description":"公开访问，无需登录。分享被撤销后立即 404。","operationId":"get_shared_api_backtest_shared__slug__get","security":[{"Bearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":6,"maxLength":32,"title":"Slug"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"enum":["zh-CN","zh-TW","en"],"type":"string"},{"type":"null"}],"title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_BacktestRunData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/backtest/{backtest_id}":{"get":{"tags":["回测","回测"],"summary":"回测详情","description":"取某次回测的完整结果。非本人的记录一律 404，不区分「不存在」与「无权访问」。","operationId":"get_backtest_api_backtest__backtest_id__get","security":[{"Bearer":[]}],"parameters":[{"name":"backtest_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Backtest Id"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"enum":["zh-CN","zh-TW","en"],"type":"string"},{"type":"null"}],"title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_BacktestRunData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["回测","回测"],"summary":"删除回测记录","description":"同时删除对象存储里的大对象，不留孤儿文件。","operationId":"delete_backtest_api_backtest__backtest_id__delete","security":[{"Bearer":[]}],"parameters":[{"name":"backtest_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Backtest Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_DeleteData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/backtest/{backtest_id}/share":{"post":{"tags":["回测","回测"],"summary":"生成或撤销分享链接","description":"生成后任何人凭 slug 都能只读查看该次回测。\n\nslug 一旦生成就固定不变：撤销再重新分享仍是同一个链接，避免旧链接在换人之后指向别人的回测。","operationId":"share_backtest_api_backtest__backtest_id__share_post","security":[{"Bearer":[]}],"parameters":[{"name":"backtest_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Backtest Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ShareIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShareData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/backtest/{backtest_id}/export":{"get":{"tags":["回测","回测"],"summary":"导出 CSV","description":"导出交易清单（kind=trades）、净值曲线（kind=equity）或 K 线（kind=klines）。\n\n返回的是文件而不是 JSON 外壳，表头随 locale 三语切换，并带 UTF-8 BOM —— 没有 BOM 的 UTF-8 在 Excel 里中文会变乱码。","operationId":"export_backtest_api_backtest__backtest_id__export_get","security":[{"Bearer":[]}],"parameters":[{"name":"backtest_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Backtest Id"}},{"name":"kind","in":"query","required":false,"schema":{"enum":["trades","equity","klines"],"type":"string","description":"trades / equity / klines","default":"trades","title":"Kind"},"description":"trades / equity / klines"},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"csv","title":"Format"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"enum":["zh-CN","zh-TW","en"],"type":"string"},{"type":"null"}],"title":"Locale"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/backtest":{"post":{"tags":["回测","回测"],"summary":"运行回测（扁平参数，竞品兼容路径）","operationId":"run_backtest_flat_alias_api_backtest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1BacktestIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_V1BacktestData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Bearer":[]}]}},"/v1/quote/{symbol}":{"get":{"tags":["行情数据 API","行情数据"],"summary":"报价","description":"单个标的的报价。\n\n**时效取决于部署的分发姿态**：`eod_only`（默认）返回最近一个已收盘且已过 T+1 的交易日快照，`delayed=true` 且 `as_of` 标明数据日期；`delayed` 姿态返回延迟不少于 15 分钟的盘中数据；`realtime` 返回实时数据。响应里的 `timeliness` 字段如实说明本次拿到的是哪一种。","operationId":"get_quote_v1_quote__symbol__get","security":[{"Bearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_QuoteData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/kline/{symbol}":{"get":{"tags":["行情数据 API","行情数据"],"summary":"历史 K 线","description":"日/周/月 K 线。周线与月线由日线重采样得出，不单独存储。\n\n`adjust=qfq` 为前复权：用 adjustments 表的因子在查询时相乘算出，不预存复权价，最新价保持真实成交价。`adjust_applied` 如实告知该区间是否真的有因子被应用 —— 为 false 说明这段区间没有拆股/分红事件，或复权数据尚未同步。\n\n响应必带 `venue_mode`。实测单交易所口径与合并口径的收盘价最大偏差 7.1%、成交量只有合并量的 23%~34%，两种口径绝不可混用于同一次回测。","operationId":"get_kline_v1_kline__symbol__get","security":[{"Bearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"day / week / month，默认 day","title":"Period"},"description":"day / week / month，默认 day"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"起始日期 YYYY-MM-DD","title":"Start"},"description":"起始日期 YYYY-MM-DD"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"结束日期 YYYY-MM-DD，超出可分发范围会被收敛","title":"End"},"description":"结束日期 YYYY-MM-DD，超出可分发范围会被收敛"},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"返回最近 N 根 K 线（按 period 计数）；与 start 同时给出时以 start 为准","title":"Days"},"description":"返回最近 N 根 K 线（按 period 计数）；与 start 同时给出时以 start 为准"},{"name":"adjust","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"none（默认）/ qfq 前复权","title":"Adjust"},"description":"none（默认）/ qfq 前复权"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_KlineData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intraday/{symbol}":{"get":{"tags":["行情数据 API","行情数据"],"summary":"分时数据","description":"当日分时。**默认部署下不可用**：`eod_only` 姿态返回 403。\n\n盘中数据的对外分发需要额外的交易所授权，而 T+1 及更早的 EOD 日线有明确的免费分发依据，所以默认姿态只放行后者。授权落实后把 DISTRIBUTION_MODE 改成 `delayed` 或 `realtime` 即可，无需改动代码。","operationId":"get_intraday_v1_intraday__symbol__get","security":[{"Bearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"交易日 YYYY-MM-DD，默认最近可分发交易日","title":"Date"},"description":"交易日 YYYY-MM-DD，默认最近可分发交易日"},{"name":"interval","in":"query","required":false,"schema":{"type":"string","description":"分时粒度","default":"1m","title":"Interval"},"description":"分时粒度"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_IntradayData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/static/{symbol}":{"get":{"tags":["行情数据 API","行情数据"],"summary":"静态信息","description":"标的的静态属性，以及本地已入库的日线覆盖区间（`history_start` / `history_end`）。\n\n已退市标的同样返回（回测需要它们，否则产生幸存者偏差），并在 `note` 里注明退市日期。","operationId":"get_static_v1_static__symbol__get","security":[{"Bearer":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_StaticData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/batch":{"post":{"tags":["行情数据 API","行情数据"],"summary":"批量查询","description":"一次查询多个标的，上限由配置决定（当前 50 个，按去重后计数）。\n\n单个标的失败不会让整次请求失败：成功的结果在 `results`，失败原因逐条列在 `errors` 里，便于调用方定位是哪个代码写错了，而不是整批一起报错重来。","operationId":"post_batch_v1_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_BatchData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Bearer":[]}]}},"/v1/symbols":{"get":{"tags":["标的 API","行情数据"],"summary":"标的搜索","description":"按代码或名称模糊搜索标的。代码精确命中排在最前，其次是代码前缀，最后才是名称命中；不传 `q` 时返回热门标的，供前端搜索框做初始态。\n\n结果包含已退市标的（`is_delisted=true`）：回测若排除退市标的会产生幸存者偏差，所以它们必须可被搜到，只是排序上让位于在营标的。\n\n`market` 取 `US` / `HK` / `CN`，省略时用第一个已启用的市场。**尚未开放的市场返回 400**（而不是空列表——空列表看起来像「这个市场一只标的都没有」，真相是「这个市场还没接入数据源」）。当前已启用与规划中的市场见 `GET /api/meta` 的 `markets` / `planned_markets`。\n\n每条结果都带 `market`（US/HK/CN）、`exchange`（US/HK/SH/SZ）与 `currency`，沪深两所靠 `exchange` 区分。","operationId":"search_symbols_v1_symbols_get","security":[{"Bearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键词，匹配代码前缀或名称片段","title":"Q"},"description":"关键词，匹配代码前缀或名称片段"},{"name":"market","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"市场代码 US / HK / CN，省略时用第一个已启用的市场","title":"Market"},"description":"市场代码 US / HK / CN，省略时用第一个已启用的市场"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"返回条数上限，默认 20，最大 100","title":"Limit"},"description":"返回条数上限，默认 20，最大 100"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_SymbolSearchData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/backtest":{"post":{"tags":["回测 API","回测 API"],"summary":"运行回测","description":"两种入参风格都接受：\n\n```json\n{\"strategy\":\"chandelier\",\"symbol\":\"QQQ.US\",\"time_range\":\"1Y\",\"params\":{\"sma_period\":100}}\n{\"symbol\":\"QQQ.US\",\"time_range\":\"1Y\",\"sma_period\":100,\"entry_mult\":2.0,\"exit_mult\":3.0}\n```\n\n后者与常见的同类接口字段名兼容，已有脚本改个地址即可。两者同时出现时以 `params` 为准。\n\n`cost` 可显式给出手续费率与滑点；不给则用平台默认值，并在 `cost` 字段里如实回传本次使用的假设 —— 不计成本的回测收益会明显偏乐观，结果不可跨平台直接比较。\n\n需要画图时把 `include_klines` / `include_equity` 置为 true。","operationId":"run_backtest_v1_backtest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1BacktestIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_V1BacktestData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Bearer":[]}]}},"/v1/backtests":{"get":{"tags":["回测 API","回测 API"],"summary":"我的回测记录","description":"只返回摘要指标；需要完整结果时再按 id 取。","operationId":"list_backtests_v1_backtests_get","security":[{"Bearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"enum":["zh-CN","zh-TW","en"],"type":"string"},{"type":"null"}],"title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_BacktestHistoryData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/backtests/{backtest_id}":{"get":{"tags":["回测 API","回测 API"],"summary":"回测详情","description":"按 id 取已保存的回测。大数组默认不返回，按需用查询参数打开。","operationId":"get_backtest_v1_backtests__backtest_id__get","security":[{"Bearer":[]}],"parameters":[{"name":"backtest_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Backtest Id"}},{"name":"include_klines","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Klines"}},{"name":"include_trades","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Trades"}},{"name":"include_equity","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Equity"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"enum":["zh-CN","zh-TW","en"],"type":"string"},{"type":"null"}],"title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_V1BacktestData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/strategies":{"get":{"tags":["回测 API","回测 API"],"summary":"可用策略与参数定义","description":"供 AI Skill 与第三方在调用回测前自省参数，不必把参数表硬编码在客户端。\n\n`params_schema` 是 JSON Schema，含取值范围与三语标签，可直接用来生成表单或校验入参。","operationId":"list_strategies_v1_strategies_get","security":[{"Bearer":[]}],"parameters":[{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"enum":["zh-CN","zh-TW","en"],"type":"string"},{"type":"null"}],"title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_StrategyListData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/screener":{"post":{"tags":["选股器"],"summary":"全市场选股","description":"按条件在全市场日线上筛选标的，条件之间是 AND。\n\n**只看每个标的最新的一根日线**：命中的是「此刻满足条件」的标的，不是「历史上某天满足过」的标的。落后于全市场最新交易日超过 7 个自然日的标的（已退市、长期停牌）不会出现在结果里。\n\n**价格与成交量都是前复权口径**，与 `GET /v1/kline?adjust=qfq` 和回测引擎的默认档（`adjust=split`，只做拆股复权）完全一致。一次 1:8 缩股不会被算成 8 倍的涨幅。\n\n**不传 `asset_type` 时只出 `stock` 与 `etf`**，不是不过滤：权证、优先股、认股权日线稀薄、跳空剧烈，混进来会霸占涨幅榜与放量榜。它们仍然查得到，显式指定`asset_type` 即可；本次真正扫描了哪些类别写在响应的 `asset_types` 里。\n\n回看窗口由条件里最大的 `period` 自动推算，不做全表扫描。窗口不完整的标的（如上市不满 200 天却要求站上 200 日线）其指标为 null，不会用较短的窗口凑一个数出来。\n\n`scanned` 是本次扫描的标的基数（市场 + 类别 + 时效过滤之后），与命中数 `total` 是两件事；一条都没命中时它照样有值。\n\n`elapsed_ms` 是本次查询在分析引擎里的实际耗时；`data_freshness` 说明分析快照是什么时候导出的。数据未就绪或已过期时返回 503，**不会**降级到主库慢查——那条路实测要十几秒，而且会把一次配置事故伪装成偶发的慢请求。\n\n给了 `preset` 就以该预设方案的条件与排序为准，`conditions` / `sort` 被忽略；可用的预设见 `GET /api/screener/presets`。","operationId":"post_screener_v1_screener_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ScreenerData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Bearer":[]}]}},"/api/screener/presets":{"get":{"tags":["选股器"],"summary":"预设方案与条件字典（公开）","description":"预设方案（趋势突破 / 回调买点 / 放量异动 / 低波动趋势）及其完整条件，外加字段与操作符的字典和边界值。\n\n前端的选股表单完全由这个响应驱动：加一个操作符不需要前端跟着发版，也不会出现「页面上能选、后端不认」的组合。预设的周期与阈值只在后端有一份，所以不存在「页面上的趋势突破」与「文档里的趋势突破」参数不一致的可能。","operationId":"get_presets_api_screener_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PresetsData_"}}}}}}},"/api/admin/articles":{"get":{"tags":["管理后台","管理后台"],"summary":"文章列表（按 slug 分组）","description":"一行一个 slug，`locales` 里给出三种语言各自的状态与完成情况。\n\n筛选作用在**行**上（`status=draft` 意为「至少有一种语言还是草稿」），分页作用在**组**上 —— 否则同一篇文章会横跨两页。","operationId":"list_articles_api_admin_articles_get","security":[{"Bearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"draft | published","title":"Status"},"description":"draft | published"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"strategy | backtest | data | concept","title":"Category"},"description":"strategy | backtest | data | concept"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"description":"slug / 标题 / 摘要模糊匹配","title":"Q"},"description":"slug / 标题 / 摘要模糊匹配"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Page_ArticleGroupItem__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["管理后台","管理后台"],"summary":"新建文章","description":"三语一次提交。没给内容的语言会建成空草稿行，这样列表页的「还缺哪几种语言」才是一个查得出来的状态，而不是一次 NOT EXISTS。\n\n至少要给一种语言写标题，否则就是一篇空文章。","operationId":"create_article_api_admin_articles_post","security":[{"Bearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ArticleGroupDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/articles/{slug}":{"get":{"tags":["管理后台","管理后台"],"summary":"单篇文章的三语内容","description":"`contents` 里三种语言各一份全文（含 `body_md`），缺稿的语言是一份空草稿。","operationId":"get_article_api_admin_articles__slug__get","security":[{"Bearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":120,"description":"文章 slug（三语共用）","title":"Slug"},"description":"文章 slug（三语共用）"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ArticleGroupDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["管理后台","管理后台"],"summary":"更新文章","description":"只提交要改的字段。`locales` 里也只提交要改的语言与字段 —— 没带的键一律保持原样，带了 `null` 才是「清空」。\n\n把一篇已发布的稿子改空，它会自动退回草稿，而不是让前台挂一个空页面。","operationId":"update_article_api_admin_articles__slug__put","security":[{"Bearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":120,"description":"文章 slug（三语共用）","title":"Slug"},"description":"文章 slug（三语共用）"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleUpdateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ArticleGroupDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["管理后台","管理后台"],"summary":"删除文章","description":"删掉该 slug 的全部语言行。审计里留下删除时的标题与状态，删错了至少查得到删的是什么。","operationId":"delete_article_api_admin_articles__slug__delete","security":[{"Bearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":120,"description":"文章 slug（三语共用）","title":"Slug"},"description":"文章 slug（三语共用）"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ArticleDeleted_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/articles/{slug}/publish":{"post":{"tags":["管理后台","管理后台"],"summary":"发布","description":"省略 `locales` 时发布所有**有正文**的语言。缺标题或正文的语言会被明确拒绝，而不是安静跳过 —— 点了发布却什么都没变，只会让人再点五次。","operationId":"publish_article_api_admin_articles__slug__publish_post","security":[{"Bearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":120,"description":"文章 slug（三语共用）","title":"Slug"},"description":"文章 slug（三语共用）"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleStatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ArticleGroupDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/articles/{slug}/unpublish":{"post":{"tags":["管理后台","管理后台"],"summary":"取消发布","description":"退回草稿。`published_at` 保持不变 —— 它是**首次**发布时间，前台列表按它排序。","operationId":"unpublish_article_api_admin_articles__slug__unpublish_post","security":[{"Bearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":120,"description":"文章 slug（三语共用）","title":"Slug"},"description":"文章 slug（三语共用）"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleStatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ArticleGroupDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/audit":{"get":{"tags":["管理后台","管理后台"],"summary":"审计日志查询","description":"按时间倒序分页。`actor` 同时匹配邮箱（模糊）与用户 id（精确），运营手上有时只有邮箱、有时只有 id，分成两个参数会让人先猜自己该填哪个。\n\n`from` / `to` 可以只给日期：那时 `to` 取当天 23:59:59，否则 `from=to=2026-09-01` 会查出零条，而用户明明是想看那一天。","operationId":"list_audit_api_admin_audit_get","security":[{"Bearer":[]}],"parameters":[{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"精确匹配，如 article.publish","title":"Action"},"description":"精确匹配，如 article.publish"},{"name":"actor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"description":"操作者邮箱（模糊）或用户 id","title":"Actor"},"description":"操作者邮箱（模糊）或用户 id"},{"name":"target_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"user / article / export …","title":"Target Type"},"description":"user / article / export …"},{"name":"target_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Target Id"}},{"name":"result","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ok | failed","title":"Result"},"description":"ok | failed"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"起始时间，YYYY-MM-DD 或 ISO","title":"From"},"description":"起始时间，YYYY-MM-DD 或 ISO"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"结束时间，YYYY-MM-DD 或 ISO","title":"To"},"description":"结束时间，YYYY-MM-DD 或 ISO"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Page_AuditItem__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/audit/actions":{"get":{"tags":["管理后台","管理后台"],"summary":"出现过的动作与对象类型","description":"给筛选下拉框用。取最近 5000 条里出现过的取值 —— 对全表 DISTINCT 会随审计量线性变慢，而这只是个下拉框。","operationId":"list_actions_api_admin_audit_actions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AuditActions_"}}}}},"security":[{"Bearer":[]}]}},"/api/admin/data/symbols":{"get":{"tags":["管理后台","管理后台"],"summary":"标的列表（含日线行数与首末日期）","description":"日线的行数与首末日期只对**当前这一页**的标的聚合，不是全表 join —— 库里上万个标的、上千万根日线，一次 group by 全表会让这个页面打不开。\n\n`has_bars=false` 用来找「目录里有、但一根数据都没有」的标的，那通常意味着某次同步失败了。","operationId":"list_symbols_api_admin_data_symbols_get","security":[{"Bearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"代码或名称，模糊匹配","title":"Q"},"description":"代码或名称，模糊匹配"},{"name":"market","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"US / HK / CN","title":"Market"},"description":"US / HK / CN"},{"name":"has_bars","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"只看有数据 / 只看没数据的标的","title":"Has Bars"},"description":"只看有数据 / 只看没数据的标的"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"active / delisted …","title":"Status"},"description":"active / delisted …"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Page_SymbolItem__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data/coverage":{"get":{"tags":["管理后台","管理后台"],"summary":"数据覆盖概览","description":"各市场与各口径的标的数、日线行数、最早最晚日期，以及至少有 250 根日线的标的数（与公开统计 `/api/stats` 同一口径）。\n\n结果缓存 60 秒：这几个聚合要扫全表，每次刷新页面都重算会把库压垮。`cached=true` 表示这一份来自缓存。","operationId":"coverage_api_admin_data_coverage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_CoverageData_"}}}}},"security":[{"Bearer":[]}]}},"/api/admin/data/export":{"post":{"tags":["管理后台","管理后台"],"summary":"创建导出任务","description":"**小任务（≤50 个标的且区间 ≤5 年）同步执行，直接返回文件**，任务 id 在响应头 `X-Export-Id` 里。\n\n更大的任务落库、丢后台线程跑，返回 202 与任务信息，文件好了以后去 `/api/admin/data/exports/{id}/download` 取。\n\n两种路径都会登记任务、写审计，文件都在 7 天后过期清理。","operationId":"create_export_api_admin_data_export_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportCreateIn"}}},"required":true},"responses":{"200":{"description":"小任务：文件本身","content":{"application/json":{"schema":{"title":"Response Create Export Api Admin Data Export Post"}},"text/csv":{}}},"202":{"description":"大任务：已受理，返回任务 id"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Bearer":[]}]}},"/api/admin/data/exports":{"get":{"tags":["管理后台","管理后台"],"summary":"导出任务列表","description":"默认只列自己的导出。`mine=false` 看全部管理员的 —— 但下载仍然只限本人，导出文件里是完整的行情数据，谁申请的谁负责。","operationId":"list_exports_api_admin_data_exports_get","security":[{"Bearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"pending / running / done / failed","title":"Status"},"description":"pending / running / done / failed"},{"name":"mine","in":"query","required":false,"schema":{"type":"boolean","description":"只看自己的导出","default":true,"title":"Mine"},"description":"只看自己的导出"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Page_ExportItem__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data/exports/{export_id}/download":{"get":{"tags":["管理后台","管理后台"],"summary":"下载导出文件","description":"只有申请人本人能下载（403），过期或文件已被清理返回 410，任务还没跑完返回 409。\n\n这三种情况刻意各用一个状态码：前端要分别显示「无权」「重新导出」「稍后再试」，混成同一个 404 就只能显示一句没用的「失败」。","operationId":"download_export_api_admin_data_exports__export_id__download_get","security":[{"Bearer":[]}],"parameters":[{"name":"export_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Export Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data/sync-jobs":{"get":{"tags":["管理后台","管理后台"],"summary":"数据同步任务历史","description":"读 `sync_jobs` 表，按 id 倒序（等价于时间倒序，但 `started_at` 可能为空，按它排会把没起来的任务甩到末尾，而那恰恰是最该被看到的几条）。","operationId":"list_sync_jobs_api_admin_data_sync_jobs_get","security":[{"Bearer":[]}],"parameters":[{"name":"job_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"daily_bars / symbols / adjustments","title":"Job Type"},"description":"daily_bars / symbols / adjustments"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"running / ok / failed","title":"Status"},"description":"running / ok / failed"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Page_SyncJobItem__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stats/overview":{"get":{"tags":["管理后台","管理后台"],"summary":"后台概览","description":"一次取齐首屏要用的全部统计：用户、访问、回测、API、客户端来源、数据存量。\n\n时间窗口是「含今天在内的最近 `days` 个自然日（UTC）」，趋势数组的长度恒等于 `days`，没有数据的日子补 0，前端不必自己对齐坐标轴。\n\n`backtests.avg_duration_ms` 在窗口内没有耗时样本时为 `null`（不是 0）—— 0 会被读成「快得测不出来」，那不是事实。\n\n`backtests` 里的次数与耗时**口径不同**：次数来自 `backtests` 表（游客的试算不落库），耗时来自访问日志（含未登录试算）。因此「总数 0 + 平均耗时 60ms + 样本 42」是真实情况而不是故障。`latency_note` 就是给前端挂在耗时旁边的那句说明，没有样本时为 `null`。\n\n`clients[].top_paths` 与 `/stats/clients` 同源，每个来源最多 5 条。","operationId":"overview_api_admin_stats_overview_get","security":[{"Bearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"回溯天数，含今天。1~365","default":30,"title":"Days"},"description":"回溯天数，含今天。1~365"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_OverviewData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stats/timeseries":{"get":{"tags":["管理后台","管理后台"],"summary":"单指标时间序列","description":"取单个指标的按天序列，用于把某条曲线拉长看趋势。\n\n`metric` 取值：pv、uv、users、backtests、api_calls。\n\n`uv` 的 `total` 是各日 UV 之和，**不是**窗口内去重后的 UV（同一个人两天来两次会被数两次）。窗口去重值见 `/stats/overview` 的 `visits.uv`。","operationId":"timeseries_api_admin_stats_timeseries_get","security":[{"Bearer":[]}],"parameters":[{"name":"metric","in":"query","required":false,"schema":{"type":"string","description":"指标名：pv | uv | users | backtests | api_calls","default":"pv","title":"Metric"},"description":"指标名：pv | uv | users | backtests | api_calls"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TimeseriesData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stats/clients":{"get":{"tags":["管理后台","管理后台"],"summary":"客户端来源明细","description":"按来源拆分的访问量、独立访客数与独立注册用户数，含 Skill 与 MCP。\n\n六种来源恒定全部返回（没有流量的那几种是 0）：「Skill 一次都没被用过」本身就是要看到的结论，少一行就看不出来。\n\n脚本类客户端（skill / mcp / sdk / bot）没有 cookie，`visitors` 是按 IP + User-Agent 派生的稳定标识去重的，含义是「多少个运行环境」。","operationId":"clients_api_admin_stats_clients_get","security":[{"Bearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"回溯天数，含今天。1~365","default":30,"title":"Days"},"description":"回溯天数，含今天。1~365"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ClientsData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users":{"get":{"tags":["管理后台","管理后台"],"summary":"用户列表","description":"支持按邮箱 / 昵称模糊搜索，按套餐、状态、是否管理员筛选。\n\n`api_key_count` / `backtest_count` / `calls_30d` 只对当前这一页的用户聚合，不是全表 join —— 后台列表不该因为回测表长到几百万行就打不开。","operationId":"list_users_api_admin_users_get","security":[{"Bearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"description":"邮箱或昵称，模糊匹配","title":"Q"},"description":"邮箱或昵称，模糊匹配"},{"name":"plan","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"套餐码：free | pro | enterprise","title":"Plan"},"description":"套餐码：free | pro | enterprise"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"账号状态：active | banned | disabled","title":"Status"},"description":"账号状态：active | banned | disabled"},{"name":"is_admin","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"是否只看管理员","title":"Is Admin"},"description":"是否只看管理员"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码，从 1 开始","default":1,"title":"Page"},"description":"页码，从 1 开始"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"每页条数，最多 200","default":20,"title":"Size"},"description":"每页条数，最多 200"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Page_AdminUserItem__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}":{"get":{"tags":["管理后台","管理后台"],"summary":"用户详情","description":"基本信息 + API Key 列表（**只有前缀**）+ 最近 20 次回测 + 近 30 日调用趋势 + 最近 20 条访问记录。\n\n刻意不返回 Key 明文：运营需要知道的是「这个 Key 还在不在用」，不是「拿走它去调接口」。用户本人在控制台仍能看到自己的完整 Key。","operationId":"user_detail_api_admin_users__user_id__get","security":[{"Bearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AdminUserDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["管理后台","管理后台"],"summary":"修改用户套餐 / 状态 / 管理员身份","description":"**只有请求体里显式出现的字段会被写入**，因此 `\"plan_expires_at\": null` 表示「改成永久有效」，而省略该字段表示「保持原样」。\n\n每一项改动都会写一条审计（`user.plan_change` / `user.ban` / `user.unban` / `user.role_change` / `user.plan_expiry_change`），与改动在同一个事务里提交。\n\n管理员不能把自己降级或停用（400）：少了这道闸，一次手滑就可能让系统里再也没有管理员，恢复它只能直接连数据库改。","operationId":"update_user_api_admin_users__user_id__patch","security":[{"Bearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AdminUserItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/backtests":{"get":{"tags":["管理后台","管理后台"],"summary":"某个用户的回测记录","description":"含完整入参 `params` 与指标摘要 `summary`，用于复现用户报障时的那一次运行。","operationId":"user_backtests_api_admin_users__user_id__backtests_get","security":[{"Bearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"User Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码，从 1 开始","default":1,"title":"Page"},"description":"页码，从 1 开始"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"每页条数，最多 200","default":20,"title":"Size"},"description":"每页条数，最多 200"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Page_BacktestBrief__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/backtests":{"get":{"tags":["管理后台","管理后台"],"summary":"全站回测记录","description":"支持按用户、标的、策略筛选。`symbol` 是前缀匹配 —— 输入 `QQQ` 就能找到 `QQQ.US`，不必逼着运营敲全后缀。\n\n游客跑的回测 `user_id` 为空，同样会出现在列表里。","operationId":"list_backtests_api_admin_backtests_get","security":[{"Bearer":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"User Id"}},{"name":"symbol","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"标的代码，前缀匹配","title":"Symbol"},"description":"标的代码，前缀匹配"},{"name":"strategy","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"策略代码，精确匹配","title":"Strategy"},"description":"策略代码，精确匹配"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码，从 1 开始","default":1,"title":"Page"},"description":"页码，从 1 开始"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"每页条数，最多 200","default":20,"title":"Size"},"description":"每页条数，最多 200"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Page_BacktestBrief__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/visitors":{"get":{"tags":["管理后台","管理后台"],"summary":"访客列表","description":"按 `visitor_id` 汇总的访客，按最近一次访问倒序。\n\n`converted` 的唯一判据是「同一个 visitor_id 后来出现在了带 user_id 的访问里」。需求里提到的「同 IP 即同一人」刻意没有实现：NAT、公司出口、校园网背后是成百上千互不相干的人，按 IP 归并会凭空造出一批假转化。\n\n用 `converted=false` 看纯匿名访客，`client_kind=bot` 把爬虫单独拎出来。","operationId":"list_visitors_api_admin_visitors_get","security":[{"Bearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"converted","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"是否已转化为注册用户","title":"Converted"},"description":"是否已转化为注册用户"},{"name":"client_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"来源：web | skill | mcp | sdk | bot | unknown","title":"Client Kind"},"description":"来源：web | skill | mcp | sdk | bot | unknown"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码，从 1 开始","default":1,"title":"Page"},"description":"页码，从 1 开始"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"每页条数，最多 200","default":20,"title":"Size"},"description":"每页条数，最多 200"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Page_VisitorItem__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["系统"],"summary":"服务元信息","description":"API 基本信息。放在根路径，方便接入方一眼确认自己连对了环境。","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Root  Get"}}}}}}},"/health":{"get":{"tags":["系统"],"summary":"健康检查","description":"依赖连通性检查。\n\n刻意不套统一响应外壳：k8s 探针、Uptime 监控读的是状态码加一个扁平 JSON，\n多包一层 data 只会让每个监控配置都得多写一段路径表达式。","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Adjust":{"type":"string","enum":["none","qfq"],"title":"Adjust"},"AdminUserDetail":{"properties":{"user":{"$ref":"#/components/schemas/AdminUserItem"},"api_keys":{"items":{"$ref":"#/components/schemas/ApiKeyBrief"},"type":"array","title":"Api Keys"},"recent_backtests":{"items":{"$ref":"#/components/schemas/BacktestBrief"},"type":"array","title":"Recent Backtests"},"usage_trend":{"items":{"$ref":"#/components/schemas/ApiDayPoint"},"type":"array","title":"Usage Trend"},"usage_by_endpoint":{"items":{"$ref":"#/components/schemas/EndpointStat"},"type":"array","title":"Usage By Endpoint"},"recent_views":{"items":{"$ref":"#/components/schemas/PageViewBrief"},"type":"array","title":"Recent Views"}},"type":"object","required":["user"],"title":"AdminUserDetail"},"AdminUserItem":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"plan":{"type":"string","title":"Plan"},"plan_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Plan Expires At"},"status":{"type":"string","title":"Status"},"is_admin":{"type":"boolean","title":"Is Admin","default":false},"locale":{"type":"string","title":"Locale","default":"zh-CN"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"api_key_count":{"type":"integer","title":"Api Key Count","default":0},"backtest_count":{"type":"integer","title":"Backtest Count","default":0},"calls_30d":{"type":"integer","title":"Calls 30D","default":0}},"type":"object","required":["id","email","plan","status"],"title":"AdminUserItem"},"AdminUserUpdateIn":{"properties":{"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"is_admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Admin"},"plan_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Plan Expires At"},"reason":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Reason"}},"additionalProperties":false,"type":"object","title":"AdminUserUpdateIn","description":"改套餐 / 状态 / 管理员身份。\n\n**只有请求体里显式出现的字段才会被写入**（靠 pydantic 的 `model_fields_set`\n判断）。这一点很重要：`plan_expires_at: null` 表示「永不过期」，\n如果按「值为 None 就跳过」处理，管理员就永远没法把一个过期时间抹掉。"},"ApiDayPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"count":{"type":"integer","title":"Count","default":0},"error_count":{"type":"integer","title":"Error Count","default":0}},"type":"object","required":["date"],"title":"ApiDayPoint"},"ApiKeyBrief":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"status":{"type":"string","title":"Status"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","key_prefix","status"],"title":"ApiKeyBrief","description":"后台看到的 Key 只有前缀。\n\n控制台里本人可以看到完整 Key（那是他自己的凭证），但管理员不行 ——\n运营需要的是「这个 Key 还在不在用」，不是「拿走这个 Key 去调接口」。"},"ApiKeyCreateIn":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Name"}},"type":"object","title":"ApiKeyCreateIn"},"ApiKeyCreatedData":{"properties":{"key":{"$ref":"#/components/schemas/ApiKeyItem"},"plaintext":{"type":"string","title":"Plaintext"},"warning_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Warning I18N"}},"type":"object","required":["key","plaintext","warning_i18n"],"title":"ApiKeyCreatedData","description":"创建响应。`plaintext` 是全站唯一一处返回 Key 明文的地方。"},"ApiKeyItem":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"plaintext":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plaintext","description":"完整 Key（仅本人可见）；无法解密时为 null，需重置"},"status":{"type":"string","title":"Status"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","key_prefix","status","created_at"],"title":"ApiKeyItem","description":"列表项。刻意不含任何可用于调用的凭证材料。"},"ApiKeyListData":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApiKeyItem"},"type":"array","title":"Items"},"used":{"type":"integer","title":"Used","default":0},"max":{"type":"integer","title":"Max","default":0}},"type":"object","title":"ApiKeyListData"},"ApiKeyUpdateIn":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Name"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"ApiKeyUpdateIn","description":"改名或启停。两个字段都可选，只传要改的那个。"},"ApiResponse_AdminUserDetail_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/AdminUserDetail"},{"type":"null"}]}},"type":"object","title":"ApiResponse[AdminUserDetail]"},"ApiResponse_AdminUserItem_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/AdminUserItem"},{"type":"null"}]}},"type":"object","title":"ApiResponse[AdminUserItem]"},"ApiResponse_ApiKeyCreatedData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/ApiKeyCreatedData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[ApiKeyCreatedData]"},"ApiResponse_ApiKeyItem_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/ApiKeyItem"},{"type":"null"}]}},"type":"object","title":"ApiResponse[ApiKeyItem]"},"ApiResponse_ApiKeyListData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/ApiKeyListData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[ApiKeyListData]"},"ApiResponse_ArticleDeleted_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/ArticleDeleted"},{"type":"null"}]}},"type":"object","title":"ApiResponse[ArticleDeleted]"},"ApiResponse_ArticleGroupDetail_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/ArticleGroupDetail"},{"type":"null"}]}},"type":"object","title":"ApiResponse[ArticleGroupDetail]"},"ApiResponse_AuditActions_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/AuditActions"},{"type":"null"}]}},"type":"object","title":"ApiResponse[AuditActions]"},"ApiResponse_BacktestHistoryData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/BacktestHistoryData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[BacktestHistoryData]"},"ApiResponse_BacktestRunData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/BacktestRunData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[BacktestRunData]"},"ApiResponse_BatchData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/BatchData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[BatchData]"},"ApiResponse_ClientsData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/ClientsData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[ClientsData]"},"ApiResponse_CoverageData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/CoverageData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[CoverageData]"},"ApiResponse_DeleteAccountOut_":{"properties":{"code":{"type":"integer","title":"Code","description":"0 表示成功；失败时等于 HTTP 状态码","default":0},"message":{"type":"string","title":"Message","description":"面向用户的中文提示，成功时为 ok","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/DeleteAccountOut"},{"type":"null"}],"description":"业务数据，失败时为 null"}},"type":"object","title":"ApiResponse[DeleteAccountOut]"},"ApiResponse_DeleteData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/DeleteData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[DeleteData]"},"ApiResponse_IntradayData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/IntradayData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[IntradayData]"},"ApiResponse_KlineData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/KlineData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[KlineData]"},"ApiResponse_LoginOut_":{"properties":{"code":{"type":"integer","title":"Code","description":"0 表示成功；失败时等于 HTTP 状态码","default":0},"message":{"type":"string","title":"Message","description":"面向用户的中文提示，成功时为 ok","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/LoginOut"},{"type":"null"}],"description":"业务数据，失败时为 null"}},"type":"object","title":"ApiResponse[LoginOut]"},"ApiResponse_LogoutOut_":{"properties":{"code":{"type":"integer","title":"Code","description":"0 表示成功；失败时等于 HTTP 状态码","default":0},"message":{"type":"string","title":"Message","description":"面向用户的中文提示，成功时为 ok","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/LogoutOut"},{"type":"null"}],"description":"业务数据，失败时为 null"}},"type":"object","title":"ApiResponse[LogoutOut]"},"ApiResponse_NoneType_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"type":"null","title":"Data"}},"type":"object","title":"ApiResponse[NoneType]"},"ApiResponse_OverviewData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/OverviewData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[OverviewData]"},"ApiResponse_Page_AdminUserItem__":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/Page_AdminUserItem_"},{"type":"null"}]}},"type":"object","title":"ApiResponse[Page[AdminUserItem]]"},"ApiResponse_Page_ArticleGroupItem__":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/Page_ArticleGroupItem_"},{"type":"null"}]}},"type":"object","title":"ApiResponse[Page[ArticleGroupItem]]"},"ApiResponse_Page_AuditItem__":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/Page_AuditItem_"},{"type":"null"}]}},"type":"object","title":"ApiResponse[Page[AuditItem]]"},"ApiResponse_Page_BacktestBrief__":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/Page_BacktestBrief_"},{"type":"null"}]}},"type":"object","title":"ApiResponse[Page[BacktestBrief]]"},"ApiResponse_Page_ExportItem__":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/Page_ExportItem_"},{"type":"null"}]}},"type":"object","title":"ApiResponse[Page[ExportItem]]"},"ApiResponse_Page_SymbolItem__":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/Page_SymbolItem_"},{"type":"null"}]}},"type":"object","title":"ApiResponse[Page[SymbolItem]]"},"ApiResponse_Page_SyncJobItem__":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/Page_SyncJobItem_"},{"type":"null"}]}},"type":"object","title":"ApiResponse[Page[SyncJobItem]]"},"ApiResponse_Page_VisitorItem__":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/Page_VisitorItem_"},{"type":"null"}]}},"type":"object","title":"ApiResponse[Page[VisitorItem]]"},"ApiResponse_PlanData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/PlanData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[PlanData]"},"ApiResponse_PresetsData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/PresetsData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[PresetsData]"},"ApiResponse_QuoteData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/QuoteData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[QuoteData]"},"ApiResponse_RequestCodeOut_":{"properties":{"code":{"type":"integer","title":"Code","description":"0 表示成功；失败时等于 HTTP 状态码","default":0},"message":{"type":"string","title":"Message","description":"面向用户的中文提示，成功时为 ok","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/RequestCodeOut"},{"type":"null"}],"description":"业务数据，失败时为 null"}},"type":"object","title":"ApiResponse[RequestCodeOut]"},"ApiResponse_ScreenerData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScreenerData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[ScreenerData]"},"ApiResponse_ShareData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShareData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[ShareData]"},"ApiResponse_StaticData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/StaticData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[StaticData]"},"ApiResponse_StrategyListData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/StrategyListData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[StrategyListData]"},"ApiResponse_SymbolSearchData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/SymbolSearchData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[SymbolSearchData]"},"ApiResponse_TimeseriesData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/TimeseriesData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[TimeseriesData]"},"ApiResponse_TokenPairOut_":{"properties":{"code":{"type":"integer","title":"Code","description":"0 表示成功；失败时等于 HTTP 状态码","default":0},"message":{"type":"string","title":"Message","description":"面向用户的中文提示，成功时为 ok","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/TokenPairOut"},{"type":"null"}],"description":"业务数据，失败时为 null"}},"type":"object","title":"ApiResponse[TokenPairOut]"},"ApiResponse_UsageData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/UsageData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[UsageData]"},"ApiResponse_UserOut_":{"properties":{"code":{"type":"integer","title":"Code","description":"0 表示成功；失败时等于 HTTP 状态码","default":0},"message":{"type":"string","title":"Message","description":"面向用户的中文提示，成功时为 ok","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/UserOut"},{"type":"null"}],"description":"业务数据，失败时为 null"}},"type":"object","title":"ApiResponse[UserOut]"},"ApiResponse_V1BacktestData_":{"properties":{"code":{"type":"integer","title":"Code","default":0},"message":{"type":"string","title":"Message","default":"ok"},"data":{"anyOf":[{"$ref":"#/components/schemas/V1BacktestData"},{"type":"null"}]}},"type":"object","title":"ApiResponse[V1BacktestData]"},"ApiStats":{"properties":{"total":{"type":"integer","title":"Total","default":0},"error_count":{"type":"integer","title":"Error Count","default":0},"error_rate":{"type":"number","title":"Error Rate","default":0.0},"top_endpoints":{"items":{"$ref":"#/components/schemas/EndpointStat"},"type":"array","title":"Top Endpoints"},"trend":{"items":{"$ref":"#/components/schemas/ApiDayPoint"},"type":"array","title":"Trend"}},"type":"object","title":"ApiStats"},"ArticleContent":{"properties":{"slug":{"type":"string","title":"Slug"},"locale":{"type":"string","title":"Locale"},"title":{"type":"string","title":"Title","default":""},"summary":{"type":"string","title":"Summary","default":""},"category":{"type":"string","title":"Category","default":""},"status":{"type":"string","title":"Status","default":"draft"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"read_minutes":{"type":"integer","title":"Read Minutes","default":5},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"body_md":{"type":"string","title":"Body Md","default":""},"has_content":{"type":"boolean","title":"Has Content","default":false}},"type":"object","required":["slug","locale"],"title":"ArticleContent","description":"单语言全文。`body_md` 是 Markdown 原文 —— 渲染在前端，库里不存 HTML。"},"ArticleCreateIn":{"properties":{"slug":{"type":"string","maxLength":120,"minLength":1,"title":"Slug"},"category":{"type":"string","title":"Category","default":"concept"},"tags":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"read_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Read Minutes"},"status":{"type":"string","title":"Status","default":"draft"},"locales":{"additionalProperties":{"$ref":"#/components/schemas/ArticleLocaleIn"},"type":"object","title":"Locales"}},"additionalProperties":false,"type":"object","required":["slug"],"title":"ArticleCreateIn","description":"新建。三语一次提交，缺的语言留空为草稿。"},"ArticleDeleted":{"properties":{"slug":{"type":"string","title":"Slug"},"deleted_rows":{"type":"integer","title":"Deleted Rows"}},"type":"object","required":["slug","deleted_rows"],"title":"ArticleDeleted"},"ArticleGroupDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"category":{"type":"string","title":"Category"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"read_minutes":{"type":"integer","title":"Read Minutes","default":5},"status":{"type":"string","title":"Status","default":"draft"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"locales":{"additionalProperties":{"$ref":"#/components/schemas/ArticleLocaleState"},"type":"object","title":"Locales"},"published_locales":{"items":{"type":"string"},"type":"array","title":"Published Locales"},"missing_locales":{"items":{"type":"string"},"type":"array","title":"Missing Locales"},"contents":{"additionalProperties":{"$ref":"#/components/schemas/ArticleContent"},"type":"object","title":"Contents"},"changed_locales":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Changed Locales"}},"type":"object","required":["slug","category"],"title":"ArticleGroupDetail"},"ArticleGroupItem":{"properties":{"slug":{"type":"string","title":"Slug"},"category":{"type":"string","title":"Category"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"read_minutes":{"type":"integer","title":"Read Minutes","default":5},"status":{"type":"string","title":"Status","default":"draft"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"locales":{"additionalProperties":{"$ref":"#/components/schemas/ArticleLocaleState"},"type":"object","title":"Locales"},"published_locales":{"items":{"type":"string"},"type":"array","title":"Published Locales"},"missing_locales":{"items":{"type":"string"},"type":"array","title":"Missing Locales"}},"type":"object","required":["slug","category"],"title":"ArticleGroupItem","description":"一个 slug 的组级视图。`missing_locales` 是后台列表最常被扫的一列。"},"ArticleLocaleIn":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"body_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Md"},"tags":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"read_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Read Minutes"}},"additionalProperties":false,"type":"object","title":"ArticleLocaleIn","description":"一种语言的提交内容。**只带你想改的字段** —— 没带的字段保持原样。\n\n`extra=\"forbid\"`：把 `readMinutes` 写成驼峰、或者拼错 `body`，都会当场 422，\n而不是安安静静地什么都没改，然后让人以为保存功能坏了。"},"ArticleLocaleState":{"properties":{"exists":{"type":"boolean","title":"Exists","default":false},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"title":{"type":"string","title":"Title","default":""},"has_content":{"type":"boolean","title":"Has Content","default":false},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"ArticleLocaleState","description":"列表页每种语言一格：这门语言有没有稿、在不在线、什么时候改的。"},"ArticleStatusIn":{"properties":{"locales":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Locales"}},"additionalProperties":false,"type":"object","title":"ArticleStatusIn","description":"发布 / 取消发布的目标语言。省略时：发布作用于所有有正文的语言，\n取消发布作用于全部语言。"},"ArticleUpdateIn":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"read_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Read Minutes"},"locales":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ArticleLocaleIn"},"type":"object"},{"type":"null"}],"title":"Locales"}},"additionalProperties":false,"type":"object","title":"ArticleUpdateIn","description":"更新。只提交要改的字段；`locales` 里也只提交要改的语言与字段。\n\n状态不在这里改 —— 走 `/publish` 与 `/unpublish`。让 PUT 顺手改状态，\n审计里就只看得到一条 `article.update`，看不出那次改动其实是一次发布。"},"AssetType":{"type":"string","enum":["stock","etf","adr","preferred","warrant","unit","right","lp","trust"],"title":"AssetType","description":"``symbols.asset_type`` 里真实存在的类别。\n\n枚举必须覆盖库里所有取值，否则「显式请求权证」这件事根本发不出去 ——\n请求会在 Pydantic 那一层就 422，用户只会以为平台没有这类数据。\n实测库里的分布（2026-09-08，美股）：etf 5871、stock 5532、preferred 474、\nwarrant 442、adr 384、unit 313、right 123、lp 42、trust 11。\n\n**不传 asset_type 时不是「不过滤」，而是 :data:`DEFAULT_ASSET_TYPES`。**\n见它的说明。"},"AuditActions":{"properties":{"actions":{"items":{"type":"string"},"type":"array","title":"Actions"},"target_types":{"items":{"type":"string"},"type":"array","title":"Target Types"},"results":{"items":{"type":"string"},"type":"array","title":"Results"},"sampled_from":{"type":"integer","title":"Sampled From","default":5000}},"type":"object","title":"AuditActions"},"AuditItem":{"properties":{"id":{"type":"integer","title":"Id"},"ts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ts"},"actor_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actor User Id"},"actor_email":{"type":"string","title":"Actor Email","default":""},"action":{"type":"string","title":"Action","default":""},"target_type":{"type":"string","title":"Target Type","default":""},"target_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Id"},"detail":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Detail"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"result":{"type":"string","title":"Result","default":"ok"}},"type":"object","required":["id"],"title":"AuditItem"},"BacktestBrief":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"},"symbol_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol Name"},"strategy_code":{"type":"string","title":"Strategy Code"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"},"venue_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Mode"},"engine_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine Version"},"is_public":{"type":"boolean","title":"Is Public","default":false},"share_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Slug"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","strategy_code","start_date","end_date"],"title":"BacktestBrief"},"BacktestHistoryData":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"items":{"items":{"$ref":"#/components/schemas/BacktestHistoryItem"},"type":"array","title":"Items"},"saved_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saved Limit","description":"当前套餐可保存的条数，null 表示不限；超出后自动淘汰最旧的"}},"type":"object","required":["total","page","page_size","items"],"title":"BacktestHistoryData"},"BacktestHistoryItem":{"properties":{"id":{"type":"integer","title":"Id"},"symbol":{"type":"string","title":"Symbol"},"symbol_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol Name"},"strategy":{"type":"string","title":"Strategy"},"strategy_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Name"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"summary":{"$ref":"#/components/schemas/SummaryMetrics"},"engine_version":{"type":"string","title":"Engine Version"},"venue_mode":{"type":"string","title":"Venue Mode"},"share":{"$ref":"#/components/schemas/ShareInfo"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"has_result":{"type":"boolean","title":"Has Result","description":"大对象是否仍在，false 表示已被淘汰清理","default":true}},"type":"object","required":["id","symbol","strategy","params","start_date","end_date","summary","engine_version","venue_mode","share","created_at"],"title":"BacktestHistoryItem","description":"历史列表项，只带摘要，不读大对象。"},"BacktestRunData":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"已保存时为记录 id，游客或未保存时为 null"},"saved":{"type":"boolean","title":"Saved","default":false},"symbol":{"type":"string","title":"Symbol"},"symbol_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol Name"},"strategy":{"type":"string","title":"Strategy"},"strategy_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Name"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"engine_version":{"type":"string","title":"Engine Version","description":"同参数同版本必然复现同结果"},"venue_mode":{"type":"string","title":"Venue Mode"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"summary":{"$ref":"#/components/schemas/SummaryMetrics"},"cost":{"$ref":"#/components/schemas/CostAssumption"},"data_range":{"$ref":"#/components/schemas/DataRangeInfo"},"data_freshness":{"$ref":"#/components/schemas/app__schemas__backtest__DataFreshness"},"notes":{"items":{"$ref":"#/components/schemas/Note"},"type":"array","title":"Notes"},"share":{"$ref":"#/components/schemas/ShareInfo"},"disclaimer":{"type":"string","title":"Disclaimer","default":""},"trades":{"anyOf":[{"items":{"$ref":"#/components/schemas/TradeOut"},"type":"array"},{"type":"null"}],"title":"Trades"},"klines":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Klines"},"equity_curve":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Equity Curve"}},"type":"object","required":["symbol","strategy","params","engine_version","venue_mode","start_date","end_date","summary","cost","data_range","data_freshness"],"title":"BacktestRunData","description":"回测结果。站内返回完整数组；/v1 下三个大数组按需为 null。"},"BacktestRunIn":{"properties":{"symbol":{"type":"string","title":"Symbol","description":"标的代码，'QQQ' 或 'QQQ.US' 均可，缺省市场按美股解释"},"strategy":{"type":"string","title":"Strategy","description":"策略代码，见 GET /api/backtest/strategies","default":"chandelier"},"time_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Range","description":"预设区间；给了 start/end 时本字段被忽略","default":"6M"},"start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start"},"end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"策略参数，按 params_schema 校验"},"cost":{"anyOf":[{"$ref":"#/components/schemas/CostInput"},{"type":"null"}]},"initial_capital":{"anyOf":[{"type":"number","maximum":1000000000000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Initial Capital"},"execute_on":{"type":"string","enum":["next_open","close"],"title":"Execute On","default":"close"},"adjust":{"type":"string","enum":["split","split_dividend"],"title":"Adjust","description":"复权口径。split=仅拆股；split_dividend=拆股 + 现金分红（库中暂无分红数据时会提示）","default":"split"},"locale":{"anyOf":[{"type":"string","enum":["zh-CN","zh-TW","en"]},{"type":"null"}],"title":"Locale"},"save":{"type":"boolean","title":"Save","description":"登录用户是否落库保存本次回测","default":true}},"additionalProperties":true,"type":"object","required":["symbol"],"title":"BacktestRunIn","description":"站内回测请求。\n\n与 /v1/backtest 一样接受扁平风格（sma_period 等直接放顶层），未知顶层键归并进 params，\n以便前端与竞品风格的调用都能直接使用。"},"BacktestStats":{"properties":{"total":{"type":"integer","title":"Total","default":0},"today":{"type":"integer","title":"Today","default":0},"trend":{"items":{"$ref":"#/components/schemas/DayCount"},"type":"array","title":"Trend"},"top_symbols":{"items":{"$ref":"#/components/schemas/LabelCount"},"type":"array","title":"Top Symbols"},"top_strategies":{"items":{"$ref":"#/components/schemas/LabelCount"},"type":"array","title":"Top Strategies"},"avg_duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Duration Ms"},"duration_samples":{"type":"integer","title":"Duration Samples","default":0},"latency_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latency Note"}},"type":"object","title":"BacktestStats"},"BarOut":{"properties":{"ts":{"type":"string","format":"date","title":"Ts"},"open":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Open"},"high":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High"},"low":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Low"},"close":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Close"},"volume":{"type":"integer","title":"Volume","default":0}},"type":"object","required":["ts"],"title":"BarOut"},"BatchData":{"properties":{"type":{"$ref":"#/components/schemas/BatchType"},"requested":{"type":"integer","title":"Requested","default":0},"succeeded":{"type":"integer","title":"Succeeded","default":0},"failed":{"type":"integer","title":"Failed","default":0},"distribution_mode":{"type":"string","title":"Distribution Mode"},"results":{"additionalProperties":true,"type":"object","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["type","distribution_mode"],"title":"BatchData"},"BatchError":{"properties":{"symbol":{"type":"string","title":"Symbol"},"code":{"type":"integer","title":"Code"},"message":{"type":"string","title":"Message"}},"type":"object","required":["symbol","code","message"],"title":"BatchError"},"BatchRequest":{"properties":{"symbols":{"items":{"type":"string"},"type":"array","title":"Symbols"},"type":{"type":"string","title":"Type","default":"quote"},"period":{"type":"string","title":"Period","default":"day"},"adjust":{"type":"string","title":"Adjust","default":"none"},"days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days"}},"type":"object","title":"BatchRequest","description":"批量查询请求。\n\n字段刻意用宽松类型（str 而不是枚举）：非法取值由服务层校验并返回统一格式的\n400，而不是 FastAPI 默认那种 422 + ``{\"detail\": ...}``，以免破坏响应契约。"},"BatchType":{"type":"string","enum":["quote","static","kline"],"title":"BatchType"},"ClientStat":{"properties":{"kind":{"type":"string","title":"Kind"},"views":{"type":"integer","title":"Views","default":0},"visitors":{"type":"integer","title":"Visitors","default":0},"users":{"type":"integer","title":"Users","default":0},"share":{"type":"number","title":"Share","default":0.0},"last_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen"},"top_paths":{"items":{"$ref":"#/components/schemas/LabelCount"},"type":"array","title":"Top Paths"}},"type":"object","required":["kind"],"title":"ClientStat","description":"一种客户端来源的用量。kind 取值见 app.core.client_info.CLIENT_KINDS。"},"ClientsData":{"properties":{"days":{"type":"integer","title":"Days"},"since":{"type":"string","format":"date","title":"Since"},"until":{"type":"string","format":"date","title":"Until"},"total_views":{"type":"integer","title":"Total Views","default":0},"items":{"items":{"$ref":"#/components/schemas/ClientStat"},"type":"array","title":"Items"}},"type":"object","required":["days","since","until"],"title":"ClientsData"},"CostAssumption":{"properties":{"commission_rate":{"type":"number","title":"Commission Rate"},"min_commission":{"type":"number","title":"Min Commission"},"slippage_bps":{"type":"number","title":"Slippage Bps"},"initial_capital":{"type":"number","title":"Initial Capital"},"execute_on":{"type":"string","enum":["next_open","close"],"title":"Execute On","description":"close=信号日收盘成交（默认）；next_open=信号次日开盘成交（更接近实盘）"},"adjust":{"type":"string","enum":["split","split_dividend"],"title":"Adjust","description":"复权口径。split=仅拆股复权（默认）；split_dividend=拆股 + 现金分红复权。给默认值是为了让改版之前保存的回测记录仍能读出来。","default":"split"}},"type":"object","required":["commission_rate","min_commission","slippage_bps","initial_capital","execute_on"],"title":"CostAssumption","description":"本次回测实际使用的成本假设，原样回传，让结果可解释、可复现。"},"CostInput":{"properties":{"commission_rate":{"anyOf":[{"type":"number","maximum":0.05,"minimum":0.0},{"type":"null"}],"title":"Commission Rate","description":"手续费率，0.0003 即万三"},"min_commission":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Min Commission","description":"每笔最低手续费"},"slippage_bps":{"anyOf":[{"type":"number","maximum":1000.0,"minimum":0.0},{"type":"null"}],"title":"Slippage Bps","description":"滑点，基点。5 即万五"}},"additionalProperties":false,"type":"object","title":"CostInput","description":"交易成本入参。任一字段留空则取配置里的默认值。"},"CoverageData":{"properties":{"markets":{"items":{"$ref":"#/components/schemas/MarketCoverage"},"type":"array","title":"Markets"},"venue_modes":{"items":{"$ref":"#/components/schemas/VenueCoverage"},"type":"array","title":"Venue Modes"},"totals":{"$ref":"#/components/schemas/MarketCoverage"},"min_bars_for_history":{"type":"integer","title":"Min Bars For History","default":250},"generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated At"},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","title":"CoverageData"},"DataRangeInfo":{"properties":{"requested_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Requested Start"},"requested_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Requested End"},"actual_start":{"type":"string","format":"date","title":"Actual Start"},"actual_end":{"type":"string","format":"date","title":"Actual End"},"available_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Available Start"},"available_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Available End"},"bars":{"type":"integer","title":"Bars"},"truncated":{"type":"boolean","title":"Truncated","default":false},"reason_codes":{"items":{"type":"string"},"type":"array","title":"Reason Codes"}},"type":"object","required":["actual_start","actual_end","bars"],"title":"DataRangeInfo","description":"实际使用的数据区间。\n\n竞品在请求区间早于数据起点时静默截断，用户以为在看 5 年回测，其实只有 1 年。\n这里把请求区间、实际区间、可用区间、是否截断、截断原因全部摊开。"},"DataStats":{"properties":{"symbols_total":{"type":"integer","title":"Symbols Total","default":0},"symbols_active":{"type":"integer","title":"Symbols Active","default":0},"symbols_delisted":{"type":"integer","title":"Symbols Delisted","default":0},"bars_rows":{"type":"integer","title":"Bars Rows","default":0},"bars_by_venue_mode":{"items":{"$ref":"#/components/schemas/LabelCount"},"type":"array","title":"Bars By Venue Mode"},"latest_bar_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Latest Bar Date"},"adjustments_rows":{"type":"integer","title":"Adjustments Rows","default":0},"trading_days":{"type":"integer","title":"Trading Days","default":0},"recent_sync_jobs":{"items":{"$ref":"#/components/schemas/SyncJobBrief"},"type":"array","title":"Recent Sync Jobs"}},"type":"object","title":"DataStats"},"DayCount":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"count":{"type":"integer","title":"Count","default":0}},"type":"object","required":["date"],"title":"DayCount","description":"按天的单值序列。缺失的日子由服务层补 0，前端不必自己对齐坐标轴。"},"DeleteAccountIn":{"properties":{"confirm_email":{"type":"string","title":"Confirm Email","description":"与登录邮箱一致才执行注销"}},"type":"object","required":["confirm_email"],"title":"DeleteAccountIn","description":"注销账户：要求重复输入邮箱确认。"},"DeleteAccountOut":{"properties":{"deleted":{"type":"boolean","title":"Deleted","default":true}},"type":"object","title":"DeleteAccountOut"},"DeleteData":{"properties":{"id":{"type":"integer","title":"Id"},"deleted":{"type":"boolean","title":"Deleted"}},"type":"object","required":["id","deleted"],"title":"DeleteData"},"EndpointStat":{"properties":{"endpoint":{"type":"string","title":"Endpoint"},"count":{"type":"integer","title":"Count","default":0},"error_count":{"type":"integer","title":"Error Count","default":0},"error_rate":{"type":"number","title":"Error Rate","default":0.0}},"type":"object","required":["endpoint"],"title":"EndpointStat"},"ExportCreateIn":{"properties":{"symbols":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Symbols","description":"标的代码，如 QQQ.US"},"start":{"type":"string","title":"Start","description":"起始日期 YYYY-MM-DD"},"end":{"type":"string","title":"End","description":"结束日期 YYYY-MM-DD"},"period":{"type":"string","title":"Period","description":"day | week | month","default":"day"},"adjust":{"type":"string","title":"Adjust","description":"none | qfq","default":"none"},"format":{"type":"string","title":"Format","description":"csv | json","default":"csv"}},"additionalProperties":false,"type":"object","required":["symbols","start","end"],"title":"ExportCreateIn"},"ExportItem":{"properties":{"id":{"type":"integer","title":"Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"user_id":{"type":"integer","title":"User Id"},"symbols":{"items":{"type":"string"},"type":"array","title":"Symbols"},"symbol_count":{"type":"integer","title":"Symbol Count","default":0},"start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start"},"end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End"},"period":{"type":"string","title":"Period","default":"day"},"adjust":{"type":"string","title":"Adjust","default":"none"},"format":{"type":"string","title":"Format","default":"csv"},"status":{"type":"string","title":"Status","default":"pending"},"rows":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rows"},"bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bytes"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"expired":{"type":"boolean","title":"Expired","default":false},"downloadable":{"type":"boolean","title":"Downloadable","default":false}},"type":"object","required":["id","user_id"],"title":"ExportItem"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IntradayBarOut":{"properties":{"ts":{"type":"string","title":"Ts","description":"ISO8601 时间戳"},"open":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Open"},"high":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High"},"low":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Low"},"close":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Close"},"volume":{"type":"integer","title":"Volume","default":0}},"type":"object","required":["ts"],"title":"IntradayBarOut"},"IntradayData":{"properties":{"symbol":{"type":"string","title":"Symbol"},"market":{"type":"string","title":"Market"},"date":{"type":"string","format":"date","title":"Date"},"interval":{"type":"string","title":"Interval","default":"1m"},"venue_mode":{"type":"string","title":"Venue Mode"},"venue_mode_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Mode Label"},"delayed":{"type":"boolean","title":"Delayed","default":true},"delay_minutes":{"type":"integer","title":"Delay Minutes","default":0},"timeliness":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Timeliness"},"count":{"type":"integer","title":"Count","default":0},"bars":{"items":{"$ref":"#/components/schemas/IntradayBarOut"},"type":"array","title":"Bars"}},"type":"object","required":["symbol","market","date","venue_mode"],"title":"IntradayData"},"KlineData":{"properties":{"symbol":{"type":"string","title":"Symbol"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"market":{"type":"string","title":"Market"},"currency":{"type":"string","title":"Currency","default":"USD"},"period":{"$ref":"#/components/schemas/Period"},"adjust":{"$ref":"#/components/schemas/Adjust"},"adjust_applied":{"type":"boolean","title":"Adjust Applied","default":false},"venue_mode":{"type":"string","title":"Venue Mode"},"venue_mode_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Mode Label"},"delayed":{"type":"boolean","title":"Delayed","default":true},"as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of","description":"本次响应允许分发的最新数据日期"},"timeliness":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Timeliness"},"start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start"},"end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End"},"count":{"type":"integer","title":"Count","default":0},"bars":{"items":{"$ref":"#/components/schemas/BarOut"},"type":"array","title":"Bars"}},"type":"object","required":["symbol","market","period","adjust","venue_mode"],"title":"KlineData"},"LabelCount":{"properties":{"key":{"type":"string","title":"Key"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"count":{"type":"integer","title":"Count","default":0}},"type":"object","required":["key"],"title":"LabelCount","description":"Top N 排行的一项。`key` 是机器可读的值，`label` 是展示名（可能为空）。"},"LoginOut":{"properties":{"user":{"$ref":"#/components/schemas/UserOut","description":"登录用户信息"},"token":{"$ref":"#/components/schemas/TokenPairOut","description":"本次签发的令牌对"},"is_new_user":{"type":"boolean","title":"Is New User","description":"true 表示这次登录顺带完成了注册，前端可引导填写昵称"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key","description":"新用户注册时自动签发的 API Key 明文，仅此一次返回；老用户为 null"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token","description":"与 token.access_token 相同，平铺便于前端统一处理"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token","description":"与 token.refresh_token 相同"}},"type":"object","required":["user","token","is_new_user"],"title":"LoginOut"},"LogoutIn":{"properties":{"refresh_token":{"type":"string","minLength":16,"title":"Refresh Token","description":"要作废的刷新令牌"}},"type":"object","required":["refresh_token"],"title":"LogoutIn"},"LogoutOut":{"properties":{"logged_out":{"type":"boolean","title":"Logged Out","description":"固定为 true。登出是幂等操作，令牌无效也算成功"}},"type":"object","required":["logged_out"],"title":"LogoutOut"},"MarketCoverage":{"properties":{"market":{"type":"string","title":"Market"},"symbols":{"type":"integer","title":"Symbols","default":0},"symbols_with_bars":{"type":"integer","title":"Symbols With Bars","default":0},"symbols_with_history":{"type":"integer","title":"Symbols With History","default":0},"bars":{"type":"integer","title":"Bars","default":0},"earliest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Earliest"},"latest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest"}},"type":"object","required":["market"],"title":"MarketCoverage"},"MetricKind":{"type":"string","enum":["price","percent","multiple","amount"],"title":"MetricKind","description":"派生列的量纲。前端据此决定格式化方式，不必按字段名硬编码。"},"Note":{"properties":{"code":{"type":"string","title":"Code"},"level":{"type":"string","enum":["info","warning"],"title":"Level","default":"info"},"message":{"type":"string","title":"Message"}},"type":"object","required":["code","message"],"title":"Note","description":"给用户看的提示。code 供前端做条件渲染，message 已按 locale 本地化。"},"OverviewData":{"properties":{"days":{"type":"integer","title":"Days"},"since":{"type":"string","format":"date","title":"Since"},"until":{"type":"string","format":"date","title":"Until"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"users":{"$ref":"#/components/schemas/UserStats"},"visits":{"$ref":"#/components/schemas/VisitStats"},"backtests":{"$ref":"#/components/schemas/BacktestStats"},"api":{"$ref":"#/components/schemas/ApiStats"},"clients":{"items":{"$ref":"#/components/schemas/ClientStat"},"type":"array","title":"Clients"},"data":{"$ref":"#/components/schemas/DataStats"}},"type":"object","required":["days","since","until","generated_at","users","visits","backtests","api","data"],"title":"OverviewData"},"PageViewBrief":{"properties":{"ts":{"type":"string","format":"date-time","title":"Ts"},"path":{"type":"string","title":"Path"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"},"client_kind":{"type":"string","title":"Client Kind"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"visitor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visitor Id"}},"type":"object","required":["ts","path","client_kind"],"title":"PageViewBrief"},"Page_AdminUserItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminUserItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"size":{"type":"integer","title":"Size","default":20}},"type":"object","title":"Page[AdminUserItem]"},"Page_ArticleGroupItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ArticleGroupItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"size":{"type":"integer","title":"Size","default":20}},"type":"object","title":"Page[ArticleGroupItem]"},"Page_AuditItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AuditItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"size":{"type":"integer","title":"Size","default":20}},"type":"object","title":"Page[AuditItem]"},"Page_BacktestBrief_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BacktestBrief"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"size":{"type":"integer","title":"Size","default":20}},"type":"object","title":"Page[BacktestBrief]"},"Page_ExportItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ExportItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"size":{"type":"integer","title":"Size","default":20}},"type":"object","title":"Page[ExportItem]"},"Page_SymbolItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/app__api__admin__data__SymbolItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"size":{"type":"integer","title":"Size","default":20}},"type":"object","title":"Page[SymbolItem]"},"Page_SyncJobItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SyncJobItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"size":{"type":"integer","title":"Size","default":20}},"type":"object","title":"Page[SyncJobItem]"},"Page_VisitorItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/VisitorItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"size":{"type":"integer","title":"Size","default":20}},"type":"object","title":"Page[VisitorItem]"},"Period":{"type":"string","enum":["day","week","month"],"title":"Period"},"PlanData":{"properties":{"code":{"type":"string","title":"Code"},"name_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Name I18N"},"desc_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Desc I18N"},"currency":{"type":"string","title":"Currency","default":"CNY"},"price_month":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Month"},"price_year":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Year"},"negotiable":{"type":"boolean","title":"Negotiable","default":false},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"expired":{"type":"boolean","title":"Expired","default":false},"features":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Features"},"feature_labels_i18n":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Feature Labels I18N"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"},"rate":{"items":{"$ref":"#/components/schemas/RateQuotaItem"},"type":"array","title":"Rate"},"quotas":{"items":{"$ref":"#/components/schemas/QuotaItem"},"type":"array","title":"Quotas"},"usage_today":{"type":"integer","title":"Usage Today","default":0}},"type":"object","required":["code"],"title":"PlanData"},"PresetItem":{"properties":{"code":{"type":"string","title":"Code"},"name_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Name I18N"},"desc_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Desc I18N"},"conditions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conditions"},"sort":{"additionalProperties":{"type":"string"},"type":"object","title":"Sort"}},"type":"object","required":["code"],"title":"PresetItem"},"PresetsData":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PresetItem"},"type":"array","title":"Items"},"fields":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Fields"},"ops":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Ops"},"limits":{"additionalProperties":{"type":"integer"},"type":"object","title":"Limits"}},"type":"object","title":"PresetsData"},"ProfileUpdateIn":{"properties":{"nickname":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Nickname","description":"昵称，传空字符串表示清空"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale","description":"界面语言 zh-CN / zh-TW / en"}},"type":"object","title":"ProfileUpdateIn","description":"账户设置：改昵称 / 界面语言。未传的字段不改。"},"QuotaItem":{"properties":{"key":{"type":"string","title":"Key"},"used":{"type":"integer","title":"Used"},"max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max"},"label_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Label I18N"}},"type":"object","required":["key","used"],"title":"QuotaItem","description":"计数型额度（Key 数量、回测条数）。max 为 None 表示不限。"},"QuoteData":{"properties":{"symbol":{"type":"string","title":"Symbol"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"market":{"type":"string","title":"Market"},"currency":{"type":"string","title":"Currency","default":"USD"},"last":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last"},"open":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Open"},"high":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High"},"low":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Low"},"prev_close":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prev Close"},"change":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change"},"change_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change Pct"},"volume":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Volume"},"ts":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ts","description":"数据本身所属的时点，不是响应生成时间"},"as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of"},"delayed":{"type":"boolean","title":"Delayed","default":true},"venue_mode":{"type":"string","title":"Venue Mode"},"venue_mode_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Mode Label"},"timeliness":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Timeliness"},"source":{"type":"string","title":"Source"}},"type":"object","required":["symbol","market","venue_mode","source"],"title":"QuoteData"},"RateQuotaItem":{"properties":{"category":{"type":"string","title":"Category"},"label_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Label I18N"},"limit":{"type":"integer","title":"Limit"},"window_sec":{"type":"integer","title":"Window Sec"},"remaining":{"type":"integer","title":"Remaining"},"reset_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reset At"},"available":{"type":"boolean","title":"Available","default":true}},"type":"object","required":["category","limit","window_sec","remaining"],"title":"RateQuotaItem","description":"单个端点类别的限流额度与实时剩余量。"},"RefreshIn":{"properties":{"refresh_token":{"type":"string","minLength":16,"title":"Refresh Token","description":"当前持有的刷新令牌"}},"type":"object","required":["refresh_token"],"title":"RefreshIn"},"RequestCodeIn":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"登录邮箱。本站登录即注册，未注册的邮箱会在验证通过后自动开户"},"locale":{"anyOf":[{"type":"string","enum":["zh-CN","zh-TW","en"]},{"type":"null"}],"title":"Locale","description":"界面语言，决定验证码邮件用哪套文案；留空则用站点默认语言 zh-CN"}},"type":"object","required":["email"],"title":"RequestCodeIn"},"RequestCodeOut":{"properties":{"sent":{"type":"boolean","title":"Sent","description":"是否已受理发送请求。无论邮箱是否已注册，该值都为 true"},"expires_in":{"type":"integer","title":"Expires In","description":"验证码有效期，单位秒"},"cooldown":{"type":"integer","title":"Cooldown","description":"下次可再请求验证码需要等待的秒数"},"dev_mode":{"type":"boolean","title":"Dev Mode","description":"true 表示服务端未配置 SMTP，验证码只打印到了日志，仅可能出现在开发环境","default":false},"channel":{"type":"string","enum":["smtp","log"],"title":"Channel","description":"实际投递通道：smtp 已发信，log 仅落日志"}},"type":"object","required":["sent","expires_in","cooldown","channel"],"title":"RequestCodeOut"},"ScreenerColumn":{"properties":{"key":{"type":"string","title":"Key"},"kind":{"$ref":"#/components/schemas/MetricKind"},"period":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Period"},"label_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Label I18N"}},"type":"object","required":["key","kind"],"title":"ScreenerColumn","description":"一个派生列的自描述信息。\n\n前端据此渲染表头与格式，不必为每个新指标改一次前端代码 —— 加一个操作符就多\n一列，列名与三语标签跟着条件一起从后端下发。"},"ScreenerCondition":{"properties":{"field":{"$ref":"#/components/schemas/ScreenerField"},"op":{"$ref":"#/components/schemas/ScreenerOp"},"period":{"anyOf":[{"type":"integer","maximum":1200.0,"minimum":2.0},{"type":"null"}],"title":"Period","description":"回看根数"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value","description":"单值阈值（above / below / *_avg_multiple）"},"min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min","description":"区间下界（含）"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max","description":"区间上界（含）"},"within_pct":{"anyOf":[{"type":"number","maximum":100.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Within Pct","description":"距极值的百分比（near_high / near_low）"}},"type":"object","required":["field","op"],"title":"ScreenerCondition","description":"一个筛选条件。多个条件之间是 AND。\n\n数值参数按操作符各取所需，缺哪个由 service 的编译器报出**具体**哪个参数缺失，\n而不是笼统一句\"参数有误\"——选股条件是用户手拼的，含糊的报错等于没报错。"},"ScreenerData":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ScreenerItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","default":0},"count":{"type":"integer","title":"Count","default":0},"scanned":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scanned"},"as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of"},"elapsed_ms":{"type":"number","title":"Elapsed Ms","default":0.0},"data_freshness":{"$ref":"#/components/schemas/app__schemas__screener__DataFreshness"},"columns":{"items":{"$ref":"#/components/schemas/ScreenerColumn"},"type":"array","title":"Columns"},"market":{"type":"string","title":"Market","default":"US"},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type"},"asset_types":{"items":{"type":"string"},"type":"array","title":"Asset Types"},"lookback_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Lookback From"},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"}},"type":"object","title":"ScreenerData"},"ScreenerField":{"type":"string","enum":["close","volume","atr_pct"],"title":"ScreenerField","description":"可参与条件的字段。\n\n``atr_pct`` 是派生字段（ATR 占收盘价的百分比），必须带 period；\n其余两个是日线原始列。刻意不开放 open/high/low —— 它们单独出现在选股条件里\n几乎没有实际用途，而每多一个字段就多一条要维护的单位换算规则。"},"ScreenerItem":{"properties":{"symbol":{"type":"string","title":"Symbol"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"market":{"type":"string","title":"Market"},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type"},"ts":{"type":"string","format":"date","title":"Ts","description":"这一行数据对应的交易日"},"close":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Close"},"change_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change Pct","description":"较前一交易日的涨跌幅（%）"},"volume":{"type":"integer","title":"Volume","default":0},"turnover":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Turnover","description":"成交额 = 收盘价 × 成交量"},"metrics":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Metrics","description":"派生指标，键与 columns[].key 一一对应"}},"type":"object","required":["symbol","market","ts"],"title":"ScreenerItem","description":"一条命中记录：该标的**最新一根**日线，以及本次条件涉及的派生指标。"},"ScreenerOp":{"type":"string","enum":["above_ma","below_ma","above_avg_multiple","below_avg_multiple","pct_change","near_high","near_low","new_high","new_low","pullback_from_high","between","above","below"],"title":"ScreenerOp","description":"操作符白名单。\n\n命名统一用「主语在前」的读法：``close above_ma 200`` 读作\"收盘价站上 200 日均线\"。"},"ScreenerRequest":{"properties":{"market":{"type":"string","maxLength":8,"title":"Market","default":"US"},"asset_type":{"anyOf":[{"$ref":"#/components/schemas/AssetType"},{"type":"null"}]},"conditions":{"items":{"$ref":"#/components/schemas/ScreenerCondition"},"type":"array","maxItems":10,"title":"Conditions"},"sort":{"$ref":"#/components/schemas/ScreenerSort"},"limit":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Limit","default":100},"preset":{"anyOf":[{"type":"string","maxLength":48},{"type":"null"}],"title":"Preset","description":"预设方案代码。给了它就以预设的条件与排序为准，忽略 conditions/sort"}},"type":"object","title":"ScreenerRequest","description":"选股请求。全部字段可选：什么都不给就是\"该市场按成交额排序的全景榜\"。"},"ScreenerSort":{"properties":{"field":{"type":"string","maxLength":32,"title":"Field","default":"turnover"},"dir":{"$ref":"#/components/schemas/SortDir","default":"desc"}},"type":"object","title":"ScreenerSort","description":"排序说明。``field`` 走白名单词干 + 整数周期，绝不原样进 ORDER BY。"},"SeriesPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"value":{"type":"integer","title":"Value","default":0}},"type":"object","required":["date"],"title":"SeriesPoint"},"ShareData":{"properties":{"id":{"type":"integer","title":"Id"},"share":{"$ref":"#/components/schemas/ShareInfo"}},"type":"object","required":["id","share"],"title":"ShareData"},"ShareIn":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"false 表示撤销分享","default":true}},"additionalProperties":false,"type":"object","title":"ShareIn"},"ShareInfo":{"properties":{"is_public":{"type":"boolean","title":"Is Public","default":false},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","title":"ShareInfo"},"SortDir":{"type":"string","enum":["asc","desc"],"title":"SortDir"},"StaticData":{"properties":{"symbol":{"type":"string","title":"Symbol","description":"统一格式代码，如 QQQ.US"},"raw_symbol":{"type":"string","title":"Raw Symbol","description":"数据源原始代码，如 QQQ"},"market":{"type":"string","title":"Market","description":"市场：US / HK / CN"},"exchange":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exchange","description":"交易所：US / HK / SH / SZ。CN 市场下沪深两所据此区分，其余市场与 market 同名"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type"},"primary_venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Venue"},"currency":{"type":"string","title":"Currency","default":"USD"},"listed_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Listed On"},"delisted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delisted On"},"is_delisted":{"type":"boolean","title":"Is Delisted","default":false},"is_popular":{"type":"boolean","title":"Is Popular","default":false},"lot_size":{"type":"integer","title":"Lot Size","default":1},"status":{"type":"string","title":"Status","default":"active"},"history_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"History Start"},"history_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"History End"},"venue_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Mode"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["symbol","raw_symbol","market"],"title":"StaticData"},"StrategyInfo":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"desc":{"type":"string","title":"Desc"},"name_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Name I18N"},"desc_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Desc I18N"},"params_schema":{"additionalProperties":true,"type":"object","title":"Params Schema","description":"前端据此动态渲染参数面板"},"is_pro":{"type":"boolean","title":"Is Pro","default":false},"available":{"type":"boolean","title":"Available","description":"当前套餐是否可用","default":true},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["code","name","desc","name_i18n","desc_i18n","params_schema"],"title":"StrategyInfo"},"StrategyListData":{"properties":{"items":{"items":{"$ref":"#/components/schemas/StrategyInfo"},"type":"array","title":"Items"},"default_strategy":{"type":"string","title":"Default Strategy"},"time_ranges":{"items":{"type":"string"},"type":"array","title":"Time Ranges"},"default_cost":{"$ref":"#/components/schemas/CostAssumption"}},"type":"object","required":["items","default_strategy","default_cost"],"title":"StrategyListData"},"SummaryMetrics":{"properties":{"num_trades":{"type":"integer","title":"Num Trades","default":0},"closed_trades":{"type":"integer","title":"Closed Trades","description":"其中已平仓的笔数；num_trades 含持仓中的那笔","default":0},"win_rate":{"type":"number","title":"Win Rate","default":0.0},"total_pnl_pct":{"type":"number","title":"Total Pnl Pct","default":0.0},"annualized_pct":{"type":"number","title":"Annualized Pct","default":0.0},"max_drawdown_pct":{"type":"number","title":"Max Drawdown Pct","default":0.0},"sharpe":{"type":"number","title":"Sharpe","default":0.0},"profit_factor":{"type":"number","title":"Profit Factor","default":0.0},"avg_hold_bars":{"type":"number","title":"Avg Hold Bars","default":0.0},"buy_hold_pnl_pct":{"type":"number","title":"Buy Hold Pnl Pct","default":0.0},"buy_hold_max_dd_pct":{"type":"number","title":"Buy Hold Max Dd Pct","default":0.0},"excess_return_pct":{"type":"number","title":"Excess Return Pct","default":0.0},"num_bars":{"type":"integer","title":"Num Bars","default":0},"venue_mode":{"type":"string","title":"Venue Mode","default":"consolidated"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","title":"SummaryMetrics","description":"指标卡。与 backtests.summary 落库的内容一致，可直接排序检索。"},"SymbolSearchData":{"properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"market":{"type":"string","title":"Market"},"total":{"type":"integer","title":"Total","description":"命中总数（不受 limit 限制）"},"count":{"type":"integer","title":"Count","description":"本次返回条数"},"items":{"items":{"$ref":"#/components/schemas/app__schemas__market__SymbolItem"},"type":"array","title":"Items"}},"type":"object","required":["market","total","count"],"title":"SymbolSearchData"},"SyncJobBrief":{"properties":{"id":{"type":"integer","title":"Id"},"job_type":{"type":"string","title":"Job Type"},"trade_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Trade Date"},"status":{"type":"string","title":"Status"},"rows_written":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rows Written"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"}},"type":"object","required":["id","job_type","status"],"title":"SyncJobBrief"},"SyncJobItem":{"properties":{"id":{"type":"integer","title":"Id"},"job_type":{"type":"string","title":"Job Type","default":""},"trade_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trade Date"},"status":{"type":"string","title":"Status","default":""},"rows_written":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rows Written"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At"},"duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Sec"}},"type":"object","required":["id"],"title":"SyncJobItem"},"TimeseriesData":{"properties":{"metric":{"type":"string","title":"Metric"},"days":{"type":"integer","title":"Days"},"since":{"type":"string","format":"date","title":"Since"},"until":{"type":"string","format":"date","title":"Until"},"total":{"type":"integer","title":"Total","default":0},"points":{"items":{"$ref":"#/components/schemas/SeriesPoint"},"type":"array","title":"Points"}},"type":"object","required":["metric","days","since","until"],"title":"TimeseriesData"},"TokenPairOut":{"properties":{"access_token":{"type":"string","title":"Access Token","description":"访问令牌，放进 Authorization: Bearer 头调用需登录的接口"},"refresh_token":{"type":"string","title":"Refresh Token","description":"刷新令牌。每次刷新都会换发新的一枚，旧的立即失效，务必覆盖保存"},"token_type":{"type":"string","const":"Bearer","title":"Token Type","description":"令牌类型，固定 Bearer","default":"Bearer"},"expires_in":{"type":"integer","title":"Expires In","description":"访问令牌剩余有效期，单位秒"},"refresh_expires_in":{"type":"integer","title":"Refresh Expires In","description":"刷新令牌剩余有效期，单位秒"}},"type":"object","required":["access_token","refresh_token","expires_in","refresh_expires_in"],"title":"TokenPairOut"},"TradeOut":{"properties":{"seq":{"type":"integer","title":"Seq"},"entry_date":{"type":"string","format":"date","title":"Entry Date"},"entry_price":{"type":"number","title":"Entry Price"},"exit_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Exit Date"},"exit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Exit Price"},"shares":{"type":"number","title":"Shares","default":0.0},"pnl_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pnl Pct"},"pnl_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pnl Amount"},"hold_bars":{"type":"integer","title":"Hold Bars","default":0},"exit_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exit Reason"},"is_open":{"type":"boolean","title":"Is Open","default":true}},"type":"object","required":["seq","entry_date","entry_price"],"title":"TradeOut"},"UsageByDay":{"properties":{"day":{"type":"string","format":"date","title":"Day"},"count":{"type":"integer","title":"Count","default":0},"error_count":{"type":"integer","title":"Error Count","default":0}},"type":"object","required":["day"],"title":"UsageByDay"},"UsageByEndpoint":{"properties":{"endpoint":{"type":"string","title":"Endpoint"},"count":{"type":"integer","title":"Count","default":0},"error_count":{"type":"integer","title":"Error Count","default":0}},"type":"object","required":["endpoint"],"title":"UsageByEndpoint"},"UsageData":{"properties":{"start":{"type":"string","format":"date","title":"Start"},"end":{"type":"string","format":"date","title":"End"},"total":{"type":"integer","title":"Total","default":0},"error_total":{"type":"integer","title":"Error Total","default":0},"by_day":{"items":{"$ref":"#/components/schemas/UsageByDay"},"type":"array","title":"By Day"},"by_endpoint":{"items":{"$ref":"#/components/schemas/UsageByEndpoint"},"type":"array","title":"By Endpoint"},"lag_sec":{"type":"integer","title":"Lag Sec","default":60}},"type":"object","required":["start","end"],"title":"UsageData"},"UserOut":{"properties":{"id":{"type":"integer","title":"Id","description":"用户 ID"},"email":{"type":"string","format":"email","title":"Email","description":"登录邮箱"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname","description":"昵称，未设置时前端可用邮箱前缀兜底展示"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url","description":"头像地址"},"plan":{"type":"string","title":"Plan","description":"套餐码：free / pro / enterprise"},"plan_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Plan Expires At","description":"套餐到期时间，免费用户为 null"},"locale":{"type":"string","title":"Locale","description":"用户界面语言：zh-CN / zh-TW / en"},"is_admin":{"type":"boolean","title":"Is Admin","description":"是否管理员，决定前端是否显示后台入口"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"注册时间"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At","description":"上次登录时间"}},"type":"object","required":["id","email","plan","locale","is_admin","created_at"],"title":"UserOut","description":"对外暴露的用户信息。刻意不含任何鉴权材料。"},"UserStats":{"properties":{"total":{"type":"integer","title":"Total","default":0},"today_new":{"type":"integer","title":"Today New","default":0},"active_7d":{"type":"integer","title":"Active 7D","default":0},"admins":{"type":"integer","title":"Admins","default":0},"by_plan":{"items":{"$ref":"#/components/schemas/LabelCount"},"type":"array","title":"By Plan"},"trend":{"items":{"$ref":"#/components/schemas/DayCount"},"type":"array","title":"Trend"}},"type":"object","title":"UserStats"},"V1BacktestData":{"properties":{"symbol":{"type":"string","title":"Symbol"},"time_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Range"},"num_trades":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Trades"},"win_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Win Rate"},"total_pnl_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Pnl Pct"},"annualized_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Annualized Pct"},"max_drawdown_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Drawdown Pct"},"sharpe":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sharpe"},"profit_factor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Profit Factor"},"avg_hold_bars":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Hold Bars"},"buy_hold_pnl_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Buy Hold Pnl Pct"},"buy_hold_max_dd_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Buy Hold Max Dd Pct"},"excess_return_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Excess Return Pct"},"strategy":{"type":"string","title":"Strategy"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"engine_version":{"type":"string","title":"Engine Version"},"venue_mode":{"type":"string","title":"Venue Mode"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"summary":{"$ref":"#/components/schemas/SummaryMetrics"},"cost":{"$ref":"#/components/schemas/CostAssumption"},"data_range":{"$ref":"#/components/schemas/DataRangeInfo"},"data_freshness":{"$ref":"#/components/schemas/app__schemas__backtest__DataFreshness"},"notes":{"items":{"$ref":"#/components/schemas/Note"},"type":"array","title":"Notes"},"disclaimer":{"type":"string","title":"Disclaimer","default":""},"trades":{"anyOf":[{"items":{"$ref":"#/components/schemas/TradeOut"},"type":"array"},{"type":"null"}],"title":"Trades"},"klines":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Klines"},"equity_curve":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Equity Curve"}},"additionalProperties":true,"type":"object","required":["symbol","strategy","params","engine_version","venue_mode","start_date","end_date","summary","cost","data_range","data_freshness"],"title":"V1BacktestData","description":"对外回测响应体。不含账号相关字段（id / saved / share）。\n\n指标同时以两种形态给出：`summary` 嵌套（便于落库排序）与顶层平铺\n（num_trades / win_rate / total_pnl_pct …，与竞品字段名逐一对应，老脚本零改动）。"},"V1BacktestIn":{"properties":{"symbol":{"type":"string","title":"Symbol"},"strategy":{"type":"string","title":"Strategy","default":"chandelier"},"time_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Range","default":"1Y"},"start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start"},"end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"cost":{"anyOf":[{"$ref":"#/components/schemas/CostInput"},{"type":"null"}]},"initial_capital":{"anyOf":[{"type":"number","maximum":1000000000000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Initial Capital"},"execute_on":{"type":"string","enum":["next_open","close"],"title":"Execute On","default":"close"},"adjust":{"type":"string","enum":["split","split_dividend"],"title":"Adjust","description":"复权口径。split=仅拆股；split_dividend=拆股 + 现金分红（库中暂无分红数据时会提示）","default":"split"},"locale":{"anyOf":[{"type":"string","enum":["zh-CN","zh-TW","en"]},{"type":"null"}],"title":"Locale"},"save":{"type":"boolean","title":"Save","description":"是否存进账号的回测记录。API 调用默认不存，避免脚本把手动保存的记录挤掉","default":false},"include_klines":{"type":"boolean","title":"Include Klines","description":"默认返回 K 线（与竞品一致，前端与 Skill 直接可用）；只要指标时置 false","default":true},"include_trades":{"type":"boolean","title":"Include Trades","default":true},"include_equity":{"type":"boolean","title":"Include Equity","default":true}},"additionalProperties":true,"type":"object","required":["symbol"],"title":"V1BacktestIn","description":"对外回测请求。同时接受两种入参风格：\n\n    规范风格 {\"strategy\":\"chandelier\",\"symbol\":\"QQQ.US\",\"params\":{\"sma_period\":100}}\n    扁平风格 {\"symbol\":\"QQQ.US\",\"time_range\":\"1Y\",\"sma_period\":100,\"entry_mult\":2.0}\n\n扁平风格是为了让已按竞品接口写好的脚本与 AI Skill 零改动切过来。\n两者同时出现时以 params 为准 —— 显式嵌套的意图比顺带写在顶层的更明确。"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VenueCoverage":{"properties":{"venue_mode":{"type":"string","title":"Venue Mode"},"bars":{"type":"integer","title":"Bars","default":0},"symbols":{"type":"integer","title":"Symbols","default":0},"earliest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Earliest"},"latest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest"}},"type":"object","required":["venue_mode"],"title":"VenueCoverage","description":"按口径分。合并口径与单场口径的收盘价实测最大偏差 7.1%，必须分开看。"},"VerifyCodeIn":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"请求验证码时填写的邮箱，必须完全一致"},"code":{"type":"string","maxLength":6,"minLength":6,"pattern":"^\\d+$","title":"Code","description":"邮箱收到的 6 位数字验证码"}},"type":"object","required":["email","code"],"title":"VerifyCodeIn"},"VisitDayPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"pv":{"type":"integer","title":"Pv","default":0},"uv":{"type":"integer","title":"Uv","default":0},"registered":{"type":"integer","title":"Registered","default":0},"anonymous":{"type":"integer","title":"Anonymous","default":0}},"type":"object","required":["date"],"title":"VisitDayPoint"},"VisitStats":{"properties":{"pv":{"type":"integer","title":"Pv","default":0},"uv":{"type":"integer","title":"Uv","default":0},"registered_views":{"type":"integer","title":"Registered Views","default":0},"anonymous_views":{"type":"integer","title":"Anonymous Views","default":0},"trend":{"items":{"$ref":"#/components/schemas/VisitDayPoint"},"type":"array","title":"Trend"}},"type":"object","title":"VisitStats"},"VisitorItem":{"properties":{"visitor_id":{"type":"string","title":"Visitor Id"},"first_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen"},"last_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen"},"views":{"type":"integer","title":"Views","default":0},"paths":{"type":"integer","title":"Paths","default":0},"client_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Kind"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"converted":{"type":"boolean","title":"Converted","default":false},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},"type":"object","required":["visitor_id"],"title":"VisitorItem","description":"一个匿名访客的汇总行。\n\n`converted` 的判定只用一条依据：**同一个 visitor_id 后来出现在了带 user_id 的\n访问里**。刻意不做「同 IP 即同一人」的推断 —— 校园网、公司出口、运营商 NAT\n背后是成百上千个不相干的人，按 IP 归并会凭空造出一堆假的转化，\n而后台数据一旦掺假就再也没人敢信。"},"app__api__admin__data__SymbolItem":{"properties":{"symbol_id":{"type":"integer","title":"Symbol Id"},"symbol":{"type":"string","title":"Symbol"},"raw_symbol":{"type":"string","title":"Raw Symbol","default":""},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"market":{"type":"string","title":"Market","default":""},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type"},"currency":{"type":"string","title":"Currency","default":""},"status":{"type":"string","title":"Status","default":""},"is_popular":{"type":"boolean","title":"Is Popular","default":false},"listed_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listed On"},"delisted_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delisted On"},"bars":{"type":"integer","title":"Bars","default":0},"first_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Date"},"last_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Date"}},"type":"object","required":["symbol_id","symbol"],"title":"SymbolItem"},"app__schemas__backtest__DataFreshness":{"properties":{"distribution_mode":{"type":"string","title":"Distribution Mode"},"as_of":{"type":"string","format":"date","title":"As Of"},"delayed":{"type":"boolean","title":"Delayed"},"venue_mode":{"type":"string","title":"Venue Mode"},"label":{"type":"string","title":"Label","default":""}},"type":"object","required":["distribution_mode","as_of","delayed","venue_mode"],"title":"DataFreshness","description":"数据时效。分发姿态是配置开关，授权结论变化时只改配置不改代码。"},"app__schemas__market__SymbolItem":{"properties":{"symbol":{"type":"string","title":"Symbol","description":"统一格式代码，如 QQQ.US"},"raw_symbol":{"type":"string","title":"Raw Symbol","description":"数据源原始代码，如 QQQ"},"market":{"type":"string","title":"Market","description":"市场：US / HK / CN"},"exchange":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exchange","description":"交易所：US / HK / SH / SZ。CN 市场下沪深两所据此区分，其余市场与 market 同名"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type"},"primary_venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Venue"},"currency":{"type":"string","title":"Currency","default":"USD"},"listed_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Listed On"},"delisted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delisted On"},"is_delisted":{"type":"boolean","title":"Is Delisted","default":false},"is_popular":{"type":"boolean","title":"Is Popular","default":false}},"type":"object","required":["symbol","raw_symbol","market"],"title":"SymbolItem"},"app__schemas__screener__DataFreshness":{"properties":{"generated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Generated At"},"age_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Age Hours"},"max_stale_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Stale Hours"},"stale":{"type":"boolean","title":"Stale","default":false},"source":{"type":"string","title":"Source","default":"parquet"}},"type":"object","title":"DataFreshness","description":"分析数据的时效。选股跑在 Parquet 快照上，用户有权知道它是什么时候导出的。"}},"securitySchemes":{"Bearer":{"type":"http","description":"控制台传 access token；行情 API 传以 nq_ 开头的 API Key。","scheme":"bearer"},"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"开发者 API Key，在「账户 - API Key」页面创建。"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"邮箱验证码登录后获得的 access token。"}}},"tags":[{"name":"认证","description":"邮箱验证码免密登录。平台不设密码，也不接入第三方 OAuth。"},{"name":"账户","description":"个人资料、API Key 管理、套餐与用量。"},{"name":"回测","description":"Web 端回测。与 /v1/backtest 共用同一套引擎，结果逐位一致。"},{"name":"行情数据 API","description":"报价、日线、分时、静态信息与批量查询。"},{"name":"标的 API","description":"标的搜索与列表，含已退市标的。"},{"name":"回测 API","description":"面向开发者的回测接口，需 API Key。"},{"name":"系统","description":"健康检查与服务元信息。"},{"name":"选股器","description":"全市场条件选股。跑在每日导出的 Parquet 快照上（DuckDB 只读旁路），不占主库；数据未就绪时明确报错，不降级到主库慢查。"},{"name":"管理后台","description":"内部运营接口，仅 is_admin 用户可用。"}]}