From e4a47e170261baaf3a5fc4172fbe826ea840d8da Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:14:35 +0800 Subject: [PATCH 01/18] docs: design zero-intrusion position ingestion --- ...26-07-20-v0-2-position-ingestion-design.md | 477 ++++++++++++++++++ 1 file changed, 477 insertions(+) create mode 100644 docs/superpowers/specs/2026-07-20-v0-2-position-ingestion-design.md diff --git a/docs/superpowers/specs/2026-07-20-v0-2-position-ingestion-design.md b/docs/superpowers/specs/2026-07-20-v0-2-position-ingestion-design.md new file mode 100644 index 0000000..d315a23 --- /dev/null +++ b/docs/superpowers/specs/2026-07-20-v0-2-position-ingestion-design.md @@ -0,0 +1,477 @@ +# QuantCockpit v0.2 零侵入仓位接入与敞口分析设计 + +## 目标 + +让用户在不修改实盘或模拟盘策略代码的前提下,把已有 CSV、JSON、JSONL 日志或账户报表映射成可追溯的仓位快照,并在数据能力允许时计算 gross、net、Top-N 和 HHI 集中度。 + +v0.2 的产品重点不是增加更多风险公式,而是建立一个可扩展、低门槛、不会伪造精度的接入层。任何分析结果都必须能追溯到原始文件、映射配置和规范化事件。 + +这里的“零侵入”只表示不修改策略代码、不嵌入 SDK、不提供券商凭据;它不等于零配置。一个全新来源首次接入仍需创建映射配置,但配置可以预览、复用、版本化并由未来的 AI 助手生成候选稿。 + +## 行业现状与设计判断 + +现有标准分布在不同层级,没有一个标准同时覆盖通用日志、策略身份、订单成交、账户仓位和风险分析: + +- OpenTelemetry 定义通用日志记录、时间、资源、正文和属性,并提供文件采集能力,但不定义金融仓位语义。 +- FIX/FIXML 包含订单、成交和 PositionReport 等消息,但主要面向交易对手、券商、清算和 OMS 之间的消息交换,机构内部落地仍存在差异。 +- FINOS Common Domain Model 覆盖金融产品和交易生命周期,适合机构互操作,但作为 QuantCockpit 的最小接入契约过重。 +- 券商和平台通常提供自己的 API、CSV、XML 或报告服务,例如 IBKR Flex;这些出口允许零侵入接入,但需要来源适配器。 + +因此,QuantCockpit 不采用 FIX 或 CDM 作为内部存储模型,也不要求用户实现 SDK。系统采用“稳定的最小内部模型 + 外部声明式适配器”。标准只作为字段语义、标识体系和未来适配器的参考。 + +## 方案取舍 + +评估过三条接入路径: + +1. 要求用户在策略中发送统一事件或安装 SDK。它最适合实时、强语义数据,但直接违反“不改现有策略”的核心约束。 +2. QuantCockpit 直接连接每家券商和交易平台。它能减少部分用户配置,却引入凭据托管、限流、接口变更和大量来源维护,不适合作为 v0.2 的开源切口。 +3. 对用户已有文件做声明式映射。它需要一次字段配置,也无法制造源文件里没有的信息,但能覆盖最多现有系统,并把接入差异隔离在分析内核之外。 + +v0.2 选择第三条;后续券商适配器只是生成同一映射或同一规范事件的便捷入口,不形成第二套分析逻辑。 + +参考资料: + +- [OpenTelemetry Logs Data Model](https://opentelemetry.io/docs/specs/otel/logs/data-model/) +- [OpenTelemetry File Log Receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/filelogreceiver) +- [FIX Trading Community machine-readable repository](https://github.com/FIXTradingCommunity/fix-repository) +- [FINOS Common Domain Model](https://cdm.finos.org/docs/cdm-overview) +- [IBKR Flex Web Service](https://www.interactivebrokers.com/campus/ibkr-api-page/flex-web-service/) + +## 范围 + +### v0.2 包含 + +- CSV、JSON 和 JSONL 的离线只读导入。 +- 两类输入布局:一份文档包含完整仓位数组;多行表格共同组成一个或多个快照。 +- 版本化 JSON 映射配置,支持字段路径、固定值和有限的确定性转换。 +- 导入前预览,包括源字段、规范化结果、缺失能力、拒绝原因和不会上传数据的声明。 +- `position_snapshot` 规范事件及其幂等、修订和隔离语义。 +- 原始记录、映射配置摘要、规范化事件和派生证据的追踪链。 +- 最新仓位快照、数据覆盖率、gross、net、Top-1、Top-5、HHI 和分类敞口。 +- API、前端观察台、Markdown 报告和合成演示数据的完整闭环。 +- 面向未来 AI 映射助手的稳定输入输出契约。 + +### v0.2 不包含 + +- 从成交记录重建权威仓位。 +- 连接券商、保存券商凭据或主动轮询远程账户。 +- 完整 FIX、FIXML、CDM、FpML 或 ISO 20022 实现。 +- 自动价格、汇率、公司行动、期货换月或期权到期处理。 +- VaR、Greeks、压力测试、因子 Beta 或组合优化。 +- 在导入和分析运行路径中调用大模型。 +- 修改、注入或重新部署用户的交易策略。 + +## 总体架构 + +```text +已有 CSV / JSON / JSONL / 报表 + │ + ▼ + Source Reader(只读) + │ 原始记录 + 来源坐标 + ▼ + Mapping Profile(版本化 JSON) + │ 有限转换、无任意代码 + ▼ + Preview + Capability + │ 用户显式执行导入 + ▼ + position_snapshot 事件契约 + │ 幂等、修订、隔离、current + ▼ + Exposure Analysis + ├── FastAPI + ├── React 观察台 + └── Markdown 报告 +``` + +接入层和分析层严格分离。接入层只回答“这份现有数据能否确定性映射成什么”;分析层只回答“在现有字段覆盖下,哪些指标可以计算”。 + +## 输入布局 + +### 文档快照 + +单个 JSON 或单条 JSONL 记录包含快照元数据和完整 `positions` 数组。每条记录天然具有原子边界,适合已经保存账户快照的系统。 + +### 表格快照 + +CSV 或扁平 JSON 行每行表示一个持仓。映射配置必须声明快照分组字段: + +- `strategy_id` +- `environment` +- `source` +- `portfolio_id` +- `snapshot_time` + +同一组的所有行组成一个原子仓位快照。缺少 `snapshot_time` 时,只允许通过显式配置把“整个文件”声明为一个快照;系统不得自行猜测时间。 + +JSONL 尾部不完整、CSV 行列错位、组内基础币种冲突或组内重复标的均进入隔离或预览错误,不产生部分仓位快照。 + +## 映射配置 + +映射配置使用 JSON,不引入可执行模板语言。配置本身经过严格 Pydantic 校验,并计算稳定摘要写入导入证据。 + +```json +{ + "profile_version": "1.0", + "name": "example-position-csv", + "format": "csv", + "layout": "tabular_snapshot", + "snapshot_scope": "grouped_rows", + "fields": { + "strategy_id": {"literal": "trend-following"}, + "environment": {"literal": "paper"}, + "source": {"literal": "daily-position-export"}, + "portfolio_id": {"path": "account_alias", "transforms": ["trim"]}, + "snapshot_time": {"path": "as_of", "transforms": ["trim", "utc_timestamp"]}, + "base_currency": {"path": "base_currency", "transforms": ["trim", "uppercase"]} + }, + "position_fields": { + "instrument_id": {"path": "symbol", "transforms": ["trim"]}, + "instrument_id_type": {"literal": "ticker"}, + "quantity": {"path": "quantity", "transforms": ["decimal"]}, + "market_value_base": {"path": "market_value_base", "transforms": ["decimal"]}, + "asset_class": {"path": "asset_class", "transforms": ["trim", "lowercase"]}, + "sector": {"path": "sector", "transforms": ["trim"]} + } +} +``` + +字段绑定只允许以下二选一: + +- `literal`:可信的固定配置值。 +- `path`:CSV 的精确列名,或 JSON/JSONL 的 RFC 6901 JSON Pointer。两类语法不混用,避免包含点号或斜杠的字段名产生歧义。 + +v0.2 只支持 `trim`、`uppercase`、`lowercase`、`decimal` 和 `utc_timestamp`。转换顺序固定执行;不支持 Python、JavaScript、正则替换、算术表达式或网络请求。复杂转换由后续来源适配器承担。 + +`utc_timestamp` 默认只接受带明确时区偏移的 RFC 3339 时间。若源文件使用本地时间,字段绑定必须同时提供 `timestamp_format` 和 IANA `assume_timezone`,例如 `Asia/Shanghai`;只提供其中一项即视为配置错误。夏令时导致的不存在时间或歧义时间必须拒绝,不能静默猜测。`snapshot_time` 必须来自映射字段或可信固定值,禁止使用文件修改时间推断。 + +映射配置的身份是 RFC 8785 JSON Canonicalization Scheme 结果的 SHA-256。证据引用固定为 `mapping:sha256:`;语义相同但字节排版不同的配置应得到相同指纹。 + +## 规范事件 + +事件契约升级到 `schema_version = "1.1"`,继续接受现有 `1.0` 事件。`position_snapshot` 只允许出现在 `1.1`。 + +```json +{ + "schema_version": "1.1", + "strategy_id": "trend-following", + "environment": "paper", + "event_type": "position_snapshot", + "event_time": "2026-07-20T16:00:00Z", + "recorded_at": "2026-07-20T16:02:00Z", + "source": "daily-position-export", + "payload": { + "event_type": "position_snapshot", + "portfolio_id": "paper-book-a", + "base_currency": "USD", + "mapping_profile_hash": "sha256:...", + "positions": [ + { + "instrument_id": "AAPL", + "instrument_id_type": "ticker", + "venue": "XNAS", + "quantity": "100", + "market_value_base": "22000", + "asset_class": "equity", + "sector": "Technology" + } + ] + } +} +``` + +### 快照身份 + +仓位快照的自然身份是: + +```text +strategy_id + environment + source + portfolio_id + event_type + event_time + schema_version +``` + +这避免同一策略、来源和时点下的不同账户或 book 相互覆盖。其他事件继续使用 v0.1 的自然身份,不发生历史键变化。 + +### Portfolio ID + +`portfolio_id` 是用户提供的稳定别名,可以代表账户、book、子组合或策略 sleeve。它必须满足与 `strategy_id` 相同的安全字符约束,不要求是真实券商账号。文档和示例要求使用别名或不可逆脱敏值,公开 API 不应暴露真实账户号码。 + +`recorded_at` 可由映射显式提供;没有提供时,导入器使用开始读取该文件时记录的 UTC 时间,并在证据元数据中标记 `recorded_at_source = import_observed_at`。它不能从文件修改时间或 `snapshot_time` 猜测。 + +规范事件的 `event_time` 固定等于映射后的 `snapshot_time`。两者不是两个可独立配置的时间,避免幂等身份和实际快照时点分叉。 + +## Position 字段 + +每个 position 必须提供 `instrument_id`,并至少提供以下度量字段之一: + +- `quantity` +- `weight` +- `market_value_base` +- `exposure_value_base` + +`positions = []` 是合法且有业务含义的权威空仓快照。它与“文件没有读到记录”不同:只有文档快照显式给出空数组,或表格映射以固定身份和 `snapshot_scope = whole_file` 明确声明空文件时才成立。 + +字段语义: + +- `quantity`:带符号数量;空头为负。 +- `weight`:用户系统给出的带符号组合权重,不强制总和为 1,但分析会报告总和。 +- `market_value_base`:按快照基础币种表示的带符号市场价值。 +- `exposure_value_base`:用户上游已经计算的带符号风险敞口;适合期货、期权或其他市场价值不能代表风险规模的工具。 +- `side`:可选的 `long` 或 `short`,用于兼容“数量恒为正、方向另列”的来源。 +- `instrument_id_type`:自由但受长度限制的标识类型,例如 `ticker`、`isin`、`figi`、`contract` 或 `custom`。 +- `venue`:可选交易场所,优先使用 MIC;同名 ticker 跨市场时必须提供。 +- `asset_class`、`sector`、`country`:可选分类字段;缺少时只影响相应分类分析。 + +规范化后所有度量字段都必须带符号。提供 `side = short` 时,正值统一转为负,负值保持不变;提供 `side = long` 时,负值属于冲突。未提供 `side` 时保留源符号。完成这一步后,同一 position 的所有非零度量必须方向一致,否则整条 position 拒绝为 `conflicting_position_side`。零值不参与 long/short 计数,但可保留在快照中。 + +所有度量规范化为不使用指数表示法的十进制定点字符串,计算使用十进制定点数,不能经二进制浮点数中转。v0.2 输入硬上限为 30 位有效数字、18 位小数;拒绝 `NaN`、正负无穷和越界值。派生计算使用 38 位十进制精度和 `ROUND_HALF_EVEN`,对外最多保留 18 位小数并去除无意义末尾零。 + +存在 `market_value_base` 或 `exposure_value_base` 时,快照必须提供 3–12 位大写字母或数字组成的 `base_currency`。法币推荐 ISO 4217,数字资产允许 `BTC`、`USDT` 等行业代码。quantity-only 或 weight-only 快照可以省略。v0.2 不做 FX 换算,也不把不同币种的原始市值相加。 + +同一快照内 `(instrument_id_type, instrument_id, venue)` 不得重复,缺失 `venue` 视为空字符串参与比较。适配器必须在规范化前合并或拒绝重复行;v0.2 默认拒绝,避免系统静默决定净额规则。 + +## 能力分级与分析口径 + +系统不把缺字段当成整个来源不可用,而是生成能力报告: + +“活跃 position”定义为任一已提供度量不为零的 position。能力完整性、覆盖率和敞口指标只以活跃 position 为分母;`position_count` 仍报告全部记录数,并单独返回 `zero_position_count`。对每种候选基础分别计算: + +```text +coverage_by_basis[basis] = 拥有该字段的活跃 position 数 / 活跃 position 总数 +``` + +没有活跃 position 时返回 `state = empty_portfolio`、`gross = 0`、`net = 0`,`basis`、各覆盖率、Top-N 和 HHI 为 `null`。这表示来源明确报告空仓,而不是缺数据。 + +### Level 0:身份可见 + +每个 position 都有标的和至少一个允许的度量,但整个快照没有共同且完整的分析基础。展示仓位数量、方向、各候选基础覆盖率和缺失项,不计算价值集中度。 + +### Level 1:权重分析 + +所有非零仓位都有 `weight`。计算: + +```text +gross = Σ |weightᵢ| +net = Σ weightᵢ +absolute_shareᵢ = |weightᵢ| / gross +HHI = Σ absolute_shareᵢ² +``` + +### Level 2:基础币种价值分析 + +所有非零仓位都有 `market_value_base`。使用同一公式,把 `weightᵢ` 替换为 `market_value_baseᵢ`。结果标记 `basis = market_value_base`。 + +### Level 3:风险敞口分析 + +所有非零仓位都有 `exposure_value_base`。使用相同公式,结果标记 `basis = exposure_value_base`。若同时存在多个完整基础,优先级是: + +```text +exposure_value_base > market_value_base > weight +``` + +系统不得混合不同基础补齐同一个快照。例如一半仓位用 `market_value_base`、另一半用 `weight` 时,集中度不可计算,并返回缺失字段和覆盖率。 + +### 输出指标 + +- `position_count` +- `zero_position_count` +- `long_count` / `short_count` +- `gross` +- `net` +- `top_1_share` +- `top_5_share` +- `hhi` +- `basis` +- `coverage_ratio` +- `coverage_by_basis` +- 按 `asset_class`、`sector`、`country` 的 gross 和 net 分组 +- 参与计算的 `event:` 和 `mapping:` 证据引用 + +有完整基础时,`coverage_ratio = 1`。无完整基础时,`basis` 和不可计算的数值字段返回 `null`,`coverage_ratio` 返回现有覆盖率最高的候选基础覆盖率;并返回该 `candidate_basis`、`coverage_by_basis` 和结构化 `reason`,不能用零代替。覆盖率相同时仍按 `exposure_value_base > market_value_base > weight` 选择候选基础。 + +Top-N 按所选基础的绝对值降序计算。当完整基础存在但 `gross = 0` 时,`gross` 和 `net` 返回真实的 0;`top_1_share`、`top_5_share` 和 `hhi` 返回 `null`,原因是 `zero_gross_exposure`,避免除以零。少于五个非零仓位时,Top-5 汇总全部非零仓位。 + +分类敞口使用同一个所选基础。缺少 `asset_class`、`sector` 或 `country` 的仓位进入该维度的 `unclassified` 桶,并同时返回分类字段覆盖率;不能从标的名称猜测分类。 + +## 预览与导入流程 + +```bash +uv run scripts/import_positions.py \ + --input ./positions.csv \ + --profile ./position-profile.json \ + --preview +``` + +预览不写数据库,输出: + +- 检测到的格式、行数和快照组数。 +- 源字段名,不默认打印完整敏感行。 +- 最多 5 条脱敏规范化 position。 +- 每个快照的能力等级和覆盖率。 +- 错误代码、行号和安全摘要。 +- 映射配置 SHA-256。 + +移除 `--preview` 后才执行导入。导入继续使用现有幂等、修订、隔离和批次留痕机制。 + +## AI 映射助手边界 + +v0.2 建立 AI 映射助手可以消费和产生的文件契约,但不绑定模型供应商,也不在导入路径调用大模型。 + +助手输入应是: + +- 文件格式和列名。 +- 用户选择的身份固定值。 +- 最多 20 行经过本地脱敏的样本。 +- 映射 JSON Schema。 + +助手输出只能是候选映射 JSON、字段置信度和缺失能力说明。候选配置仍必须经过严格校验和 `--preview`。大模型输出不能直接写数据库、执行表达式或决定风险数值。 + +后续可以提供可插拔命令调用 OpenAI、本地模型或用户自己的模型;确定性导入器和映射格式不因此改变。 + +## 存储与追踪 + +继续复用通用 `events` 表,不为每种来源创建独立仓位表。规范化 `position_snapshot` 保存在 `normalized_json`,原始输入保存在现有原始证据字段中。 + +表格快照可能包含多行原始数据,存储层需要把快照的原始行集合规范化为一个受大小限制的 JSON 数组,并保留: + +- 源文件安全引用。 +- 起止行号。 +- 映射配置摘要。 +- 导入批次 ID。 + +API 只返回文件名、行号范围和摘要,不返回绝对路径、原始账户号或原始行。 + +v0.2 的确定性资源上限是:单个源文件 100 MiB、单条物理记录 1 MiB、单个规范化快照 100,000 个 position。超过上限必须在写库前拒绝并返回结构化错误;不能截断后继续导入。CSV/JSONL 必须流式读取,JSON 文档在解析前先检查文件上限。 + +## API + +新增两个只读端点: + +```text +GET /api/v1/portfolios +GET /api/v1/portfolios/{portfolio_id}/exposure?strategy_id={id}&environment={env}&source={source} +``` + +`/portfolios` 返回严格身份、最新快照时间、快照年龄、position 数量、能力等级和缺失字段。v0.2 不擅自定义“健康/不健康”阈值。详情端点返回最新 current 快照的指标、分类敞口、缺失原因和证据引用。 + +查询身份必须包含 `portfolio_id + strategy_id + environment + source`,不得跨账户、来源或实盘/模拟盘合并。 + +OpenAPI 继续是前端类型的唯一来源;生成文件漂移由 CI 阻止。 + +## 前端 + +观察台增加两个区块: + +1. `仓位覆盖`:每个 portfolio 的最新快照、时效、仓位数、能力等级和缺失字段。 +2. `集中度与敞口`:gross、net、Top-1、Top-5、HHI 及分类分布。 + +无法计算时明确显示原因,例如“3/12 个仓位缺少基础币种市场价值”,而不是展示 0。DEMO 水印和离线、空、部分失败语义保持不变。 + +v0.2 不增加图表库。分类敞口使用现有视觉系统中的条形比例、数值和证据文本,控制依赖和作品集噪声。 + +## 报告 + +Markdown 报告增加: + +- 最新 portfolio 快照摘要。 +- 指标基础和覆盖率。 +- gross、net、Top-N、HHI。 +- 分类敞口。 +- 不可计算原因。 +- 事件和映射证据引用。 + +API、前端和报告必须调用同一个 `CockpitService` 分析结果,不能分别实现公式。 + +## 错误与故障语义 + +| 场景 | 语义 | +| --- | --- | +| 不支持的文件格式 | 预览失败,`unsupported_input_format` | +| 映射字段不存在 | 对应行或快照拒绝,`mapping_path_missing` | +| 数字或时间转换失败 | 对应行拒绝,保留安全摘要 | +| 本地时间缺时区或遇到 DST 歧义 | 对应行拒绝,`ambiguous_source_time` | +| 快照组身份冲突 | 整组拒绝,不写部分快照 | +| 重复标的 | 整组拒绝,`duplicate_instrument` | +| side 与度量符号冲突 | 对应 position 拒绝,整组不写入 | +| 多币种但无基础币种价值 | 保留快照,价值分析不可计算 | +| 部分仓位缺少分析基础 | 保留快照,返回覆盖率和 `incomplete_basis` | +| 同键同内容重放 | duplicate,不新增事件 | +| 同键更新且 recorded_at 更晚 | revision,分析读取 current | +| 文件读取中断 | 导入批次失败,不产生半个快照 | +| 超过文件、记录或仓位上限 | 写库前拒绝,`ingestion_limit_exceeded` | + +## 安全与隐私 + +- 所有输入都视为不可信数据。 +- 映射配置不能执行任意代码、Shell、模板或网络请求。 +- 预览默认只显示字段名和脱敏后的少量规范化结果。 +- `portfolio_id` 使用别名;API 不需要真实账户号。 +- 大模型助手只接收用户明确提供的本地脱敏样本。 +- 原始行、绝对路径和验证错误输入不得通过 API 或截图泄漏。 +- 单文件和单快照设置大小、行数和 position 数量上限,避免内存耗尽。 + +## 测试策略 + +### 契约测试 + +- 1.0 旧事件继续通过。 +- 1.0 `position_snapshot` 被拒绝。 +- 1.1 仓位快照接受至少一种度量字段,拒绝未知字段、重复标的和无度量 position。 +- portfolio 身份参与幂等键;不同 portfolio 不碰撞。 + +### 映射测试 + +- CSV、JSON 文档和 JSONL 文档成功映射。 +- 固定值、JSON Pointer 和每种转换有正反例。 +- 缺列、坏数字、坏时间、组内身份冲突、重复标的和半写尾行失败。 +- JSON Pointer 转义、时区偏移、本地时区、DST 歧义和映射 RFC 8785 指纹均有固定夹具。 +- side 正值空头归一化、符号冲突、数字精度上限和币种代码均有边界测试。 +- 预览不创建或修改数据库,不打印原始账户号和绝对路径。 + +### 分析测试 + +- quantity-only 返回 Level 0 和不可计算原因。 +- 显式空仓与空文件误读严格区分,空仓返回真实的 gross/net 0。 +- weight、market value 和 exposure 三种完整基础分别计算正确。 +- 基础优先级稳定,不混合基础。 +- long/short、gross/net、Top-N、HHI、分类敞口和零 gross 边界正确。 +- 部分覆盖返回 `null + incomplete_basis`,不返回伪零。 + +### API、前端和报告测试 + +- 严格四元身份不会跨 portfolio、source 或 environment 合并。 +- 空、ready、partial、offline 和不可计算状态均可见。 +- 生成的 OpenAPI 和前端类型保持同步。 +- 报告与 API 使用同一评估时点和公式。 + +### 端到端测试 + +- 从合成 CSV 和映射配置预览、导入、API 查询、页面展示到报告生成完整跑通。 +- 浏览器在 900、1024、1280 和 1440px 下无横向溢出或控制台错误。 + +## 实施分期 + +### v0.2.0 + +- 1.1 `position_snapshot` 契约。 +- JSON 映射配置和 CSV/JSON/JSONL 读取。 +- 预览、导入、能力分级和集中度分析。 +- API、前端、报告、文档和合成演示。 + +### v0.2.1 + +- 基于公开合成夹具实现首批来源适配器,候选为 IBKR Flex、MT5 报告和 CCXT/交易所持仓导出。 +- 根据真实公开样本校正字段同义词,不在 v0.2.0 中凭印象硬编码。 + +### v0.2.2 + +- 可插拔 AI 映射助手。 +- 映射配置模板库和社区贡献规范。 +- OpenTelemetry Collector 对接示例,但不要求用户采用 OpenTelemetry。 + +## 成功标准 + +- 用户只准备一个现有数据文件和一个映射 JSON,就能在 10 分钟内看到仓位覆盖和集中度结果。 +- 不修改策略源代码,不需要券商凭据,不上传输入数据。 +- 所有数值结论都能回溯到 event 和 mapping 摘要。 +- 缺字段不会产生虚假数值;用户可以明确看到还缺什么。 +- 新来源优先通过新增映射配置接入,不修改分析内核。 From ab096f6acf710cc5c7262d38ffc21f99cbcef942 Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:31:22 +0800 Subject: [PATCH 02/18] docs: plan v0.2 position ingestion --- .../2026-07-20-v0-2-position-ingestion.md | 737 ++++++++++++++++++ 1 file changed, 737 insertions(+) create mode 100644 docs/superpowers/plans/2026-07-20-v0-2-position-ingestion.md diff --git a/docs/superpowers/plans/2026-07-20-v0-2-position-ingestion.md b/docs/superpowers/plans/2026-07-20-v0-2-position-ingestion.md new file mode 100644 index 0000000..8ca8c84 --- /dev/null +++ b/docs/superpowers/plans/2026-07-20-v0-2-position-ingestion.md @@ -0,0 +1,737 @@ +# QuantCockpit v0.2 仓位接入实施计划 + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** 让用户把已有 CSV、JSON、JSONL 仓位文件确定性地预览、导入并转化为可追溯的仓位覆盖与集中度结果。 + +**Architecture:** 保留 FastAPI + Python 领域内核,新增声明式映射层和 `position_snapshot` 事件,不把来源差异带入分析层。DuckDB 继续保存版本化事件;`CockpitService` 是 API、前端和 Markdown 报告共享的唯一分析入口。 + +**Tech Stack:** Python 3.13、Pydantic 2、DuckDB、FastAPI、RFC 8785、pytest、uv、React、TypeScript、Vite、Vitest、Bun。 + +## Global Constraints + +- 不修改或注入用户策略,不接收券商凭据,不从远程拉取账户数据。 +- `schema_version = "1.0"` 的现有事件必须保持兼容;`position_snapshot` 只允许 `1.1`。 +- 单文件上限 100 MiB、单条物理记录上限 1 MiB、单快照上限 100,000 个 position;超限不得截断导入。 +- 数字输入最多 30 位有效数字和 18 位小数;派生计算精度 38 位并使用 `ROUND_HALF_EVEN`。 +- 时间默认要求 RFC 3339 明确偏移;本地时间必须同时配置格式和 IANA 时区,DST 歧义或不存在时间拒绝。 +- 映射不能执行代码、模板、Shell 或网络请求;映射证据使用 RFC 8785 规范化结果的 SHA-256。 +- API 不返回绝对路径、原始记录或真实账号;空值、不可计算和真实零必须有不同语义。 +- 所有 Python 命令使用 uv,所有 Node.js 命令使用 Bun。 + +--- + +## 文件结构 + +- `src/quantcockpit/models.py`:事件 1.0/1.1 契约和仓位规范模型。 +- `src/quantcockpit/ingestion/position_profile.py`:映射配置、RFC 8785 指纹和有限转换。 +- `src/quantcockpit/ingestion/position_sources.py`:CSV、JSON、JSONL 的受限流式读取和来源坐标。 +- `src/quantcockpit/ingestion/positions.py`:预览、分组、规范化、整组错误和导入编排。 +- `src/quantcockpit/analysis/exposure.py`:Decimal 仓位覆盖、gross/net、Top-N、HHI 和分类计算。 +- `src/quantcockpit/store_types.py`、`src/quantcockpit/store.py`:仓位 current 查询和行范围证据。 +- `src/quantcockpit/service.py`:portfolio 身份、快照时效和敞口查询。 +- `src/quantcockpit/api_models.py`、`src/quantcockpit/api.py`:只读 portfolio API。 +- `scripts/import_positions.py`:预览优先的仓位导入 CLI。 +- `src/quantcockpit/report.py`:共享服务结果的 Markdown 仓位章节。 +- `examples/positions/`:完全合成的仓位文件和映射配置。 +- `frontend/src/types.ts`、`frontend/src/Dashboard.tsx`、`frontend/src/styles.css`:仓位覆盖与敞口界面。 +- `README.md`、`docs/architecture.md`、`CONTRIBUTING.md`:接入教程、边界与映射贡献规范。 + +### Task 1: 事件 1.1 与仓位契约 + +**Files:** +- Modify: `src/quantcockpit/models.py` +- Modify: `tests/test_models.py` + +**Interfaces:** +- Produces: `Position`, `PositionSnapshotPayload`, `EventRecord`; `EventRecord.idempotency_key` 对仓位额外包含 `portfolio_id`。 +- Consumes: 现有 `EventRecord` 1.0 行为和 Pydantic 严格校验风格。 + +- [ ] **Step 1: 写 1.0 兼容、1.1 仓位、空仓和 portfolio 隔离失败测试** + +```python +def position_event(**payload_overrides: object) -> dict[str, object]: + payload = { + "event_type": "position_snapshot", + "portfolio_id": "paper-book-a", + "base_currency": "USD", + "mapping_profile_hash": f"sha256:{'a' * 64}", + "positions": [{"instrument_id": "AAPL", "instrument_id_type": "ticker", "weight": "0.25"}], + } + payload.update(payload_overrides) + return event_data(schema_version="1.1", event_type="position_snapshot", payload=payload) + + +def test_position_snapshot_requires_schema_1_1_and_keeps_1_0_compatible() -> None: + assert EventRecord.model_validate(event_data()).schema_version == "1.0" + assert EventRecord.model_validate(position_event()).payload.event_type == "position_snapshot" + with pytest.raises(ValidationError): + EventRecord.model_validate(position_event() | {"schema_version": "1.0"}) + + +def test_position_snapshot_accepts_authoritative_empty_portfolio() -> None: + event = EventRecord.model_validate(position_event(positions=[])) + assert event.payload.positions == () + + +def test_portfolio_id_participates_only_in_position_idempotency_key() -> None: + left = EventRecord.model_validate(position_event(portfolio_id="book-a")) + right = EventRecord.model_validate(position_event(portfolio_id="book-b")) + assert left.idempotency_key != right.idempotency_key +``` + +- [ ] **Step 2: 运行测试并确认因 1.1 和仓位模型不存在而失败** + +Run: `uv run pytest tests/test_models.py -q` + +Expected: FAIL,错误指向 `schema_version`、`position_snapshot` 或未定义仓位载荷。 + +- [ ] **Step 3: 实现严格仓位模型与自然键** + +```python +SchemaVersion = Literal["1.0", "1.1"] +EventType = Literal["heartbeat", "run_status", "nav", "return", "position_snapshot"] + +class Position(EventPayloadBase): + instrument_id: Annotated[str, StringConstraints(strip_whitespace=True, min_length=1, max_length=256)] + instrument_id_type: Annotated[str, StringConstraints(strip_whitespace=True, min_length=1, max_length=32)] = "custom" + venue: Annotated[str, StringConstraints(strip_whitespace=True, min_length=1, max_length=32)] | None = None + side: Literal["long", "short"] | None = None + quantity: Decimal | None = None + weight: Decimal | None = None + market_value_base: Decimal | None = None + exposure_value_base: Decimal | None = None + asset_class: str | None = None + sector: str | None = None + country: str | None = None + +class PositionSnapshotPayload(EventPayloadBase): + event_type: Literal["position_snapshot"] + portfolio_id: StrategyId + base_currency: Annotated[str, StringConstraints(pattern=r"^[A-Z0-9]{3,12}$")] | None = None + mapping_profile_hash: Annotated[str, StringConstraints(pattern=r"^sha256:[0-9a-f]{64}$")] + positions: tuple[Position, ...] +``` + +在 model validator 中完成四项规则:每个 position 至少一个度量、拒绝 float/NaN/Infinity/超精度、非零度量方向一致、同一快照 `(instrument_id_type, instrument_id, venue or "")` 唯一;存在基础币种价值时要求 `base_currency`。`event_type = position_snapshot` 且 schema 不是 1.1 时拒绝。序列化继续使用 Decimal 字符串。 + +- [ ] **Step 4: 运行模型测试和类型检查** + +Run: `uv run pytest tests/test_models.py -q && uv run ty check src/quantcockpit/models.py` + +Expected: PASS,且现有 1.0 测试不变。 + +- [ ] **Step 5: 提交契约** + +```bash +git add src/quantcockpit/models.py tests/test_models.py +git commit -m "feat: add position snapshot event contract" +``` + +### Task 2: 声明式映射配置与确定性转换 + +**Files:** +- Create: `src/quantcockpit/ingestion/position_profile.py` +- Create: `tests/test_position_profile.py` +- Modify: `pyproject.toml` +- Modify: `uv.lock` + +**Interfaces:** +- Produces: `FieldBinding`, `PositionMappingProfile`, `profile_hash(profile) -> str`, `resolve_binding(binding, record, *, format) -> object`。 +- Consumes: `rfc8785.dumps()`、`Decimal`、`zoneinfo.ZoneInfo`。 + +- [ ] **Step 1: 用 uv 添加 RFC 8785 依赖** + +Run: `uv add rfc8785` + +Expected: `pyproject.toml` 和 `uv.lock` 只新增 RFC 8785 直接/传递依赖。 + +- [ ] **Step 2: 写映射、指纹、JSON Pointer、Decimal 和时间失败测试** + +```python +def test_profile_hash_ignores_json_key_order() -> None: + left = PositionMappingProfile.model_validate(PROFILE) + right = PositionMappingProfile.model_validate(dict(reversed(list(PROFILE.items())))) + assert profile_hash(left) == profile_hash(right) + assert profile_hash(left).startswith("sha256:") + + +def test_local_timestamp_requires_format_and_timezone_together() -> None: + with pytest.raises(ValidationError): + FieldBinding(path="as_of", transforms=("utc_timestamp",), timestamp_format="%Y-%m-%d %H:%M:%S") + + +def test_json_pointer_uses_rfc_6901_escaping() -> None: + binding = FieldBinding(path="/account~1meta/book~0name", transforms=("trim",)) + assert resolve_binding(binding, {"account/meta": {"book~name": " alpha "}}, format="json") == "alpha" +``` + +参数化覆盖每个允许转换、缺失路径、禁止未知转换、只允许 literal/path 二选一、RFC 3339 非 UTC 偏移归一化、DST 歧义、本地不存在时间、30 位有效数字和 18 位小数边界。 + +- [ ] **Step 3: 运行测试并确认映射模块不存在** + +Run: `uv run pytest tests/test_position_profile.py -q` + +Expected: FAIL with `ModuleNotFoundError: quantcockpit.ingestion.position_profile`。 + +- [ ] **Step 4: 实现映射模型和纯函数转换器** + +```python +Transform = Literal["trim", "uppercase", "lowercase", "decimal", "utc_timestamp"] +InputFormat = Literal["csv", "json", "jsonl"] +Layout = Literal["document_snapshot", "tabular_snapshot"] +SnapshotScope = Literal["grouped_rows", "whole_file"] + +class FieldBinding(BaseModel): + model_config = ConfigDict(extra="forbid", frozen=True) + literal: object | None = None + path: str | None = None + transforms: tuple[Transform, ...] = () + timestamp_format: str | None = None + assume_timezone: str | None = None + +class PositionMappingProfile(BaseModel): + model_config = ConfigDict(extra="forbid", frozen=True) + profile_version: Literal["1.0"] + name: str + format: InputFormat + layout: Layout + snapshot_scope: SnapshotScope + fields: dict[str, FieldBinding] + position_fields: dict[str, FieldBinding] + positions_path: str | None = None +``` + +`profile_hash` 对 `profile.model_dump(mode="json", exclude_none=True)` 调用 `rfc8785.dumps` 后 SHA-256。`resolve_binding` 对 CSV 使用精确列名,对 JSON 使用 JSON Pointer;转换链逐项执行,错误统一抛出包含安全错误码但不含原始值的 `MappingValueError`。 + +- [ ] **Step 5: 运行映射测试和全量模型回归** + +Run: `uv run pytest tests/test_position_profile.py tests/test_models.py -q && uv run ty check src/quantcockpit/ingestion/position_profile.py` + +Expected: PASS。 + +- [ ] **Step 6: 提交映射层** + +```bash +git add pyproject.toml uv.lock src/quantcockpit/ingestion/position_profile.py tests/test_position_profile.py +git commit -m "feat: add deterministic position mapping profiles" +``` + +### Task 3: 受限来源读取与预览 + +**Files:** +- Create: `src/quantcockpit/ingestion/position_sources.py` +- Create: `src/quantcockpit/ingestion/positions.py` +- Create: `tests/test_position_sources.py` +- Create: `tests/test_position_preview.py` + +**Interfaces:** +- Produces: `SourceRecord`, `SourceLimitError`, `read_source(path, profile) -> Iterator[SourceRecord]`, `preview_positions(path, profile, observed_at) -> PositionPreview`。 +- Consumes: Task 1 `EventRecord`、Task 2 `PositionMappingProfile`/`resolve_binding`/`profile_hash`。 + +- [ ] **Step 1: 写 CSV/JSON/JSONL 读取边界失败测试** + +```python +def test_csv_reader_preserves_multiline_record_line_range(tmp_path: Path) -> None: + path = tmp_path / "positions.csv" + path.write_text('symbol,note\nAAPL,"line one\nline two"\n', encoding="utf-8") + rows = list(read_source(path, csv_profile())) + assert [(row.start_line, row.end_line, row.value["symbol"]) for row in rows] == [(2, 3, "AAPL")] + + +def test_source_larger_than_100_mib_is_rejected_before_parse(tmp_path: Path) -> None: + path = tmp_path / "large.json" + path.write_bytes(b" " * (100 * 1024 * 1024 + 1)) + with pytest.raises(SourceLimitError, match="ingestion_limit_exceeded"): + list(read_source(path, json_profile())) +``` + +另测:1 MiB 单条记录、JSONL 半写尾行、JSON 顶层类型错误、UTF-8 错误、100,001 仓位、文件扩展名与 profile format 不一致。 + +- [ ] **Step 2: 写预览只读、脱敏、分组和空仓失败测试** + +```python +def test_preview_normalizes_short_side_without_writing_database(tmp_path: Path) -> None: + result = preview_positions( + write_csv(tmp_path, "symbol,side,weight\nAAPL,short,0.25\n"), + profile_with_literals(), + observed_at=UTC_NOW, + ) + assert result.snapshots[0].event.payload.positions[0].weight == Decimal("-0.25") + assert result.sample_positions[0]["instrument_id"] == "AAPL" + assert len(result.mapping_profile_hash) == 71 + + +def test_empty_file_is_not_an_empty_portfolio_without_whole_file_scope(tmp_path: Path) -> None: + with pytest.raises(PositionImportError, match="empty_input"): + preview_positions(write_csv(tmp_path, "symbol,weight\n"), grouped_profile(), observed_at=UTC_NOW) +``` + +另测:最多五条样本、组内身份冲突整组失败、重复标的、recorded_at 默认 import_observed_at、event_time 等于 snapshot_time、显式空数组、分类字段不猜测。 + +- [ ] **Step 3: 运行测试并确认来源与预览模块不存在** + +Run: `uv run pytest tests/test_position_sources.py tests/test_position_preview.py -q` + +Expected: FAIL with missing modules。 + +- [ ] **Step 4: 实现流式来源记录和预览领域对象** + +```python +@dataclass(frozen=True) +class SourceRecord: + value: Mapping[str, object] + start_line: int + end_line: int + raw_json: str + +@dataclass(frozen=True) +class NormalizedSnapshot: + event: EventRecord + raw_json: str + start_line: int + end_line: int + +@dataclass(frozen=True) +class PositionPreview: + format: InputFormat + record_count: int + snapshot_count: int + source_fields: tuple[str, ...] + sample_positions: tuple[dict[str, object], ...] + snapshots: tuple[NormalizedSnapshot, ...] + mapping_profile_hash: str + warnings: tuple[dict[str, object], ...] +``` + +CSV 使用 `csv.DictReader` 并以 `reader.line_num` 记录多行字段范围;JSONL 逐行读取;JSON 在读取前检查文件大小。预览先完整规范化再返回,不接收 store。样本只包含规范字段,`portfolio_id` 和原始行不进入 sample。 + +- [ ] **Step 5: 运行来源、预览、模型和映射测试** + +Run: `uv run pytest tests/test_position_sources.py tests/test_position_preview.py tests/test_position_profile.py tests/test_models.py -q` + +Expected: PASS。 + +- [ ] **Step 6: 提交来源与预览** + +```bash +git add src/quantcockpit/ingestion/position_sources.py src/quantcockpit/ingestion/positions.py tests/test_position_sources.py tests/test_position_preview.py +git commit -m "feat: preview mapped position files" +``` + +### Task 4: 仓位导入 CLI、证据范围与版本化存储 + +**Files:** +- Modify: `src/quantcockpit/store.py` +- Modify: `src/quantcockpit/store_types.py` +- Modify: `src/quantcockpit/ingestion/positions.py` +- Create: `scripts/import_positions.py` +- Create: `tests/test_position_ingestion.py` +- Modify: `tests/test_scripts.py` + +**Interfaces:** +- Produces: `import_positions(store, path, profile, observed_at) -> PositionImportResult`、CLI `--input --profile --database [--preview]`。 +- Consumes: Task 3 `preview_positions` 和现有 `DuckDBStore.record_event` 修订机制。 + +- [ ] **Step 1: 写预览不写库、导入幂等、修订、行范围和安全错误测试** + +```python +def test_position_import_reuses_event_revision_semantics(tmp_path: Path) -> None: + store = DuckDBStore(tmp_path / "cockpit.duckdb") + first = import_positions(store, CSV_PATH, PROFILE, observed_at=FIRST_SEEN) + duplicate = import_positions(store, CSV_PATH, PROFILE, observed_at=SECOND_SEEN) + assert (first.imported, duplicate.duplicates) == (1, 1) + + +def test_preview_cli_does_not_create_database(tmp_path: Path) -> None: + database = tmp_path / "must-not-exist.duckdb" + completed = run_import_positions("--preview", "--database", str(database)) + assert completed.returncode == 0 + assert not database.exists() + assert str(tmp_path) not in completed.stdout +``` + +另测:同自然键晚 recorded_at 形成 revision、早 recorded_at 为 stale、`start_line/end_line` 持久化、组错误不写半快照、资源超限记录失败批次、CLI 错误输出不含原始账号和绝对路径。 + +- [ ] **Step 2: 运行测试并确认导入接口和 CLI 不存在** + +Run: `uv run pytest tests/test_position_ingestion.py tests/test_scripts.py -q` + +Expected: FAIL,错误指向 `import_positions` 或脚本缺失。 + +- [ ] **Step 3: 扩展存储证据并实现导入** + +```python +@dataclass(frozen=True) +class PositionImportResult: + imported: int = 0 + duplicates: int = 0 + revisions: int = 0 + stale: int = 0 + rejected_snapshots: int = 0 + +def import_positions( + store: DuckDBStore, + path: str | Path, + profile: PositionMappingProfile, + *, + observed_at: datetime | None = None, +) -> PositionImportResult: + preview = preview_positions(path, profile, observed_at=observed_at or datetime.now(timezone.utc)) + return _persist_snapshots(store, Path(path), preview) +``` + +`events` 新增 `end_line_number INTEGER`,已有行迁移为 `line_number`。`record_event(..., end_line_number: int | None = None)` 在单事务内保留 current 切换;原始表格组保存为受限 JSON 数组。CLI 的 preview 输出固定 JSON 摘要,正式导入后输出计数。 + +- [ ] **Step 4: 运行导入、旧 JSONL 和安全回归测试** + +Run: `uv run pytest tests/test_position_ingestion.py tests/test_ingestion.py tests/test_security_regressions.py tests/test_scripts.py -q` + +Expected: PASS,旧 JSONL 导入语义不变。 + +- [ ] **Step 5: 提交导入闭环** + +```bash +git add src/quantcockpit/store.py src/quantcockpit/store_types.py src/quantcockpit/ingestion/positions.py scripts/import_positions.py tests/test_position_ingestion.py tests/test_scripts.py +git commit -m "feat: import versioned position snapshots" +``` + +### Task 5: 敞口分析内核 + +**Files:** +- Create: `src/quantcockpit/analysis/exposure.py` +- Create: `tests/test_exposure.py` + +**Interfaces:** +- Produces: `analyze_exposure(snapshot: PositionSnapshotPayload) -> ExposureAnalysis`。 +- Consumes: Task 1 `PositionSnapshotPayload`。 + +- [ ] **Step 1: 写能力、基础优先级、真实零和分类失败测试** + +```python +def test_exposure_prefers_complete_risk_basis_and_uses_decimal() -> None: + result = analyze_exposure(snapshot( + position("A", weight="0.6", market_value_base="60", exposure_value_base="120"), + position("B", weight="-0.4", market_value_base="-40", exposure_value_base="-80"), + )) + assert result.basis == "exposure_value_base" + assert result.gross == Decimal("200") + assert result.net == Decimal("40") + assert result.top_1_share == Decimal("0.6") + assert result.hhi == Decimal("0.52") + + +def test_incomplete_basis_returns_reason_instead_of_false_zero() -> None: + result = analyze_exposure(snapshot(position("A", weight="0.5"), position("B", quantity="2"))) + assert result.gross is None + assert result.reason == "incomplete_basis" + assert result.candidate_basis == "weight" + assert result.coverage_ratio == Decimal("0.5") +``` + +另测:quantity-only Level 0、基础优先级、Top-5 少于五项、zero gross、显式空仓、零 position 计数、long/short、unclassified、分类覆盖率和计算精度。 + +- [ ] **Step 2: 运行测试并确认分析模块不存在** + +Run: `uv run pytest tests/test_exposure.py -q` + +Expected: FAIL with missing module。 + +- [ ] **Step 3: 实现不可变分析结果和单一公式** + +```python +Basis = Literal["weight", "market_value_base", "exposure_value_base"] + +@dataclass(frozen=True) +class ExposureAnalysis: + state: Literal["ready", "unavailable", "empty_portfolio"] + level: int + basis: Basis | None + candidate_basis: Basis | None + position_count: int + zero_position_count: int + long_count: int + short_count: int + gross: Decimal | None + net: Decimal | None + top_1_share: Decimal | None + top_5_share: Decimal | None + hhi: Decimal | None + coverage_ratio: Decimal | None + coverage_by_basis: dict[Basis, Decimal | None] + categories: dict[str, tuple[CategoryExposure, ...]] + category_coverage: dict[str, Decimal | None] + reason: str | None +``` + +用同一 `_measure(position, basis)` 驱动 gross、net、排名和分类;只在完整基础上计算数值。所有除法和求和置于 `localcontext(Context(prec=38, rounding=ROUND_HALF_EVEN))`,序列化前统一量化到最多 18 位小数。 + +- [ ] **Step 4: 运行分析测试和类型检查** + +Run: `uv run pytest tests/test_exposure.py -q && uv run ty check src/quantcockpit/analysis/exposure.py` + +Expected: PASS。 + +- [ ] **Step 5: 提交分析内核** + +```bash +git add src/quantcockpit/analysis/exposure.py tests/test_exposure.py +git commit -m "feat: calculate traceable position exposure" +``` + +### Task 6: portfolio 存储查询、服务层与 API + +**Files:** +- Modify: `src/quantcockpit/store_types.py` +- Modify: `src/quantcockpit/store.py` +- Modify: `src/quantcockpit/service.py` +- Modify: `src/quantcockpit/api_models.py` +- Modify: `src/quantcockpit/api.py` +- Modify: `tests/test_api.py` +- Modify: `tests/test_openapi_export.py` +- Regenerate: `frontend/openapi.json` +- Regenerate: `frontend/src/generated/api.ts` + +**Interfaces:** +- Produces: `CockpitService.portfolios()`、`CockpitService.portfolio_exposure(...)`、`GET /api/v1/portfolios`、`GET /api/v1/portfolios/{portfolio_id}/exposure`。 +- Consumes: Task 5 `analyze_exposure` 和 store current position rows。 + +- [ ] **Step 1: 写严格四元身份、最新 current、未来快照和响应结构失败测试** + +```python +def test_portfolio_api_isolates_identity_and_returns_mapping_evidence(tmp_path: Path) -> None: + client = seeded_position_client(tmp_path) + response = client.get("/api/v1/portfolios/book-a/exposure?strategy_id=alpha&environment=paper&source=broker-export") + assert response.status_code == 200 + body = response.json() + assert body["portfolio_id"] == "book-a" + assert body["basis"] == "market_value_base" + assert body["evidence_refs"][1].startswith("mapping:sha256:") + + +def test_portfolio_detail_does_not_cross_source_or_environment(tmp_path: Path) -> None: + client = seeded_position_client(tmp_path) + assert client.get("/api/v1/portfolios/book-a/exposure?strategy_id=alpha&environment=live&source=broker-export").status_code == 404 +``` + +另测:空列表 state、快照年龄使用注入 clock、未来快照不参与、revision 只读 current、不可计算字段为 null、显式空仓 gross/net 为字符串 `"0"`、缺 query 返回 422、OpenAPI 使用命名模型。 + +- [ ] **Step 2: 运行 API 测试并确认端点不存在** + +Run: `uv run pytest tests/test_api.py tests/test_openapi_export.py -q` + +Expected: FAIL,portfolio 路由为 404。 + +- [ ] **Step 3: 实现 current 查询、服务 DTO 与响应模型** + +```python +@dataclass(frozen=True) +class PortfolioIdentity: + portfolio_id: str + strategy_id: str + environment: Environment + source: str + +@dataclass(frozen=True) +class PortfolioExposure: + identity: PortfolioIdentity + snapshot_time: datetime + age_seconds: int + mapping_profile_hash: str + analysis: ExposureAnalysis + evidence_refs: tuple[str, str] +``` + +`DuckDBStore.current_position_snapshots(evaluated_at)` 只查询 current、`event_type = position_snapshot`、`event_time <= evaluated_at`,并以四元身份和 event_time 选最新。服务解析 `normalized_json` 回 `EventRecord`,调用一次 `analyze_exposure`。API Decimal 全部序列化为字符串,避免浏览器二进制浮点改写。 + +- [ ] **Step 4: 导出 OpenAPI 并验证无漂移** + +Run: `cd frontend && bun run generate:api && cd .. && uv run pytest tests/test_api.py tests/test_openapi_export.py -q` + +Expected: PASS,生成文件包含 `PortfoliosResponse` 和 `PortfolioExposureResponse`。 + +- [ ] **Step 5: 提交服务与 API** + +```bash +git add src/quantcockpit/store_types.py src/quantcockpit/store.py src/quantcockpit/service.py src/quantcockpit/api_models.py src/quantcockpit/api.py tests/test_api.py tests/test_openapi_export.py frontend/openapi.json frontend/src/generated/api.ts +git commit -m "feat: expose portfolio coverage and exposure api" +``` + +### Task 7: Markdown 报告与合成演示 + +**Files:** +- Modify: `src/quantcockpit/report.py` +- Modify: `scripts/import_demo.py` +- Create: `examples/positions/demo-positions.csv` +- Create: `examples/positions/demo-position-profile.json` +- Modify: `tests/test_report.py` +- Modify: `tests/test_scripts.py` + +**Interfaces:** +- Produces: 报告“仓位覆盖与集中度”章节;`import_demo.py` 同时导入旧事件和合成仓位。 +- Consumes: Task 6 `CockpitService.portfolios` / `portfolio_exposure`。 + +- [ ] **Step 1: 写报告证据、不可计算原因和演示导入失败测试** + +```python +def test_report_contains_position_basis_metrics_and_evidence(tmp_path: Path) -> None: + markdown = render_markdown(position_service(tmp_path), generated_at=NOW) + assert "## 仓位覆盖与集中度" in markdown + assert "basis = market_value_base" in markdown + assert "mapping:sha256:" in markdown + assert "event:" in markdown + + +def test_demo_import_includes_synthetic_position_snapshot(tmp_path: Path) -> None: + result = run_demo_import(tmp_path / "demo.duckdb") + assert result.returncode == 0 + assert "demo-positions.csv" in result.stdout +``` + +- [ ] **Step 2: 运行报告和脚本测试并确认仓位章节缺失** + +Run: `uv run pytest tests/test_report.py tests/test_scripts.py -q` + +Expected: FAIL,报告不存在仓位章节或 demo 未导入仓位。 + +- [ ] **Step 3: 复用服务层渲染报告并加入合成文件** + +报告按 portfolio 四元身份排序;ready 显示 basis、coverage、gross、net、Top-1、Top-5、HHI 和分类;unavailable 显示 candidate basis/coverage/reason;empty portfolio 显示真实 0。所有字符串继续经过 `_markdown_inline`。演示 CSV 使用虚构账户别名和价格,不包含真实市场或个人数据。 + +- [ ] **Step 4: 运行报告、脚本和安全回归** + +Run: `uv run pytest tests/test_report.py tests/test_scripts.py tests/test_security_regressions.py -q` + +Expected: PASS。 + +- [ ] **Step 5: 提交报告与演示** + +```bash +git add src/quantcockpit/report.py scripts/import_demo.py examples/positions tests/test_report.py tests/test_scripts.py +git commit -m "feat: report synthetic portfolio exposure" +``` + +### Task 8: React 仓位观察台 + +**Files:** +- Modify: `frontend/src/types.ts` +- Modify: `frontend/src/Dashboard.tsx` +- Modify: `frontend/src/styles.css` +- Modify: `frontend/tests/api.test.ts` +- Modify: `frontend/tests/dashboard.test.tsx` + +**Interfaces:** +- Produces: “仓位覆盖”和“集中度与敞口”面板,保持 loading/empty/partial/offline 语义。 +- Consumes: Task 6 生成的 OpenAPI TypeScript 类型和两个只读端点。 + +- [ ] **Step 1: 写 portfolio 请求、ready、unavailable、empty 和 partial 失败测试** + +```typescript +it("renders portfolio coverage and exposure without inventing missing metrics", async () => { + mockApi({ portfolios: ONE_PORTFOLIO, exposure: UNAVAILABLE_EXPOSURE }); + render(); + expect(await screen.findByRole("heading", { name: "仓位覆盖" })).toBeInTheDocument(); + expect(screen.getByText("3/12 个仓位缺少基础币种市场价值")).toBeInTheDocument(); + expect(screen.queryByText(/^0\.00$/)).not.toBeInTheDocument(); +}); + + +it("keeps strategy panels when one portfolio detail request fails", async () => { + mockApi({ portfolios: TWO_PORTFOLIOS, failedPortfolio: "book-b" }); + render(); + expect(await screen.findByText("部分数据不可用")).toBeInTheDocument(); + expect(screen.getByText("book-a")).toBeInTheDocument(); + expect(screen.getByText("book-b · 敞口加载失败")).toBeInTheDocument(); +}); +``` + +- [ ] **Step 2: 运行前端测试并确认仓位 UI 不存在** + +Run: `cd frontend && bun run test` + +Expected: FAIL,找不到仓位标题或请求。 + +- [ ] **Step 3: 实现并行加载和两个无新依赖面板** + +在 `DashboardData` 增加 portfolios、exposures 和 exposureFailures。策略、相关性、错误、portfolio 列表继续 `Promise.allSettled`;portfolio 详情按严格 URL 编码并行加载。数值只格式化 API Decimal 字符串,不在浏览器重算 HHI。分类使用 CSS 条形比例,`unclassified` 明示为“未分类”。 + +- [ ] **Step 4: 运行前端测试、类型检查和构建** + +Run: `cd frontend && bun run test && bun run typecheck && bun run build` + +Expected: PASS,无 TypeScript 诊断和 Vite 构建警告。 + +- [ ] **Step 5: 提交前端闭环** + +```bash +git add frontend/src/types.ts frontend/src/Dashboard.tsx frontend/src/styles.css frontend/tests/api.test.ts frontend/tests/dashboard.test.tsx +git commit -m "feat: show portfolio exposure in cockpit" +``` + +### Task 9: 开源接入文档、全量验证与版本说明 + +**Files:** +- Modify: `README.md` +- Modify: `docs/architecture.md` +- Modify: `CONTRIBUTING.md` +- Modify: `SECURITY.md` +- Modify: `CHANGELOG.md` +- Modify: `.env.example` + +**Interfaces:** +- Produces: 10 分钟仓位接入路径、映射字段词典、隐私边界、适配器贡献规则和 v0.2 版本说明。 +- Consumes: Tasks 1–8 的实际 CLI、API、示例和界面。 + +- [ ] **Step 1: 写文档命令回归测试** + +在 `tests/test_scripts.py` 增加 README 中两条命令的真实执行: + +```python +def test_readme_position_preview_and_import_commands(tmp_path: Path) -> None: + preview = run_documented_position_command(tmp_path, preview=True) + imported = run_documented_position_command(tmp_path, preview=False) + assert preview.returncode == 0 + assert imported.returncode == 0 + assert "snapshot_count" in preview.stdout + assert "imported=1" in imported.stdout +``` + +- [ ] **Step 2: 运行测试并确认文档辅助夹具不存在** + +Run: `uv run pytest tests/test_scripts.py -q` + +Expected: FAIL,README 尚未包含可提取的仓位命令或示例路径。 + +- [ ] **Step 3: 更新文档和版本说明** + +README 依次给出 `uv sync`、preview、import、API、前端和报告命令;明确“零侵入不等于零配置”。架构文档画出 Source Reader → Mapping Profile → Event → Exposure 流;CONTRIBUTING 规定新适配器必须提供合成夹具、映射、preview 快照和安全测试;SECURITY 说明原始文件只进入本地 DuckDB、AI 助手尚未运行;CHANGELOG 在 Unreleased 下列出 v0.2 功能和明确不支持项。 + +- [ ] **Step 4: 运行完整后端与前端验证** + +Run: `make verify` + +Expected: OpenAPI 无漂移;所有 pytest/Vitest 通过;Python/TypeScript 类型检查通过;Vite 构建成功。 + +- [ ] **Step 5: 运行合成端到端冒烟测试** + +Run: `uv run scripts/import_demo.py --database /tmp/quantcockpit-v0-2-demo.duckdb && QUANTCOCKPIT_DB_PATH=/tmp/quantcockpit-v0-2-demo.duckdb uv run scripts/generate_report.py --output /tmp/quantcockpit-v0-2-report.md --generated-at 2026-07-20T18:00:00Z` + +Expected: 导入输出包含仓位快照;报告包含“仓位覆盖与集中度”、`event:` 和 `mapping:sha256:`。 + +- [ ] **Step 6: 提交文档并记录最终验证** + +```bash +git add README.md docs/architecture.md CONTRIBUTING.md SECURITY.md CHANGELOG.md .env.example tests/test_scripts.py +git commit -m "docs: document zero-intrusion position onboarding" +``` + +## 规范覆盖自审 + +- 输入布局、映射、时间、符号、数字、币种、唯一键、空仓和资源上限:Tasks 1–4。 +- 幂等、修订、原始证据和预览不写库:Task 4。 +- 能力分级、覆盖率、gross/net、Top-N、HHI 和分类:Task 5。 +- 严格 portfolio 身份、最新 current、API 和 OpenAPI:Task 6。 +- 报告和完全合成演示:Task 7。 +- 前端 ready/empty/partial/offline 和不可计算语义:Task 8。 +- 10 分钟接入、隐私、适配器贡献和全量验证:Task 9。 +- 券商直连、成交重建、AI 运行时、因子 Beta、VaR 和告警派发均保持在 v0.2 范围之外。 From a4b8010ef990ea66ec5b4bcc729b1257ab802d6a Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:32:18 +0800 Subject: [PATCH 03/18] chore: ignore local worktrees --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8597c6e..ac686cb 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ quantcockpit-report.md .env.* !.env.example .gstack/ +.worktrees/ From cf398cb0600f1b5c7dfa793148df402975de8ff0 Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:36:01 +0800 Subject: [PATCH 04/18] feat: add position snapshot event contract --- src/quantcockpit/models.py | 161 +++++++++++++++++++++++++++++++++++-- tests/test_models.py | 149 ++++++++++++++++++++++++++++++++++ 2 files changed, 302 insertions(+), 8 deletions(-) diff --git a/src/quantcockpit/models.py b/src/quantcockpit/models.py index 5788c70..05e7ac4 100644 --- a/src/quantcockpit/models.py +++ b/src/quantcockpit/models.py @@ -8,12 +8,20 @@ import re from typing import Annotated, Literal -from pydantic import BaseModel, ConfigDict, Field, StringConstraints, field_validator, model_validator +from pydantic import ( + BaseModel, + BeforeValidator, + ConfigDict, + Field, + StringConstraints, + field_validator, + model_validator, +) -SchemaVersion = Literal["1.0"] +SchemaVersion = Literal["1.0", "1.1"] Environment = Literal["live", "paper"] -EventType = Literal["heartbeat", "run_status", "nav", "return"] +EventType = Literal["heartbeat", "run_status", "nav", "return", "position_snapshot"] StrategyId = Annotated[ str, StringConstraints( @@ -24,6 +32,51 @@ ), ] Source = Annotated[str, StringConstraints(strip_whitespace=True, min_length=1, max_length=256)] +InstrumentText = Annotated[ + str, + StringConstraints(strip_whitespace=True, min_length=1, max_length=256), +] +ClassificationText = Annotated[ + str, + StringConstraints(strip_whitespace=True, min_length=1, max_length=128), +] + + +_FIXED_DECIMAL_PATTERN = re.compile(r"^[+-]?(?:0|[1-9]\d*)(?:\.\d+)?$") + + +def _position_decimal(value: object) -> Decimal: + """把仓位度量限制为可审计的定点 Decimal,拒绝 float 和指数输入。""" + + if isinstance(value, bool) or isinstance(value, float): + raise ValueError("position decimal must not use binary float") + if isinstance(value, str): + if not _FIXED_DECIMAL_PATTERN.fullmatch(value): + raise ValueError("position decimal must use finite fixed-point notation") + parsed = Decimal(value) + elif isinstance(value, int): + parsed = Decimal(value) + elif isinstance(value, Decimal): + parsed = value + else: + raise ValueError("position decimal must be a string, integer, or Decimal") + + if not parsed.is_finite(): + raise ValueError("position decimal must be finite") + decimal_tuple = parsed.as_tuple() + exponent = decimal_tuple.exponent + if not isinstance(exponent, int): + raise ValueError("position decimal must be finite") + if isinstance(value, Decimal) and exponent > 0: + raise ValueError("position decimal must use finite fixed-point notation") + fractional_places = max(-exponent, 0) + integer_places = max(parsed.adjusted() + 1, 1) if parsed else 1 + if len(decimal_tuple.digits) > 30 or fractional_places > 18 or integer_places > 30: + raise ValueError("position decimal exceeds 30 digits or 18 decimal places") + return parsed + + +PositionDecimal = Annotated[Decimal, BeforeValidator(_position_decimal)] class EventPayloadBase(BaseModel): @@ -60,8 +113,88 @@ class ReturnPayload(EventPayloadBase): ] +class Position(EventPayloadBase): + """一个已经完成方向归一化的规范仓位。""" + + instrument_id: InstrumentText + instrument_id_type: Annotated[ + str, + StringConstraints(strip_whitespace=True, min_length=1, max_length=32), + ] = "custom" + venue: Annotated[ + str, + StringConstraints(strip_whitespace=True, min_length=1, max_length=32), + ] | None = None + side: Literal["long", "short"] | None = None + quantity: PositionDecimal | None = None + weight: PositionDecimal | None = None + market_value_base: PositionDecimal | None = None + exposure_value_base: PositionDecimal | None = None + asset_class: ClassificationText | None = None + sector: ClassificationText | None = None + country: ClassificationText | None = None + + @model_validator(mode="after") + def require_consistent_measures(self) -> Position: + measures = tuple( + value + for value in ( + self.quantity, + self.weight, + self.market_value_base, + self.exposure_value_base, + ) + if value is not None + ) + if not measures: + raise ValueError("position requires at least one measure") + nonzero_signs = {value.compare(Decimal(0)) for value in measures if value != 0} + if len(nonzero_signs) > 1: + raise ValueError("position nonzero measures must have the same direction") + if self.side == "long" and any(value < 0 for value in measures): + raise ValueError("long position measures must be non-negative") + if self.side == "short" and any(value > 0 for value in measures): + raise ValueError("short position measures must be non-positive") + return self + + +class PositionSnapshotPayload(EventPayloadBase): + """同一 portfolio 和时点的一组原子仓位。""" + + event_type: Literal["position_snapshot"] + portfolio_id: StrategyId + base_currency: Annotated[ + str, + StringConstraints(strip_whitespace=True, pattern=r"^[A-Z0-9]{3,12}$"), + ] | None = None + mapping_profile_hash: Annotated[ + str, + StringConstraints(pattern=r"^sha256:[0-9a-f]{64}$"), + ] + positions: Annotated[tuple[Position, ...], Field(max_length=100_000)] + + @model_validator(mode="after") + def require_snapshot_consistency(self) -> PositionSnapshotPayload: + identities: set[tuple[str, str, str]] = set() + for position in self.positions: + identity = ( + position.instrument_id_type, + position.instrument_id, + position.venue or "", + ) + if identity in identities: + raise ValueError("position snapshot contains duplicate instrument identity") + identities.add(identity) + if self.base_currency is None and any( + position.market_value_base is not None or position.exposure_value_base is not None + for position in self.positions + ): + raise ValueError("base_currency is required for base value measures") + return self + + EventPayload = Annotated[ - HeartbeatPayload | RunStatusPayload | NavPayload | ReturnPayload, + HeartbeatPayload | RunStatusPayload | NavPayload | ReturnPayload | PositionSnapshotPayload, Field(discriminator="event_type"), ] @@ -102,22 +235,34 @@ def require_utc_aware_timestamp(cls, value: datetime) -> datetime: def payload_type_matches_event_type(self) -> EventRecord: if self.payload.event_type != self.event_type: raise ValueError("payload event_type must match event_type") + if self.event_type == "position_snapshot" and self.schema_version != "1.1": + raise ValueError("position_snapshot requires schema 1.1") return self @property def idempotency_key(self) -> str: """返回事件自然身份的稳定 SHA-256 摘要,不包含可修订的载荷。""" - identity = "\x1f".join( - ( + if isinstance(self.payload, PositionSnapshotPayload): + identity_parts = [ + self.strategy_id, + self.environment, + self.source, + self.payload.portfolio_id, + self.event_type, + self.event_time.isoformat().replace("+00:00", "Z"), + self.schema_version, + ] + else: + identity_parts = [ self.strategy_id, self.environment, self.event_type, self.event_time.isoformat().replace("+00:00", "Z"), self.source, self.schema_version, - ) - ) + ] + identity = "\x1f".join(identity_parts) return sha256(identity.encode("utf-8")).hexdigest() def is_late_revision_of(self, previous: EventRecord) -> bool: diff --git a/tests/test_models.py b/tests/test_models.py index 9337927..1006782 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,5 +1,6 @@ from datetime import datetime, timezone from decimal import Decimal +from hashlib import sha256 import pytest from pydantic import ValidationError @@ -26,6 +27,28 @@ def event_data(**overrides: object) -> dict[str, object]: return data +def position_event(**payload_overrides: object) -> dict[str, object]: + payload: dict[str, object] = { + "event_type": "position_snapshot", + "portfolio_id": "paper-book-a", + "base_currency": "USD", + "mapping_profile_hash": f"sha256:{'a' * 64}", + "positions": [ + { + "instrument_id": "AAPL", + "instrument_id_type": "ticker", + "weight": "0.25", + } + ], + } + payload.update(payload_overrides) + return event_data( + schema_version="1.1", + event_type="position_snapshot", + payload=payload, + ) + + def test_return_event_preserves_strategy_identity_and_decimal_return() -> None: event = EventRecord.model_validate(event_data()) @@ -114,3 +137,129 @@ def test_event_rejects_unsupported_event_type() -> None: EventRecord.model_validate( event_data(event_type="order", payload={"event_type": "order"}) ) + + +def test_position_snapshot_requires_schema_1_1_and_keeps_1_0_compatible() -> None: + assert EventRecord.model_validate(event_data()).schema_version == "1.0" + assert EventRecord.model_validate(position_event()).payload.event_type == "position_snapshot" + + with pytest.raises(ValidationError, match="schema 1.1"): + EventRecord.model_validate(position_event() | {"schema_version": "1.0"}) + + +def test_position_snapshot_accepts_authoritative_empty_portfolio() -> None: + event = EventRecord.model_validate(position_event(positions=[])) + + assert event.payload.positions == () + + +def test_portfolio_id_participates_in_position_idempotency_key() -> None: + left = EventRecord.model_validate(position_event(portfolio_id="book-a")) + right = EventRecord.model_validate(position_event(portfolio_id="book-b")) + + assert left.idempotency_key != right.idempotency_key + + +def test_position_idempotency_key_uses_the_documented_identity_order() -> None: + event = EventRecord.model_validate(position_event(portfolio_id="book-a")) + material = "\x1f".join( + ( + "trend-following-v1", + "paper", + "daily-jsonl", + "book-a", + "position_snapshot", + "2026-07-20T09:30:00Z", + "1.1", + ) + ) + + assert event.idempotency_key == sha256(material.encode("utf-8")).hexdigest() + + +def test_position_requires_a_measure_and_rejects_conflicting_directions() -> None: + without_measure = { + "instrument_id": "AAPL", + "instrument_id_type": "ticker", + } + conflicting = without_measure | {"quantity": "1", "weight": "-0.25"} + + with pytest.raises(ValidationError, match="at least one measure"): + EventRecord.model_validate(position_event(positions=[without_measure])) + with pytest.raises(ValidationError, match="same direction"): + EventRecord.model_validate(position_event(positions=[conflicting])) + + +def test_position_side_must_match_normalized_measure_signs() -> None: + with pytest.raises(ValidationError, match="short position measures must be non-positive"): + EventRecord.model_validate( + position_event( + positions=[ + { + "instrument_id": "AAPL", + "instrument_id_type": "ticker", + "side": "short", + "quantity": "1", + } + ] + ) + ) + + +def test_position_snapshot_requires_base_currency_for_base_values() -> None: + with pytest.raises(ValidationError, match="base_currency"): + EventRecord.model_validate( + position_event( + base_currency=None, + positions=[ + { + "instrument_id": "AAPL", + "instrument_id_type": "ticker", + "market_value_base": "22000", + } + ], + ) + ) + + +def test_position_identity_includes_venue_and_rejects_exact_duplicates() -> None: + same_symbol_different_venues = [ + {"instrument_id": "ABC", "instrument_id_type": "ticker", "venue": "XNAS", "weight": "0.4"}, + {"instrument_id": "ABC", "instrument_id_type": "ticker", "venue": "XNYS", "weight": "0.6"}, + ] + assert len( + EventRecord.model_validate(position_event(positions=same_symbol_different_venues)).payload.positions + ) == 2 + + with pytest.raises(ValidationError, match="duplicate instrument"): + EventRecord.model_validate( + position_event(positions=[same_symbol_different_venues[0], same_symbol_different_venues[0]]) + ) + + +@pytest.mark.parametrize( + "invalid_measure", + [ + 0.25, + "NaN", + "Infinity", + "1e-3", + "1234567890123456789012345678901", + "0.1234567890123456789", + ], +) +def test_position_measure_rejects_binary_float_nonfinite_exponent_and_precision( + invalid_measure: object, +) -> None: + with pytest.raises(ValidationError, match="position decimal"): + EventRecord.model_validate( + position_event( + positions=[ + { + "instrument_id": "AAPL", + "instrument_id_type": "ticker", + "weight": invalid_measure, + } + ] + ) + ) From b6acac06e3d80c0c009947e600cddd5273074dff Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:39:21 +0800 Subject: [PATCH 05/18] feat: add deterministic position mapping profiles --- pyproject.toml | 1 + .../ingestion/position_profile.py | 265 ++++++++++++++++++ tests/test_position_profile.py | 165 +++++++++++ uv.lock | 11 + 4 files changed, 442 insertions(+) create mode 100644 src/quantcockpit/ingestion/position_profile.py create mode 100644 tests/test_position_profile.py diff --git a/pyproject.toml b/pyproject.toml index c27ba00..5ee9042 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,7 @@ dependencies = [ "pydantic>=2.13.4", # DuckDB 的 TIMESTAMPTZ 查询结果映射为 Python datetime 时动态导入。 "pytz>=2026.2", + "rfc8785>=0.1.4", "uvicorn>=0.51.0", ] diff --git a/src/quantcockpit/ingestion/position_profile.py b/src/quantcockpit/ingestion/position_profile.py new file mode 100644 index 0000000..b38ec52 --- /dev/null +++ b/src/quantcockpit/ingestion/position_profile.py @@ -0,0 +1,265 @@ +"""仓位来源的声明式映射配置与无副作用转换。""" + +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from datetime import datetime, timezone +from decimal import Decimal +from hashlib import sha256 +import re +from typing import Literal, cast +from zoneinfo import ZoneInfo, ZoneInfoNotFoundError + +from pydantic import BaseModel, ConfigDict, StringConstraints, TypeAdapter, model_validator +from typing_extensions import Annotated + +import rfc8785 + +from quantcockpit.models import PositionDecimal + + +Transform = Literal["trim", "uppercase", "lowercase", "decimal", "utc_timestamp"] +InputFormat = Literal["csv", "json", "jsonl"] +Layout = Literal["document_snapshot", "tabular_snapshot"] +SnapshotScope = Literal["grouped_rows", "whole_file"] +LiteralValue = str | int | bool +MetadataField = Literal[ + "strategy_id", + "environment", + "source", + "portfolio_id", + "snapshot_time", + "recorded_at", + "base_currency", +] +PositionField = Literal[ + "instrument_id", + "instrument_id_type", + "venue", + "side", + "quantity", + "weight", + "market_value_base", + "exposure_value_base", + "asset_class", + "sector", + "country", +] + + +_RFC3339_PATTERN = re.compile( + r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$" +) +_INVALID_POINTER_ESCAPE = re.compile(r"~(?:[^01]|$)") +_POSITION_DECIMAL_ADAPTER = TypeAdapter(PositionDecimal) + + +class MappingValueError(ValueError): + """不包含原始值的安全映射错误。""" + + def __init__(self, code: str, message: str) -> None: + self.code = code + super().__init__(f"{code}: {message}") + + +class FieldBinding(BaseModel): + """一个固定值或来源路径,以及有限的确定性转换链。""" + + model_config = ConfigDict(extra="forbid", frozen=True) + + literal: LiteralValue | None = None + path: Annotated[str, StringConstraints(min_length=1, max_length=512)] | None = None + transforms: tuple[Transform, ...] = () + timestamp_format: Annotated[str, StringConstraints(min_length=1, max_length=128)] | None = None + assume_timezone: Annotated[str, StringConstraints(min_length=1, max_length=128)] | None = None + + @model_validator(mode="after") + def require_safe_binding(self) -> FieldBinding: + if (self.literal is None) == (self.path is None): + raise ValueError("field binding requires exactly one of literal or path") + if (self.timestamp_format is None) != (self.assume_timezone is None): + raise ValueError("timestamp_format and assume_timezone must be configured together") + if self.timestamp_format is not None and "utc_timestamp" not in self.transforms: + raise ValueError("local timestamp configuration requires utc_timestamp transform") + if self.assume_timezone is not None: + try: + ZoneInfo(self.assume_timezone) + except ZoneInfoNotFoundError as error: + raise ValueError("assume_timezone must be a known IANA timezone") from error + return self + + +class PositionMappingProfile(BaseModel): + """一类仓位文件的版本化映射契约。""" + + model_config = ConfigDict(extra="forbid", frozen=True) + + profile_version: Literal["1.0"] + name: Annotated[ + str, + StringConstraints(strip_whitespace=True, min_length=1, max_length=128), + ] + format: InputFormat + layout: Layout + snapshot_scope: SnapshotScope + fields: dict[MetadataField, FieldBinding] + position_fields: dict[PositionField, FieldBinding] + positions_path: Annotated[str, StringConstraints(min_length=1, max_length=512)] | None = None + + @model_validator(mode="after") + def require_complete_mapping(self) -> PositionMappingProfile: + required_metadata = { + "strategy_id", + "environment", + "source", + "portfolio_id", + "snapshot_time", + } + missing_metadata = required_metadata.difference(self.fields) + if missing_metadata: + raise ValueError(f"mapping fields missing required names: {sorted(missing_metadata)}") + if "instrument_id" not in self.position_fields: + raise ValueError("position_fields must map instrument_id") + if not {"quantity", "weight", "market_value_base", "exposure_value_base"}.intersection( + self.position_fields + ): + raise ValueError("position_fields must map at least one measure") + if self.layout == "document_snapshot" and self.positions_path is None: + raise ValueError("document_snapshot requires positions_path") + if self.layout == "tabular_snapshot" and self.positions_path is not None: + raise ValueError("tabular_snapshot does not accept positions_path") + if self.format == "csv" and self.layout != "tabular_snapshot": + raise ValueError("csv supports only tabular_snapshot layout") + if self.format != "csv": + paths = [ + binding.path + for binding in (*self.fields.values(), *self.position_fields.values()) + if binding.path is not None + ] + if self.positions_path is not None: + paths.append(self.positions_path) + if any(not path.startswith("/") for path in paths): + raise ValueError("JSON and JSONL paths must use RFC 6901 JSON Pointer syntax") + return self + + +def profile_hash(profile: PositionMappingProfile) -> str: + """返回 RFC 8785 规范化映射的稳定 SHA-256 证据引用。""" + + canonical = rfc8785.dumps(profile.model_dump(mode="json", exclude_none=True)) + return f"sha256:{sha256(canonical).hexdigest()}" + + +def resolve_binding( + binding: FieldBinding, + record: Mapping[str, object], + *, + format: InputFormat, +) -> object: + """读取一个绑定并按声明顺序转换,失败时不泄漏原始值。""" + + if binding.path is None: + value: object = binding.literal + elif format == "csv": + if binding.path not in record: + raise MappingValueError("mapping_path_missing", "configured CSV column is absent") + value = record[binding.path] + else: + value = _resolve_json_pointer(record, binding.path) + + for transform in binding.transforms: + value = _apply_transform(value, transform, binding) + return value + + +def _resolve_json_pointer(record: object, pointer: str) -> object: + if not pointer.startswith("/") or _INVALID_POINTER_ESCAPE.search(pointer): + raise MappingValueError("mapping_path_invalid", "configured JSON Pointer is invalid") + current = record + for raw_token in pointer[1:].split("/"): + token = raw_token.replace("~1", "/").replace("~0", "~") + if isinstance(current, Mapping): + current_mapping = cast(Mapping[str, object], current) + if token not in current_mapping: + raise MappingValueError("mapping_path_missing", "configured JSON member is absent") + current = current_mapping[token] + elif isinstance(current, Sequence) and not isinstance(current, (str, bytes, bytearray)): + if not token.isdigit(): + raise MappingValueError("mapping_path_missing", "configured JSON array index is invalid") + index = int(token) + if index >= len(current): + raise MappingValueError("mapping_path_missing", "configured JSON array index is absent") + current = current[index] + else: + raise MappingValueError("mapping_path_missing", "configured JSON path cannot be traversed") + return current + + +def _apply_transform(value: object, transform: Transform, binding: FieldBinding) -> object: + if transform == "trim": + return _require_text(value, transform).strip() + if transform == "uppercase": + return _require_text(value, transform).upper() + if transform == "lowercase": + return _require_text(value, transform).lower() + if transform == "decimal": + try: + return _POSITION_DECIMAL_ADAPTER.validate_python(value) + except ValueError as error: + raise MappingValueError( + "mapping_decimal_invalid", + "source value is not an allowed fixed-point decimal", + ) from error + return _utc_timestamp(value, binding) + + +def _require_text(value: object, transform: str) -> str: + if not isinstance(value, str): + raise MappingValueError( + "mapping_transform_invalid", + f"{transform} requires a text source value", + ) + return value + + +def _utc_timestamp(value: object, binding: FieldBinding) -> datetime: + text = _require_text(value, "utc_timestamp") + if binding.timestamp_format is None: + if not _RFC3339_PATTERN.fullmatch(text): + raise MappingValueError( + "mapping_timestamp_invalid", + "timestamp must be RFC 3339 with an explicit offset", + ) + try: + parsed = datetime.fromisoformat(text.replace("Z", "+00:00")) + except ValueError as error: + raise MappingValueError( + "mapping_timestamp_invalid", + "timestamp is not a valid calendar time", + ) from error + return parsed.astimezone(timezone.utc) + + try: + naive = datetime.strptime(text, binding.timestamp_format) + except ValueError as error: + raise MappingValueError( + "mapping_timestamp_invalid", + "timestamp does not match configured local format", + ) from error + if naive.tzinfo is not None or binding.assume_timezone is None: + raise MappingValueError( + "mapping_timestamp_invalid", + "configured local timestamp must not contain an offset", + ) + zone = ZoneInfo(binding.assume_timezone) + candidates: set[datetime] = set() + for fold in (0, 1): + candidate = naive.replace(tzinfo=zone, fold=fold).astimezone(timezone.utc) + if candidate.astimezone(zone).replace(tzinfo=None) == naive: + candidates.add(candidate) + if len(candidates) != 1: + raise MappingValueError( + "ambiguous_source_time", + "local timestamp is ambiguous or does not exist in configured timezone", + ) + return candidates.pop() diff --git a/tests/test_position_profile.py b/tests/test_position_profile.py new file mode 100644 index 0000000..8d4b046 --- /dev/null +++ b/tests/test_position_profile.py @@ -0,0 +1,165 @@ +from datetime import datetime, timezone +from decimal import Decimal + +import pytest +from pydantic import ValidationError + +from quantcockpit.ingestion.position_profile import ( + FieldBinding, + MappingValueError, + PositionMappingProfile, + Transform, + profile_hash, + resolve_binding, +) + + +PROFILE: dict[str, object] = { + "profile_version": "1.0", + "name": "example-position-csv", + "format": "csv", + "layout": "tabular_snapshot", + "snapshot_scope": "grouped_rows", + "fields": { + "strategy_id": {"literal": "trend-following"}, + "environment": {"literal": "paper"}, + "source": {"literal": "daily-export"}, + "portfolio_id": {"path": "account_alias", "transforms": ["trim"]}, + "snapshot_time": {"path": "as_of", "transforms": ["utc_timestamp"]}, + }, + "position_fields": { + "instrument_id": {"path": "symbol", "transforms": ["trim"]}, + "instrument_id_type": {"literal": "ticker"}, + "weight": {"path": "weight", "transforms": ["decimal"]}, + }, +} + + +def test_profile_hash_ignores_json_key_order() -> None: + left = PositionMappingProfile.model_validate(PROFILE) + right = PositionMappingProfile.model_validate(dict(reversed(list(PROFILE.items())))) + + assert profile_hash(left) == profile_hash(right) + assert profile_hash(left).startswith("sha256:") + assert len(profile_hash(left)) == 71 + + +def test_field_binding_requires_exactly_one_literal_or_path() -> None: + with pytest.raises(ValidationError, match="exactly one"): + FieldBinding() + with pytest.raises(ValidationError, match="exactly one"): + FieldBinding(literal="alpha", path="strategy") + + +def test_local_timestamp_requires_format_and_timezone_together() -> None: + with pytest.raises(ValidationError, match="together"): + FieldBinding( + path="as_of", + transforms=("utc_timestamp",), + timestamp_format="%Y-%m-%d %H:%M:%S", + ) + + +def test_json_pointer_uses_rfc_6901_escaping() -> None: + binding = FieldBinding(path="/account~1meta/book~0name", transforms=("trim",)) + + assert ( + resolve_binding( + binding, + {"account/meta": {"book~name": " alpha "}}, + format="json", + ) + == "alpha" + ) + + +def test_csv_path_is_an_exact_header_and_missing_path_is_safe() -> None: + binding = FieldBinding(path="Account Alias", transforms=("trim",)) + assert resolve_binding(binding, {"Account Alias": " book-a "}, format="csv") == "book-a" + + with pytest.raises(MappingValueError) as captured: + resolve_binding(binding, {"account alias": "book-a"}, format="csv") + assert captured.value.code == "mapping_path_missing" + assert "book-a" not in str(captured.value) + + +@pytest.mark.parametrize( + ("transforms", "raw", "expected"), + [ + (("trim", "uppercase"), " usdt ", "USDT"), + (("trim", "lowercase"), " EQUITY ", "equity"), + (("decimal",), "-12.2500", Decimal("-12.2500")), + (("utc_timestamp",), "2026-07-20T17:30:00+08:00", datetime(2026, 7, 20, 9, 30, tzinfo=timezone.utc)), + ], +) +def test_allowed_transforms_execute_in_order( + transforms: tuple[Transform, ...], raw: str, expected: object +) -> None: + binding = FieldBinding(path="value", transforms=transforms) + + assert resolve_binding(binding, {"value": raw}, format="csv") == expected + + +def test_local_timestamp_uses_explicit_iana_timezone() -> None: + binding = FieldBinding( + path="as_of", + transforms=("utc_timestamp",), + timestamp_format="%Y-%m-%d %H:%M:%S", + assume_timezone="Asia/Shanghai", + ) + + assert resolve_binding(binding, {"as_of": "2026-07-20 17:30:00"}, format="csv") == datetime( + 2026, 7, 20, 9, 30, tzinfo=timezone.utc + ) + + +@pytest.mark.parametrize( + ("raw", "zone"), + [ + ("2026-11-01 01:30:00", "America/New_York"), + ("2026-03-08 02:30:00", "America/New_York"), + ], +) +def test_local_timestamp_rejects_dst_ambiguous_and_nonexistent_times(raw: str, zone: str) -> None: + binding = FieldBinding( + path="as_of", + transforms=("utc_timestamp",), + timestamp_format="%Y-%m-%d %H:%M:%S", + assume_timezone=zone, + ) + + with pytest.raises(MappingValueError) as captured: + resolve_binding(binding, {"as_of": raw}, format="csv") + assert captured.value.code == "ambiguous_source_time" + assert raw not in str(captured.value) + + +@pytest.mark.parametrize( + "raw", + [ + 0.25, + "NaN", + "1e-3", + "1234567890123456789012345678901", + "0.1234567890123456789", + ], +) +def test_decimal_transform_reuses_position_decimal_limits(raw: object) -> None: + binding = FieldBinding(path="weight", transforms=("decimal",)) + + with pytest.raises(MappingValueError) as captured: + resolve_binding(binding, {"weight": raw}, format="csv") + assert captured.value.code == "mapping_decimal_invalid" + assert str(raw) not in str(captured.value) + + +def test_profile_rejects_unknown_fields_and_invalid_json_path_syntax() -> None: + invalid = dict(PROFILE) + invalid["network"] = "https://example.invalid" + with pytest.raises(ValidationError, match="Extra inputs"): + PositionMappingProfile.model_validate(invalid) + + json_profile = dict(PROFILE) + json_profile["format"] = "json" + with pytest.raises(ValidationError, match="JSON Pointer"): + PositionMappingProfile.model_validate(json_profile) diff --git a/uv.lock b/uv.lock index 52a3c93..686f660 100644 --- a/uv.lock +++ b/uv.lock @@ -287,6 +287,7 @@ dependencies = [ { name = "fastapi" }, { name = "pydantic" }, { name = "pytz" }, + { name = "rfc8785" }, { name = "uvicorn" }, ] @@ -303,6 +304,7 @@ requires-dist = [ { name = "fastapi", specifier = ">=0.139.2" }, { name = "pydantic", specifier = ">=2.13.4" }, { name = "pytz", specifier = ">=2026.2" }, + { name = "rfc8785", specifier = ">=0.1.4" }, { name = "uvicorn", specifier = ">=0.51.0" }, ] @@ -313,6 +315,15 @@ dev = [ { name = "ty", specifier = ">=0.0.61" }, ] +[[package]] +name = "rfc8785" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/2f/fa1d2e740c490191b572d33dbca5daa180cb423c24396b856f5886371d8b/rfc8785-0.1.4.tar.gz", hash = "sha256:e545841329fe0eee4f6a3b44e7034343100c12b4ec566dc06ca9735681deb4da", size = 14321, upload-time = "2024-09-27T16:33:31.206Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/78/119878110660b2ad709888c8a1614fce7e2fab39080ab960656dc8605bf6/rfc8785-0.1.4-py3-none-any.whl", hash = "sha256:520d690b448ecf0703691c76e1a34a24ddcd4fc5bc41d589cb7c58ec651bcd48", size = 9240, upload-time = "2024-09-27T16:33:29.683Z" }, +] + [[package]] name = "starlette" version = "1.3.1" From d40cb1ee426dec7e3b9b491baec57e8b5ecf8770 Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:45:42 +0800 Subject: [PATCH 06/18] feat: preview mapped position files --- .../ingestion/position_sources.py | 238 ++++++++++++ src/quantcockpit/ingestion/positions.py | 367 ++++++++++++++++++ tests/test_position_preview.py | 178 +++++++++ tests/test_position_sources.py | 120 ++++++ 4 files changed, 903 insertions(+) create mode 100644 src/quantcockpit/ingestion/position_sources.py create mode 100644 src/quantcockpit/ingestion/positions.py create mode 100644 tests/test_position_preview.py create mode 100644 tests/test_position_sources.py diff --git a/src/quantcockpit/ingestion/position_sources.py b/src/quantcockpit/ingestion/position_sources.py new file mode 100644 index 0000000..87b30db --- /dev/null +++ b/src/quantcockpit/ingestion/position_sources.py @@ -0,0 +1,238 @@ +"""受资源限制的 CSV、JSON 与 JSONL 仓位来源读取器。""" + +from __future__ import annotations + +from collections.abc import Iterator, Mapping +import csv +from dataclasses import dataclass +import json +from pathlib import Path +import re +from typing import TextIO, cast + +from quantcockpit.ingestion.position_profile import PositionMappingProfile + + +MAX_SOURCE_BYTES = 100 * 1024 * 1024 +MAX_RECORD_BYTES = 1024 * 1024 +_EXTENSION_BY_FORMAT = {"csv": ".csv", "json": ".json", "jsonl": ".jsonl"} + + +class SourceReadError(ValueError): + """不回显路径或原始内容的来源读取错误。""" + + def __init__(self, code: str, message: str, *, line_number: int | None = None) -> None: + self.code = code + self.line_number = line_number + location = "" if line_number is None else f" at line {line_number}" + super().__init__(f"{code}{location}: {message}") + + +@dataclass(frozen=True) +class SourceRecord: + value: Mapping[str, object] + start_line: int + end_line: int + raw_json: str + + +class _TrackedLines: + def __init__(self, source: TextIO) -> None: + self._source = source + self.total_bytes = 0 + + def __iter__(self) -> _TrackedLines: + return self + + def __next__(self) -> str: + line = next(self._source) + self.total_bytes += len(line.encode("utf-8")) + return line + + +def read_source( + path: str | Path, + profile: PositionMappingProfile, +) -> Iterator[SourceRecord]: + """按 profile 读取来源记录;不保留文件句柄,也不吞掉格式错误。""" + + source_path = Path(path) + _validate_source_file(source_path, profile) + if profile.format == "csv": + yield from _read_csv(source_path) + elif profile.format == "jsonl": + yield from _read_jsonl(source_path) + else: + yield from _read_json(source_path, document=profile.layout == "document_snapshot") + + +def _validate_source_file(source_path: Path, profile: PositionMappingProfile) -> None: + if source_path.suffix.lower() != _EXTENSION_BY_FORMAT[profile.format]: + raise SourceReadError( + "unsupported_input_format", + "file extension does not match mapping profile format", + ) + try: + size = source_path.stat().st_size + except OSError as error: + raise SourceReadError("file_read_error", "source file cannot be inspected") from error + if size > MAX_SOURCE_BYTES: + raise SourceReadError( + "ingestion_limit_exceeded", + "source file exceeds the 100 MiB limit", + ) + + +def _read_csv(source_path: Path) -> Iterator[SourceRecord]: + try: + with source_path.open("r", encoding="utf-8", newline="") as source: + tracked = _TrackedLines(source) + reader = csv.DictReader(tracked) + fieldnames = reader.fieldnames + if fieldnames is None: + return + if any(not name or not name.strip() for name in fieldnames) or len(set(fieldnames)) != len( + fieldnames + ): + raise SourceReadError( + "invalid_tabular_header", + "CSV header names must be nonblank and unique", + line_number=1, + ) + if tracked.total_bytes > MAX_RECORD_BYTES: + raise SourceReadError( + "ingestion_limit_exceeded", + "CSV header exceeds the 1 MiB record limit", + line_number=1, + ) + previous_line = reader.line_num + previous_bytes = tracked.total_bytes + for row in reader: + start_line = previous_line + 1 + end_line = reader.line_num + record_bytes = tracked.total_bytes - previous_bytes + if record_bytes > MAX_RECORD_BYTES: + raise SourceReadError( + "ingestion_limit_exceeded", + "CSV record exceeds the 1 MiB limit", + line_number=start_line, + ) + if None in row or any(value is None for value in row.values()): + raise SourceReadError( + "invalid_tabular_record", + "CSV row does not match the declared header", + line_number=start_line, + ) + normalized = cast(dict[str, object], row) + yield SourceRecord( + value=normalized, + start_line=start_line, + end_line=end_line, + raw_json=_safe_json(normalized), + ) + previous_line = end_line + previous_bytes = tracked.total_bytes + except SourceReadError: + raise + except (OSError, UnicodeError) as error: + raise SourceReadError("file_read_error", "source CSV cannot be read as UTF-8") from error + except csv.Error as error: + raise SourceReadError("invalid_tabular_record", "source CSV is malformed") from error + + +def _read_jsonl(source_path: Path) -> Iterator[SourceRecord]: + try: + file_size = source_path.stat().st_size + with source_path.open("rb") as source: + for line_number, raw_line in enumerate(source, start=1): + if len(raw_line) > MAX_RECORD_BYTES: + raise SourceReadError( + "ingestion_limit_exceeded", + "JSONL record exceeds the 1 MiB limit", + line_number=line_number, + ) + if not raw_line.strip(): + continue + try: + text = raw_line.decode("utf-8") + decoded = json.loads(text) + except UnicodeError as error: + raise SourceReadError( + "file_read_error", + "source JSONL cannot be read as UTF-8", + line_number=line_number, + ) from error + except json.JSONDecodeError as error: + is_tail = source.tell() == file_size and _incomplete_json_error(error, text) + raise SourceReadError( + "incomplete_tail" if is_tail else "invalid_json", + "JSONL record is incomplete" if is_tail else "JSONL record is malformed", + line_number=line_number, + ) from error + record = _require_object(decoded, line_number=line_number) + yield SourceRecord( + value=record, + start_line=line_number, + end_line=line_number, + raw_json=_safe_json(record), + ) + except SourceReadError: + raise + except OSError as error: + raise SourceReadError("file_read_error", "source JSONL cannot be read") from error + + +def _read_json(source_path: Path, *, document: bool) -> Iterator[SourceRecord]: + try: + text = source_path.read_text(encoding="utf-8") + except (OSError, UnicodeError) as error: + raise SourceReadError("file_read_error", "source JSON cannot be read as UTF-8") from error + try: + decoded = json.loads(text) + except json.JSONDecodeError as error: + raise SourceReadError("invalid_json", "source JSON is malformed", line_number=error.lineno) from error + line_count = max(text.count("\n") + 1, 1) + if document: + record = _require_object(decoded, line_number=1) + if len(_safe_json(record).encode("utf-8")) > MAX_SOURCE_BYTES: + raise SourceReadError("ingestion_limit_exceeded", "JSON document exceeds source limit") + yield SourceRecord(value=record, start_line=1, end_line=line_count, raw_json=_safe_json(record)) + return + if not isinstance(decoded, list): + raise SourceReadError("invalid_json_layout", "tabular JSON must contain a top-level array") + for index, item in enumerate(decoded, start=1): + record = _require_object(item, line_number=index) + raw_json = _safe_json(record) + if len(raw_json.encode("utf-8")) > MAX_RECORD_BYTES: + raise SourceReadError( + "ingestion_limit_exceeded", + "JSON array record exceeds the 1 MiB limit", + line_number=index, + ) + yield SourceRecord(value=record, start_line=index, end_line=index, raw_json=raw_json) + + +def _require_object(value: object, *, line_number: int) -> Mapping[str, object]: + if not isinstance(value, dict) or any(not isinstance(key, str) for key in value): + raise SourceReadError( + "invalid_json_layout", + "source record must be a JSON object", + line_number=line_number, + ) + return cast(dict[str, object], value) + + +def _safe_json(value: object) -> str: + return json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":")) + + +def _incomplete_json_error(error: json.JSONDecodeError, raw_line: str) -> bool: + stripped = raw_line.strip() + return ( + error.pos >= len(stripped) + or error.msg.startswith("Unterminated string") + or ( + error.msg == "Invalid \\uXXXX escape" + and re.search(r"\\u[0-9a-fA-F]{0,3}$", stripped) is not None + ) + ) diff --git a/src/quantcockpit/ingestion/positions.py b/src/quantcockpit/ingestion/positions.py new file mode 100644 index 0000000..84ff130 --- /dev/null +++ b/src/quantcockpit/ingestion/positions.py @@ -0,0 +1,367 @@ +"""仓位文件的只读预览与规范事件构造。""" + +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from dataclasses import dataclass +from datetime import datetime, timezone +from pathlib import Path +from typing import Literal, cast + +from pydantic import TypeAdapter, ValidationError + +from quantcockpit.ingestion.position_profile import ( + FieldBinding, + MappingValueError, + PositionMappingProfile, + profile_hash, + resolve_binding, +) +from quantcockpit.ingestion.position_sources import SourceReadError, SourceRecord, read_source +from quantcockpit.models import EventRecord, PositionDecimal + + +MAX_POSITIONS_PER_SNAPSHOT = 100_000 +_MEASURE_FIELDS = ("quantity", "weight", "market_value_base", "exposure_value_base") +_POSITION_DECIMAL_ADAPTER = TypeAdapter(PositionDecimal) + + +class PositionImportError(ValueError): + """可供 CLI 安全展示的仓位预览错误。""" + + def __init__(self, code: str, message: str, *, line_number: int | None = None) -> None: + self.code = code + self.line_number = line_number + location = "" if line_number is None else f" at line {line_number}" + super().__init__(f"{code}{location}: {message}") + + +@dataclass(frozen=True) +class NormalizedSnapshot: + event: EventRecord + raw_json: str + start_line: int + end_line: int + recorded_at_source: Literal["mapped", "import_observed_at"] + + +@dataclass(frozen=True) +class PositionPreview: + format: str + record_count: int + snapshot_count: int + source_fields: tuple[str, ...] + sample_positions: tuple[dict[str, object], ...] + snapshots: tuple[NormalizedSnapshot, ...] + mapping_profile_hash: str + warnings: tuple[dict[str, object], ...] + + +@dataclass +class _SnapshotGroup: + metadata: dict[str, object] + positions: list[dict[str, object]] + records: list[SourceRecord] + + +def preview_positions( + path: str | Path, + profile: PositionMappingProfile, + *, + observed_at: datetime, +) -> PositionPreview: + """完整校验仓位文件并返回只读预览;本函数没有持久化入口。""" + + if observed_at.tzinfo is None or observed_at.utcoffset() is None: + raise ValueError("observed_at must be timezone-aware") + observed_at = observed_at.astimezone(timezone.utc) + try: + records = tuple(read_source(path, profile)) + if profile.layout == "document_snapshot": + snapshots = _preview_documents(records, profile, observed_at) + else: + snapshots = _preview_tabular(records, profile, observed_at) + except PositionImportError: + raise + except SourceReadError as error: + raise PositionImportError(error.code, "source file could not be read safely", line_number=error.line_number) from error + except MappingValueError as error: + raise PositionImportError(error.code, "configured source value could not be mapped") from error + + source_fields = tuple(sorted({key for record in records for key in record.value})) + samples: list[dict[str, object]] = [] + for snapshot in snapshots: + payload = snapshot.event.payload + if payload.event_type != "position_snapshot": + raise AssertionError("position preview created a non-position event") + for position in payload.positions: + if len(samples) == 5: + break + samples.append(position.model_dump(mode="json", exclude_none=True)) + if len(samples) == 5: + break + return PositionPreview( + format=profile.format, + record_count=len(records), + snapshot_count=len(snapshots), + source_fields=source_fields, + sample_positions=tuple(samples), + snapshots=snapshots, + mapping_profile_hash=profile_hash(profile), + warnings=(), + ) + + +def _preview_documents( + records: tuple[SourceRecord, ...], + profile: PositionMappingProfile, + observed_at: datetime, +) -> tuple[NormalizedSnapshot, ...]: + if not records: + raise PositionImportError("empty_input", "document source contains no snapshot") + snapshots: list[NormalizedSnapshot] = [] + for record in records: + if profile.positions_path is None: + raise AssertionError("validated document profile is missing positions_path") + metadata = _resolve_metadata(profile, record.value, observed_at, line_number=record.start_line) + try: + raw_positions = resolve_binding( + FieldBinding(path=profile.positions_path), + record.value, + format=profile.format, + ) + except MappingValueError as error: + raise PositionImportError(error.code, "positions array path could not be mapped") from error + if not isinstance(raw_positions, Sequence) or isinstance(raw_positions, (str, bytes, bytearray)): + raise PositionImportError( + "invalid_json_layout", + "document positions path must resolve to an array", + line_number=record.start_line, + ) + if len(raw_positions) > MAX_POSITIONS_PER_SNAPSHOT: + raise PositionImportError( + "ingestion_limit_exceeded", + "snapshot exceeds the position limit", + line_number=record.start_line, + ) + positions = [ + _resolve_position(profile, _require_mapping(item, record.start_line), record.start_line) + for item in raw_positions + ] + snapshots.append( + _build_snapshot( + metadata, + positions, + raw_json=record.raw_json, + start_line=record.start_line, + end_line=record.end_line, + mapping_hash=profile_hash(profile), + ) + ) + return tuple(snapshots) + + +def _preview_tabular( + records: tuple[SourceRecord, ...], + profile: PositionMappingProfile, + observed_at: datetime, +) -> tuple[NormalizedSnapshot, ...]: + if not records: + if profile.snapshot_scope != "whole_file" or any( + profile.fields[name].literal is None + for name in ("strategy_id", "environment", "source", "portfolio_id", "snapshot_time") + ): + raise PositionImportError("empty_input", "tabular source contains no position rows") + metadata = _resolve_metadata(profile, {}, observed_at, line_number=1) + return ( + _build_snapshot( + metadata, + [], + raw_json="[]", + start_line=1, + end_line=1, + mapping_hash=profile_hash(profile), + ), + ) + + groups: dict[tuple[object, ...], _SnapshotGroup] = {} + whole_file_key: tuple[object, ...] | None = None + for record in records: + metadata = _resolve_metadata(profile, record.value, observed_at, line_number=record.start_line) + identity = tuple( + metadata[name] + for name in ("strategy_id", "environment", "source", "portfolio_id", "snapshot_time") + ) + if profile.snapshot_scope == "whole_file": + if whole_file_key is None: + whole_file_key = identity + elif identity != whole_file_key: + raise PositionImportError( + "snapshot_identity_conflict", + "whole-file snapshot contains conflicting identity fields", + line_number=record.start_line, + ) + group = groups.get(identity) + if group is None: + group = _SnapshotGroup(metadata=metadata, positions=[], records=[]) + groups[identity] = group + elif any( + group.metadata.get(name) != metadata.get(name) + for name in ("base_currency", "recorded_at") + ): + raise PositionImportError( + "snapshot_identity_conflict", + "snapshot group contains conflicting metadata", + line_number=record.start_line, + ) + group.positions.append(_resolve_position(profile, record.value, record.start_line)) + group.records.append(record) + if len(group.positions) > MAX_POSITIONS_PER_SNAPSHOT: + raise PositionImportError( + "ingestion_limit_exceeded", + "snapshot exceeds the position limit", + line_number=record.start_line, + ) + + snapshots = [ + _build_snapshot( + group.metadata, + group.positions, + raw_json=f"[{','.join(record.raw_json for record in group.records)}]", + start_line=group.records[0].start_line, + end_line=group.records[-1].end_line, + mapping_hash=profile_hash(profile), + ) + for group in groups.values() + ] + return tuple(snapshots) + + +def _resolve_metadata( + profile: PositionMappingProfile, + record: Mapping[str, object], + observed_at: datetime, + *, + line_number: int, +) -> dict[str, object]: + try: + metadata: dict[str, object] = { + str(name): resolve_binding(binding, record, format=profile.format) + for name, binding in profile.fields.items() + } + except MappingValueError as error: + raise PositionImportError(error.code, "snapshot metadata could not be mapped", line_number=line_number) from error + snapshot_time = metadata.get("snapshot_time") + if not isinstance(snapshot_time, datetime): + raise PositionImportError( + "mapping_timestamp_invalid", + "snapshot_time must use utc_timestamp transform", + line_number=line_number, + ) + recorded_at = metadata.get("recorded_at") + if recorded_at is None: + metadata["recorded_at"] = observed_at + metadata["recorded_at_source"] = "import_observed_at" + elif isinstance(recorded_at, datetime): + metadata["recorded_at_source"] = "mapped" + else: + raise PositionImportError( + "mapping_timestamp_invalid", + "recorded_at must use utc_timestamp transform", + line_number=line_number, + ) + return metadata + + +def _resolve_position( + profile: PositionMappingProfile, + record: Mapping[str, object], + line_number: int, +) -> dict[str, object]: + try: + position: dict[str, object] = { + str(name): resolve_binding(binding, record, format=profile.format) + for name, binding in profile.position_fields.items() + } + except MappingValueError as error: + raise PositionImportError(error.code, "position field could not be mapped", line_number=line_number) from error + side = position.get("side") + if side is not None and side not in {"long", "short"}: + raise PositionImportError( + "mapping_value_invalid", + "position side must normalize to long or short", + line_number=line_number, + ) + for name in _MEASURE_FIELDS: + if name not in position: + continue + try: + measure = _POSITION_DECIMAL_ADAPTER.validate_python(position[name]) + except ValidationError as error: + raise PositionImportError( + "mapping_decimal_invalid", + "position measure is not a valid fixed-point decimal", + line_number=line_number, + ) from error + position[name] = -measure if side == "short" and measure > 0 else measure + return position + + +def _build_snapshot( + metadata: Mapping[str, object], + positions: list[dict[str, object]], + *, + raw_json: str, + start_line: int, + end_line: int, + mapping_hash: str, +) -> NormalizedSnapshot: + payload: dict[str, object] = { + "event_type": "position_snapshot", + "portfolio_id": metadata["portfolio_id"], + "mapping_profile_hash": mapping_hash, + "positions": positions, + } + if "base_currency" in metadata: + payload["base_currency"] = metadata["base_currency"] + event_data = { + "schema_version": "1.1", + "strategy_id": metadata["strategy_id"], + "environment": metadata["environment"], + "event_type": "position_snapshot", + "event_time": metadata["snapshot_time"], + "recorded_at": metadata["recorded_at"], + "source": metadata["source"], + "payload": payload, + } + try: + event = EventRecord.model_validate(event_data) + except ValidationError as error: + safe_errors = error.errors(include_input=False, include_context=False, include_url=False) + duplicate = any("duplicate instrument" in item["msg"] for item in safe_errors) + raise PositionImportError( + "duplicate_instrument" if duplicate else "contract_invalid", + "normalized snapshot does not satisfy the position contract", + line_number=start_line, + ) from error + recorded_at_source = cast( + Literal["mapped", "import_observed_at"], + metadata["recorded_at_source"], + ) + return NormalizedSnapshot( + event=event, + raw_json=raw_json, + start_line=start_line, + end_line=end_line, + recorded_at_source=recorded_at_source, + ) + + +def _require_mapping(value: object, line_number: int) -> Mapping[str, object]: + if not isinstance(value, dict) or any(not isinstance(key, str) for key in value): + raise PositionImportError( + "invalid_json_layout", + "document positions must contain JSON objects", + line_number=line_number, + ) + return cast(dict[str, object], value) diff --git a/tests/test_position_preview.py b/tests/test_position_preview.py new file mode 100644 index 0000000..f36eaec --- /dev/null +++ b/tests/test_position_preview.py @@ -0,0 +1,178 @@ +from datetime import datetime, timezone +from decimal import Decimal +from pathlib import Path + +import pytest + +from quantcockpit.ingestion.position_profile import PositionMappingProfile +from quantcockpit.ingestion.positions import NormalizedSnapshot, PositionImportError, preview_positions +from quantcockpit.models import PositionSnapshotPayload + + +UTC_NOW = datetime(2026, 7, 20, 10, 0, tzinfo=timezone.utc) + + +def csv_profile(*, scope: str = "grouped_rows") -> PositionMappingProfile: + return PositionMappingProfile.model_validate( + { + "profile_version": "1.0", + "name": "test-position-csv", + "format": "csv", + "layout": "tabular_snapshot", + "snapshot_scope": scope, + "fields": { + "strategy_id": {"literal": "alpha"}, + "environment": {"literal": "paper"}, + "source": {"literal": "broker-export"}, + "portfolio_id": {"path": "account", "transforms": ["trim"]}, + "snapshot_time": {"path": "as_of", "transforms": ["utc_timestamp"]}, + "base_currency": {"literal": "USD"}, + }, + "position_fields": { + "instrument_id": {"path": "symbol", "transforms": ["trim"]}, + "instrument_id_type": {"literal": "ticker"}, + "side": {"path": "side", "transforms": ["trim", "lowercase"]}, + "weight": {"path": "weight", "transforms": ["decimal"]}, + }, + } + ) + + +def write_csv(tmp_path: Path, body: str) -> Path: + path = tmp_path / "positions.csv" + path.write_text(body, encoding="utf-8") + return path + + +def snapshot_payload(snapshot: NormalizedSnapshot) -> PositionSnapshotPayload: + payload = snapshot.event.payload + assert isinstance(payload, PositionSnapshotPayload) + return payload + + +def test_preview_normalizes_short_side_without_database_access(tmp_path: Path) -> None: + result = preview_positions( + write_csv( + tmp_path, + "account,as_of,symbol,side,weight\n" + " private-book ,2026-07-20T09:30:00Z,AAPL,SHORT,0.25\n", + ), + csv_profile(), + observed_at=UTC_NOW, + ) + + snapshot = result.snapshots[0] + assert snapshot_payload(snapshot).positions[0].weight == Decimal("-0.25") + assert snapshot.event.event_time == datetime(2026, 7, 20, 9, 30, tzinfo=timezone.utc) + assert snapshot.event.recorded_at == UTC_NOW + assert snapshot.recorded_at_source == "import_observed_at" + assert result.sample_positions[0]["instrument_id"] == "AAPL" + assert "portfolio_id" not in result.sample_positions[0] + assert len(result.mapping_profile_hash) == 71 + + +def test_preview_groups_rows_by_strict_snapshot_identity(tmp_path: Path) -> None: + result = preview_positions( + write_csv( + tmp_path, + "account,as_of,symbol,side,weight\n" + "book-a,2026-07-20T09:30:00Z,AAPL,long,0.5\n" + "book-a,2026-07-20T09:30:00Z,MSFT,long,0.5\n" + "book-b,2026-07-20T09:30:00Z,AAPL,long,1\n", + ), + csv_profile(), + observed_at=UTC_NOW, + ) + + assert result.record_count == 3 + assert result.snapshot_count == 2 + assert [len(snapshot_payload(item).positions) for item in result.snapshots] == [2, 1] + + +def test_whole_file_scope_rejects_conflicting_identity(tmp_path: Path) -> None: + with pytest.raises(PositionImportError) as captured: + preview_positions( + write_csv( + tmp_path, + "account,as_of,symbol,side,weight\n" + "book-a,2026-07-20T09:30:00Z,AAPL,long,1\n" + "book-b,2026-07-20T09:30:00Z,MSFT,long,1\n", + ), + csv_profile(scope="whole_file"), + observed_at=UTC_NOW, + ) + assert captured.value.code == "snapshot_identity_conflict" + + +def test_empty_grouped_file_is_not_silently_treated_as_empty_portfolio(tmp_path: Path) -> None: + with pytest.raises(PositionImportError) as captured: + preview_positions( + write_csv(tmp_path, "account,as_of,symbol,side,weight\n"), + csv_profile(), + observed_at=UTC_NOW, + ) + assert captured.value.code == "empty_input" + + +def test_document_snapshot_accepts_explicit_empty_positions(tmp_path: Path) -> None: + path = tmp_path / "positions.json" + path.write_text( + '{"strategy":"alpha","environment":"paper","source":"broker-export",' + '"portfolio":"book-a","as_of":"2026-07-20T09:30:00Z","positions":[]}', + encoding="utf-8", + ) + profile = PositionMappingProfile.model_validate( + { + "profile_version": "1.0", + "name": "document-snapshot", + "format": "json", + "layout": "document_snapshot", + "snapshot_scope": "whole_file", + "positions_path": "/positions", + "fields": { + "strategy_id": {"path": "/strategy"}, + "environment": {"path": "/environment"}, + "source": {"path": "/source"}, + "portfolio_id": {"path": "/portfolio"}, + "snapshot_time": {"path": "/as_of", "transforms": ["utc_timestamp"]}, + }, + "position_fields": { + "instrument_id": {"path": "/symbol"}, + "weight": {"path": "/weight", "transforms": ["decimal"]}, + }, + } + ) + + result = preview_positions(path, profile, observed_at=UTC_NOW) + + assert result.snapshot_count == 1 + assert snapshot_payload(result.snapshots[0]).positions == () + + +def test_preview_returns_at_most_five_normalized_samples(tmp_path: Path) -> None: + rows = "".join( + f"book-a,2026-07-20T09:30:00Z,SYM{index},long,0.1\n" for index in range(6) + ) + result = preview_positions( + write_csv(tmp_path, "account,as_of,symbol,side,weight\n" + rows), + csv_profile(), + observed_at=UTC_NOW, + ) + + assert len(result.sample_positions) == 5 + + +def test_preview_rejects_duplicate_instrument_as_an_atomic_snapshot(tmp_path: Path) -> None: + with pytest.raises(PositionImportError) as captured: + preview_positions( + write_csv( + tmp_path, + "account,as_of,symbol,side,weight\n" + "book-a,2026-07-20T09:30:00Z,AAPL,long,0.5\n" + "book-a,2026-07-20T09:30:00Z,AAPL,long,0.5\n", + ), + csv_profile(), + observed_at=UTC_NOW, + ) + assert captured.value.code == "duplicate_instrument" + assert str(tmp_path) not in str(captured.value) diff --git a/tests/test_position_sources.py b/tests/test_position_sources.py new file mode 100644 index 0000000..39debfb --- /dev/null +++ b/tests/test_position_sources.py @@ -0,0 +1,120 @@ +from pathlib import Path + +import pytest + +from quantcockpit.ingestion.position_profile import PositionMappingProfile +from quantcockpit.ingestion.position_sources import SourceReadError, read_source + + +def profile(format: str, *, layout: str = "tabular_snapshot") -> PositionMappingProfile: + json_path = format != "csv" + prefix = "/" if json_path else "" + data: dict[str, object] = { + "profile_version": "1.0", + "name": f"test-{format}", + "format": format, + "layout": layout, + "snapshot_scope": "grouped_rows", + "fields": { + "strategy_id": {"literal": "alpha"}, + "environment": {"literal": "paper"}, + "source": {"literal": "test-export"}, + "portfolio_id": {"literal": "book-a"}, + "snapshot_time": {"literal": "2026-07-20T09:30:00Z", "transforms": ["utc_timestamp"]}, + }, + "position_fields": { + "instrument_id": {"path": f"{prefix}symbol"}, + "weight": {"path": f"{prefix}weight", "transforms": ["decimal"]}, + }, + } + if layout == "document_snapshot": + data["positions_path"] = "/positions" + data["snapshot_scope"] = "whole_file" + return PositionMappingProfile.model_validate(data) + + +def test_csv_reader_preserves_multiline_record_line_range(tmp_path: Path) -> None: + path = tmp_path / "positions.csv" + path.write_text('symbol,weight,note\nAAPL,0.5,"line one\nline two"\n', encoding="utf-8") + + rows = list(read_source(path, profile("csv"))) + + assert [(row.start_line, row.end_line, row.value["symbol"]) for row in rows] == [ + (2, 3, "AAPL") + ] + + +def test_source_larger_than_100_mib_is_rejected_before_parse(tmp_path: Path) -> None: + path = tmp_path / "large.json" + with path.open("wb") as file: + file.truncate(100 * 1024 * 1024 + 1) + + with pytest.raises(SourceReadError) as captured: + list(read_source(path, profile("json"))) + assert captured.value.code == "ingestion_limit_exceeded" + + +def test_jsonl_record_larger_than_one_mib_is_rejected(tmp_path: Path) -> None: + path = tmp_path / "positions.jsonl" + path.write_text('{"symbol":"' + ("A" * (1024 * 1024)) + '","weight":"1"}\n', encoding="utf-8") + + with pytest.raises(SourceReadError) as captured: + list(read_source(path, profile("jsonl"))) + assert captured.value.code == "ingestion_limit_exceeded" + assert captured.value.line_number == 1 + + +def test_jsonl_incomplete_tail_has_distinct_error(tmp_path: Path) -> None: + path = tmp_path / "positions.jsonl" + path.write_text('{"symbol":"AAPL","weight":"1"}\n{"symbol":', encoding="utf-8") + + with pytest.raises(SourceReadError) as captured: + list(read_source(path, profile("jsonl"))) + assert captured.value.code == "incomplete_tail" + assert captured.value.line_number == 2 + + +def test_json_document_and_tabular_array_have_explicit_record_boundaries(tmp_path: Path) -> None: + document = tmp_path / "snapshot.json" + document.write_text('{"positions":[{"symbol":"AAPL","weight":"1"}]}', encoding="utf-8") + tabular = tmp_path / "rows.json" + tabular.write_text('[{"symbol":"AAPL","weight":"1"},{"symbol":"MSFT","weight":"-1"}]', encoding="utf-8") + + document_rows = list(read_source(document, profile("json", layout="document_snapshot"))) + tabular_rows = list(read_source(tabular, profile("json"))) + + assert len(document_rows) == 1 + assert len(tabular_rows) == 2 + assert tabular_rows[1].value["symbol"] == "MSFT" + + +def test_source_extension_must_match_declared_format(tmp_path: Path) -> None: + path = tmp_path / "positions.csv" + path.write_text("symbol,weight\nAAPL,1\n", encoding="utf-8") + + with pytest.raises(SourceReadError) as captured: + list(read_source(path, profile("json"))) + assert captured.value.code == "unsupported_input_format" + + +def test_csv_duplicate_or_blank_headers_are_rejected_instead_of_overwritten(tmp_path: Path) -> None: + duplicate = tmp_path / "duplicate.csv" + duplicate.write_text("symbol,symbol,weight\nAAPL,MSFT,1\n", encoding="utf-8") + blank = tmp_path / "blank.csv" + blank.write_text("symbol,,weight\nAAPL,ignored,1\n", encoding="utf-8") + + for path in (duplicate, blank): + with pytest.raises(SourceReadError) as captured: + list(read_source(path, profile("csv"))) + assert captured.value.code == "invalid_tabular_header" + + +def test_source_errors_do_not_include_raw_values_or_absolute_paths(tmp_path: Path) -> None: + path = tmp_path / "secret-account.jsonl" + path.write_text('{"account":"REAL-ACCOUNT-123"', encoding="utf-8") + + with pytest.raises(SourceReadError) as captured: + list(read_source(path, profile("jsonl"))) + message = str(captured.value) + assert "REAL-ACCOUNT-123" not in message + assert str(tmp_path) not in message From 69d1a84584855d477b9ef52633b2f07122b986ff Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:49:32 +0800 Subject: [PATCH 07/18] feat: import versioned position snapshots --- scripts/import_positions.py | 99 ++++++++++++++++++ src/quantcockpit/ingestion/positions.py | 84 ++++++++++++++- src/quantcockpit/store.py | 23 ++++- tests/test_position_ingestion.py | 130 ++++++++++++++++++++++++ tests/test_scripts.py | 89 ++++++++++++++++ 5 files changed, 419 insertions(+), 6 deletions(-) create mode 100644 scripts/import_positions.py create mode 100644 tests/test_position_ingestion.py diff --git a/scripts/import_positions.py b/scripts/import_positions.py new file mode 100644 index 0000000..f786852 --- /dev/null +++ b/scripts/import_positions.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +"""预览或导入一份声明式映射的本地仓位文件。""" + +from __future__ import annotations + +import argparse +from datetime import datetime, timezone +import json +import os +from pathlib import Path +import sys +from typing import Sequence + +from pydantic import ValidationError + +from quantcockpit.ingestion.position_profile import PositionMappingProfile +from quantcockpit.ingestion.positions import PositionImportError, import_positions, preview_positions +from quantcockpit.store import DuckDBStore + + +def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--input", type=Path, required=True, help="本地 CSV、JSON 或 JSONL 文件") + parser.add_argument("--profile", type=Path, required=True, help="映射配置 JSON") + parser.add_argument( + "--database", + default=os.environ.get("QUANTCOCKPIT_DB_PATH", "quantcockpit.duckdb"), + help="正式导入目标 DuckDB;preview 不会创建它", + ) + parser.add_argument("--preview", action="store_true", help="只校验并输出安全预览") + parser.add_argument("--observed-at", help="可选的带时区 RFC 3339 观察时间") + return parser.parse_args(argv) + + +def _observed_at(value: str | None) -> datetime: + if value is None: + return datetime.now(timezone.utc) + try: + parsed = datetime.fromisoformat(value.replace("Z", "+00:00")) + except ValueError as error: + raise ValueError("observed_at must be a timezone-aware RFC 3339 timestamp") from error + if parsed.tzinfo is None or parsed.utcoffset() is None: + raise ValueError("observed_at must include a timezone") + return parsed.astimezone(timezone.utc) + + +def _load_profile(path: Path) -> PositionMappingProfile: + try: + decoded = json.loads(path.read_text(encoding="utf-8")) + return PositionMappingProfile.model_validate(decoded) + except (OSError, UnicodeError, json.JSONDecodeError, ValidationError) as error: + raise ValueError("mapping profile is unreadable or invalid") from error + + +def _preview_payload(preview: object) -> dict[str, object]: + from quantcockpit.ingestion.positions import PositionPreview + + if not isinstance(preview, PositionPreview): + raise TypeError("preview must be a PositionPreview") + return { + "format": preview.format, + "record_count": preview.record_count, + "snapshot_count": preview.snapshot_count, + "source_fields": list(preview.source_fields), + "sample_positions": list(preview.sample_positions), + "mapping_profile_hash": preview.mapping_profile_hash, + "warnings": list(preview.warnings), + } + + +def main(argv: Sequence[str] | None = None) -> int: + args = parse_args(argv) + try: + observed_at = _observed_at(args.observed_at) + profile = _load_profile(args.profile) + if args.preview: + preview = preview_positions(args.input, profile, observed_at=observed_at) + print(json.dumps(_preview_payload(preview), ensure_ascii=False, sort_keys=True)) + return 0 + store = DuckDBStore(args.database) + try: + result = import_positions(store, args.input, profile, observed_at=observed_at) + finally: + store.close() + except PositionImportError as error: + print(f"导入失败 [{error.code}]:{error}", file=sys.stderr) + return 1 + except ValueError as error: + print(f"导入失败:{error}", file=sys.stderr) + return 1 + print( + f"imported={result.imported} duplicates={result.duplicates} " + f"revisions={result.revisions} stale={result.stale}" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/quantcockpit/ingestion/positions.py b/src/quantcockpit/ingestion/positions.py index 84ff130..8a07657 100644 --- a/src/quantcockpit/ingestion/positions.py +++ b/src/quantcockpit/ingestion/positions.py @@ -6,7 +6,7 @@ from dataclasses import dataclass from datetime import datetime, timezone from pathlib import Path -from typing import Literal, cast +from typing import TYPE_CHECKING, Literal, cast from pydantic import TypeAdapter, ValidationError @@ -20,6 +20,9 @@ from quantcockpit.ingestion.position_sources import SourceReadError, SourceRecord, read_source from quantcockpit.models import EventRecord, PositionDecimal +if TYPE_CHECKING: + from quantcockpit.store import DuckDBStore + MAX_POSITIONS_PER_SNAPSHOT = 100_000 _MEASURE_FIELDS = ("quantity", "weight", "market_value_base", "exposure_value_base") @@ -57,6 +60,15 @@ class PositionPreview: warnings: tuple[dict[str, object], ...] +@dataclass(frozen=True) +class PositionImportResult: + imported: int = 0 + duplicates: int = 0 + revisions: int = 0 + stale: int = 0 + rejected_snapshots: int = 0 + + @dataclass class _SnapshotGroup: metadata: dict[str, object] @@ -112,6 +124,76 @@ def preview_positions( ) +def import_positions( + store: DuckDBStore, + path: str | Path, + profile: PositionMappingProfile, + *, + observed_at: datetime | None = None, +) -> PositionImportResult: + """先完整预览,再把每个合法快照写入现有版本化事件存储。""" + + observed = observed_at or datetime.now(timezone.utc) + if observed.tzinfo is None or observed.utcoffset() is None: + raise ValueError("observed_at must be timezone-aware") + observed = observed.astimezone(timezone.utc) + source_path = Path(path) + run_id = store.begin_run(source_path, observed) + try: + preview = preview_positions(source_path, profile, observed_at=observed) + except PositionImportError as error: + store.fail_run(run_id, observed, error_code=error.code, error_message=str(error)) + raise + except Exception as error: + store.fail_run( + run_id, + observed, + error_code="processing_error", + error_message="position preview failed", + ) + raise + + counts = {"imported": 0, "duplicates": 0, "revisions": 0, "stale": 0} + try: + for snapshot in preview.snapshots: + disposition = store.record_event( + snapshot.event, + raw_json=snapshot.raw_json, + source_file=source_path, + line_number=snapshot.start_line, + end_line_number=snapshot.end_line, + observed_at=observed, + ignore_recorded_at_for_content=( + snapshot.recorded_at_source == "import_observed_at" + ), + ) + count_key = {"revision": "revisions", "duplicate": "duplicates"}.get( + disposition, + disposition, + ) + counts[count_key] += 1 + except Exception: + store.fail_run( + run_id, + observed, + error_code="processing_error", + error_message="position persistence failed", + ) + raise + store.finish_run( + run_id, + observed, + imported=counts["imported"], + duplicates=counts["duplicates"], + revisions=counts["revisions"], + stale=counts["stale"], + quarantined=0, + incomplete_tail=0, + blank=0, + ) + return PositionImportResult(**counts) + + def _preview_documents( records: tuple[SourceRecord, ...], profile: PositionMappingProfile, diff --git a/src/quantcockpit/store.py b/src/quantcockpit/store.py index 4a2551b..598eea8 100644 --- a/src/quantcockpit/store.py +++ b/src/quantcockpit/store.py @@ -93,6 +93,7 @@ def _create_schema(self) -> None: raw_json VARCHAR NOT NULL, source_file VARCHAR NOT NULL, line_number INTEGER NOT NULL, + end_line_number INTEGER NOT NULL, event_time TIMESTAMPTZ NOT NULL, recorded_at TIMESTAMPTZ NOT NULL, first_observed_at TIMESTAMPTZ NOT NULL, @@ -145,6 +146,10 @@ def _create_schema(self) -> None: ) self.connection.execute("UPDATE quarantine SET is_active = TRUE WHERE is_active IS NULL") self.connection.execute("ALTER TABLE quarantine ADD COLUMN IF NOT EXISTS resolved_at TIMESTAMPTZ") + self.connection.execute("ALTER TABLE events ADD COLUMN IF NOT EXISTS end_line_number INTEGER") + self.connection.execute( + "UPDATE events SET end_line_number = line_number WHERE end_line_number IS NULL" + ) def begin_run(self, source_file: Path, observed_at: datetime) -> str: run_id = str(uuid4()) @@ -198,12 +203,19 @@ def record_event( raw_json: str, source_file: Path, line_number: int, + end_line_number: int | None = None, observed_at: datetime, + ignore_recorded_at_for_content: bool = False, ) -> str: """保存事件并返回 imported、duplicate、revision 或 stale。""" - normalized_json = json.dumps(event.model_dump(mode="json"), sort_keys=True, separators=(",", ":")) - content_hash = sha256(normalized_json.encode("utf-8")).hexdigest() + normalized_data = event.model_dump(mode="json") + normalized_json = json.dumps(normalized_data, sort_keys=True, separators=(",", ":")) + content_data = dict(normalized_data) + if ignore_recorded_at_for_content: + content_data.pop("recorded_at", None) + content_json = json.dumps(content_data, sort_keys=True, separators=(",", ":")) + content_hash = sha256(content_json.encode("utf-8")).hexdigest() matching = self.connection.execute( """ SELECT event_id FROM events @@ -243,13 +255,14 @@ def record_event( """ INSERT INTO events( event_id, idempotency_key, revision, normalized_json, raw_json, - source_file, line_number, event_time, recorded_at, first_observed_at, + source_file, line_number, end_line_number, event_time, recorded_at, first_observed_at, last_observed_at, content_hash, is_current - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, TRUE) + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, TRUE) """, [ str(uuid4()), event.idempotency_key, revision, normalized_json, raw_json, - str(source_file.resolve()), line_number, event.event_time, event.recorded_at, observed_at, + str(source_file.resolve()), line_number, end_line_number or line_number, + event.event_time, event.recorded_at, observed_at, observed_at, content_hash, ], ) diff --git a/tests/test_position_ingestion.py b/tests/test_position_ingestion.py new file mode 100644 index 0000000..0efc464 --- /dev/null +++ b/tests/test_position_ingestion.py @@ -0,0 +1,130 @@ +from datetime import datetime, timezone +from pathlib import Path + +import pytest + +from quantcockpit.ingestion.position_profile import PositionMappingProfile +from quantcockpit.ingestion.positions import PositionImportError, import_positions +from quantcockpit.store import DuckDBStore + + +FIRST_SEEN = datetime(2026, 7, 20, 10, 0, tzinfo=timezone.utc) +SECOND_SEEN = datetime(2026, 7, 20, 11, 0, tzinfo=timezone.utc) + + +def profile() -> PositionMappingProfile: + return PositionMappingProfile.model_validate( + { + "profile_version": "1.0", + "name": "position-import-test", + "format": "csv", + "layout": "tabular_snapshot", + "snapshot_scope": "grouped_rows", + "fields": { + "strategy_id": {"literal": "alpha"}, + "environment": {"literal": "paper"}, + "source": {"literal": "broker-export"}, + "portfolio_id": {"path": "account"}, + "snapshot_time": {"path": "as_of", "transforms": ["utc_timestamp"]}, + "base_currency": {"literal": "USD"}, + }, + "position_fields": { + "instrument_id": {"path": "symbol"}, + "instrument_id_type": {"literal": "ticker"}, + "weight": {"path": "weight", "transforms": ["decimal"]}, + }, + } + ) + + +def write_positions(tmp_path: Path, *, weight: str = "1") -> Path: + path = tmp_path / "positions.csv" + path.write_text( + "account,as_of,symbol,weight\n" + f"book-a,2026-07-20T09:30:00Z,AAPL,{weight}\n", + encoding="utf-8", + ) + return path + + +def test_position_import_replay_is_duplicate_even_when_import_observed_at_changes( + tmp_path: Path, +) -> None: + store = DuckDBStore(tmp_path / "cockpit.duckdb") + path = write_positions(tmp_path) + + first = import_positions(store, path, profile(), observed_at=FIRST_SEEN) + duplicate = import_positions(store, path, profile(), observed_at=SECOND_SEEN) + + assert (first.imported, duplicate.duplicates) == (1, 1) + assert len(store.event_rows()) == 1 + + +def test_changed_position_content_creates_revision_and_preserves_line_range(tmp_path: Path) -> None: + store = DuckDBStore(tmp_path / "cockpit.duckdb") + path = write_positions(tmp_path, weight="0.5") + import_positions(store, path, profile(), observed_at=FIRST_SEEN) + path = write_positions(tmp_path, weight="0.6") + + revised = import_positions(store, path, profile(), observed_at=SECOND_SEEN) + + assert revised.revisions == 1 + rows = store.connection.execute( + "SELECT revision, is_current, line_number, end_line_number FROM events ORDER BY revision" + ).fetchall() + assert rows == [(1, False, 2, 2), (2, True, 2, 2)] + + +def test_invalid_snapshot_fails_run_without_writing_partial_event(tmp_path: Path) -> None: + store = DuckDBStore(tmp_path / "cockpit.duckdb") + path = tmp_path / "positions.csv" + path.write_text( + "account,as_of,symbol,weight\n" + "book-a,2026-07-20T09:30:00Z,AAPL,0.5\n" + "book-a,2026-07-20T09:30:00Z,AAPL,0.5\n", + encoding="utf-8", + ) + + with pytest.raises(PositionImportError) as captured: + import_positions(store, path, profile(), observed_at=FIRST_SEEN) + + assert captured.value.code == "duplicate_instrument" + assert store.event_rows() == [] + assert store.ingestion_runs()[0]["status"] == "failed" + assert store.ingestion_runs()[0]["error_code"] == "duplicate_instrument" + + +def test_position_import_stores_grouped_raw_evidence_as_bounded_json_array(tmp_path: Path) -> None: + store = DuckDBStore(tmp_path / "cockpit.duckdb") + path = tmp_path / "positions.csv" + path.write_text( + "account,as_of,symbol,weight\n" + "book-a,2026-07-20T09:30:00Z,AAPL,0.5\n" + "book-a,2026-07-20T09:30:00Z,MSFT,0.5\n", + encoding="utf-8", + ) + + result = import_positions(store, path, profile(), observed_at=FIRST_SEEN) + + assert result.imported == 1 + row = store.connection.execute( + "SELECT raw_json, line_number, end_line_number FROM events" + ).fetchone() + assert row is not None + raw_json, start_line, end_line = row + assert raw_json.startswith("[") and raw_json.endswith("]") + assert (start_line, end_line) == (2, 3) + + +def test_position_import_rejects_naive_observation_time_before_starting_run(tmp_path: Path) -> None: + store = DuckDBStore(tmp_path / "cockpit.duckdb") + + with pytest.raises(ValueError, match="timezone-aware"): + import_positions( + store, + write_positions(tmp_path), + profile(), + observed_at=datetime(2026, 7, 20, 10, 0), + ) + + assert store.ingestion_runs() == [] diff --git a/tests/test_scripts.py b/tests/test_scripts.py index 16a73a5..13c0cf7 100644 --- a/tests/test_scripts.py +++ b/tests/test_scripts.py @@ -3,6 +3,7 @@ from __future__ import annotations import subprocess +import json from pathlib import Path from datetime import datetime, timezone @@ -10,6 +11,50 @@ from quantcockpit.service import CockpitService +def write_position_cli_inputs(tmp_path: Path) -> tuple[Path, Path]: + input_path = tmp_path / "positions.csv" + input_path.write_text( + "account,as_of,symbol,weight\n" + "book-a,2026-07-20T09:30:00Z,AAPL,1\n", + encoding="utf-8", + ) + profile_path = tmp_path / "profile.json" + profile_path.write_text( + json.dumps( + { + "profile_version": "1.0", + "name": "cli-test", + "format": "csv", + "layout": "tabular_snapshot", + "snapshot_scope": "grouped_rows", + "fields": { + "strategy_id": {"literal": "alpha"}, + "environment": {"literal": "paper"}, + "source": {"literal": "broker-export"}, + "portfolio_id": {"path": "account"}, + "snapshot_time": {"path": "as_of", "transforms": ["utc_timestamp"]}, + }, + "position_fields": { + "instrument_id": {"path": "symbol"}, + "weight": {"path": "weight", "transforms": ["decimal"]}, + }, + } + ), + encoding="utf-8", + ) + return input_path, profile_path + + +def run_position_cli(*args: str) -> subprocess.CompletedProcess[str]: + return subprocess.run( + ["uv", "run", "scripts/import_positions.py", *args], + cwd=Path(__file__).parents[1], + capture_output=True, + text=True, + check=False, + ) + + def test_import_demo_script_imports_example_jsonl_into_explicit_database(tmp_path: Path) -> None: database_path = tmp_path / "demo.duckdb" @@ -50,3 +95,47 @@ def test_import_demo_script_imports_example_jsonl_into_explicit_database(tmp_pat assert correlations[0].result.reason is None finally: store.close() + + +def test_position_preview_cli_does_not_create_database_or_print_absolute_paths(tmp_path: Path) -> None: + input_path, profile_path = write_position_cli_inputs(tmp_path) + database = tmp_path / "must-not-exist.duckdb" + + result = run_position_cli( + "--input", + str(input_path), + "--profile", + str(profile_path), + "--database", + str(database), + "--preview", + "--observed-at", + "2026-07-20T10:00:00Z", + ) + + assert result.returncode == 0 + assert not database.exists() + body = json.loads(result.stdout) + assert body["snapshot_count"] == 1 + assert body["sample_positions"][0]["instrument_id"] == "AAPL" + assert str(tmp_path) not in result.stdout + + +def test_position_import_cli_writes_explicit_database_and_reports_counts(tmp_path: Path) -> None: + input_path, profile_path = write_position_cli_inputs(tmp_path) + database = tmp_path / "positions.duckdb" + + result = run_position_cli( + "--input", + str(input_path), + "--profile", + str(profile_path), + "--database", + str(database), + "--observed-at", + "2026-07-20T10:00:00Z", + ) + + assert result.returncode == 0 + assert database.exists() + assert "imported=1" in result.stdout From 017daee76408043e643fdaf8fcb981033baf52e4 Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:52:18 +0800 Subject: [PATCH 08/18] feat: calculate traceable position exposure --- src/quantcockpit/analysis/exposure.py | 266 ++++++++++++++++++++++++++ tests/test_exposure.py | 148 ++++++++++++++ 2 files changed, 414 insertions(+) create mode 100644 src/quantcockpit/analysis/exposure.py create mode 100644 tests/test_exposure.py diff --git a/src/quantcockpit/analysis/exposure.py b/src/quantcockpit/analysis/exposure.py new file mode 100644 index 0000000..f0b197d --- /dev/null +++ b/src/quantcockpit/analysis/exposure.py @@ -0,0 +1,266 @@ +"""基于规范仓位快照的确定性 Decimal 敞口分析。""" + +from __future__ import annotations + +from dataclasses import dataclass +from decimal import Context, Decimal, ROUND_HALF_EVEN, localcontext +from typing import Literal + +from quantcockpit.models import Position, PositionSnapshotPayload + + +Basis = Literal["weight", "market_value_base", "exposure_value_base"] +AnalysisState = Literal["ready", "unavailable", "empty_portfolio"] +_BASIS_PRIORITY: tuple[Basis, ...] = ( + "exposure_value_base", + "market_value_base", + "weight", +) +_LEVEL_BY_BASIS: dict[Basis, int] = { + "weight": 1, + "market_value_base": 2, + "exposure_value_base": 3, +} +_CATEGORY_NAMES = ("asset_class", "sector", "country") +_ANALYSIS_CONTEXT = Context(prec=38, rounding=ROUND_HALF_EVEN) +_RATIO_QUANTUM = Decimal("0.000000000000000001") + + +@dataclass(frozen=True) +class CategoryExposure: + label: str + gross: Decimal + net: Decimal + share: Decimal | None + + +@dataclass(frozen=True) +class ExposureAnalysis: + state: AnalysisState + level: int + basis: Basis | None + candidate_basis: Basis | None + position_count: int + zero_position_count: int + long_count: int + short_count: int + gross: Decimal | None + net: Decimal | None + top_1_share: Decimal | None + top_5_share: Decimal | None + hhi: Decimal | None + coverage_ratio: Decimal | None + coverage_by_basis: dict[Basis, Decimal | None] + categories: dict[str, tuple[CategoryExposure, ...]] + category_coverage: dict[str, Decimal | None] + reason: str | None + + +def analyze_exposure(snapshot: PositionSnapshotPayload) -> ExposureAnalysis: + """选择一个完整基础计算结果;绝不跨基础拼接仓位。""" + + with localcontext(_ANALYSIS_CONTEXT): + active = tuple(position for position in snapshot.positions if _is_active(position)) + zero_count = len(snapshot.positions) - len(active) + long_count = sum(_direction(position) > 0 for position in active) + short_count = sum(_direction(position) < 0 for position in active) + if not active: + return ExposureAnalysis( + state="empty_portfolio", + level=0, + basis=None, + candidate_basis=None, + position_count=len(snapshot.positions), + zero_position_count=zero_count, + long_count=0, + short_count=0, + gross=Decimal(0), + net=Decimal(0), + top_1_share=None, + top_5_share=None, + hhi=None, + coverage_ratio=None, + coverage_by_basis={basis: None for basis in _BASIS_PRIORITY}, + categories={name: () for name in _CATEGORY_NAMES}, + category_coverage={name: None for name in _CATEGORY_NAMES}, + reason="empty_portfolio", + ) + + active_count = Decimal(len(active)) + coverage_by_basis: dict[Basis, Decimal | None] = { + basis: _ratio( + Decimal(sum(_basis_value(position, basis) is not None for position in active)), + active_count, + ) + for basis in _BASIS_PRIORITY + } + category_coverage: dict[str, Decimal | None] = { + name: _ratio( + Decimal(sum(getattr(position, name) is not None for position in active)), + active_count, + ) + for name in _CATEGORY_NAMES + } + basis = next( + ( + candidate + for candidate in _BASIS_PRIORITY + if coverage_by_basis[candidate] == Decimal(1) + ), + None, + ) + if basis is None: + candidate_basis = _best_candidate(coverage_by_basis) + return ExposureAnalysis( + state="unavailable", + level=0, + basis=None, + candidate_basis=candidate_basis, + position_count=len(snapshot.positions), + zero_position_count=zero_count, + long_count=long_count, + short_count=short_count, + gross=None, + net=None, + top_1_share=None, + top_5_share=None, + hhi=None, + coverage_ratio=( + coverage_by_basis[candidate_basis] + if candidate_basis is not None + else Decimal(0) + ), + coverage_by_basis=coverage_by_basis, + categories={name: () for name in _CATEGORY_NAMES}, + category_coverage=category_coverage, + reason="incomplete_basis", + ) + + values = tuple(_required_basis_value(position, basis) for position in active) + absolute_values = tuple(abs(value) for value in values) + gross = sum(absolute_values, Decimal(0)) + net = sum(values, Decimal(0)) + if gross == 0: + top_1_share = None + top_5_share = None + hhi = None + reason = "zero_gross_exposure" + else: + ordered = sorted(absolute_values, reverse=True) + raw_shares = tuple(value / gross for value in absolute_values) + top_1_share = _rounded_ratio(ordered[0] / gross) + top_5_share = _rounded_ratio(sum(ordered[:5], Decimal(0)) / gross) + hhi = _rounded_ratio(sum((share * share for share in raw_shares), Decimal(0))) + reason = None + categories = { + name: _category_exposure(active, basis, name, gross) + for name in _CATEGORY_NAMES + } + return ExposureAnalysis( + state="ready", + level=_LEVEL_BY_BASIS[basis], + basis=basis, + candidate_basis=None, + position_count=len(snapshot.positions), + zero_position_count=zero_count, + long_count=long_count, + short_count=short_count, + gross=gross, + net=net, + top_1_share=top_1_share, + top_5_share=top_5_share, + hhi=hhi, + coverage_ratio=Decimal(1), + coverage_by_basis=coverage_by_basis, + categories=categories, + category_coverage=category_coverage, + reason=reason, + ) + + +def _is_active(position: Position) -> bool: + return any( + value is not None and value != 0 + for value in ( + position.quantity, + position.weight, + position.market_value_base, + position.exposure_value_base, + ) + ) + + +def _direction(position: Position) -> int: + for value in ( + position.quantity, + position.weight, + position.market_value_base, + position.exposure_value_base, + ): + if value is not None and value != 0: + return 1 if value > 0 else -1 + return 0 + + +def _basis_value(position: Position, basis: Basis) -> Decimal | None: + if basis == "weight": + return position.weight + if basis == "market_value_base": + return position.market_value_base + return position.exposure_value_base + + +def _required_basis_value(position: Position, basis: Basis) -> Decimal: + value = _basis_value(position, basis) + if value is None: + raise AssertionError("selected exposure basis is incomplete") + return value + + +def _best_candidate(coverage: dict[Basis, Decimal | None]) -> Basis | None: + best: Basis | None = None + best_coverage = Decimal(0) + for basis in _BASIS_PRIORITY: + value = coverage[basis] + if value is not None and value > best_coverage: + best = basis + best_coverage = value + return best + + +def _category_exposure( + positions: tuple[Position, ...], + basis: Basis, + category_name: str, + total_gross: Decimal, +) -> tuple[CategoryExposure, ...]: + buckets: dict[str, list[Decimal]] = {} + for position in positions: + label_value = getattr(position, category_name) + label = label_value if isinstance(label_value, str) else "unclassified" + buckets.setdefault(label, []).append(_required_basis_value(position, basis)) + result = [ + CategoryExposure( + label=label, + gross=sum((abs(value) for value in values), Decimal(0)), + net=sum(values, Decimal(0)), + share=( + _rounded_ratio(sum((abs(value) for value in values), Decimal(0)) / total_gross) + if total_gross != 0 + else None + ), + ) + for label, values in buckets.items() + ] + return tuple(sorted(result, key=lambda item: (-item.gross, item.label))) + + +def _ratio(numerator: Decimal, denominator: Decimal) -> Decimal: + return _rounded_ratio(numerator / denominator) + + +def _rounded_ratio(value: Decimal) -> Decimal: + rounded = value.quantize(_RATIO_QUANTUM, rounding=ROUND_HALF_EVEN) + if rounded == rounded.to_integral_value(): + return rounded.to_integral_value() + return rounded.normalize() diff --git a/tests/test_exposure.py b/tests/test_exposure.py new file mode 100644 index 0000000..bc3321d --- /dev/null +++ b/tests/test_exposure.py @@ -0,0 +1,148 @@ +from decimal import Decimal + +from quantcockpit.analysis.exposure import analyze_exposure +from quantcockpit.models import Position, PositionSnapshotPayload + + +def position(instrument_id: str, **values: object) -> Position: + return Position.model_validate( + {"instrument_id": instrument_id, "instrument_id_type": "ticker", **values} + ) + + +def snapshot(*positions: Position) -> PositionSnapshotPayload: + needs_currency = any( + item.market_value_base is not None or item.exposure_value_base is not None + for item in positions + ) + return PositionSnapshotPayload( + event_type="position_snapshot", + portfolio_id="book-a", + base_currency="USD" if needs_currency else None, + mapping_profile_hash=f"sha256:{'a' * 64}", + positions=positions, + ) + + +def test_exposure_prefers_complete_risk_basis_and_uses_decimal() -> None: + result = analyze_exposure( + snapshot( + position( + "A", + weight="0.6", + market_value_base="60", + exposure_value_base="120", + asset_class="equity", + ), + position( + "B", + weight="-0.4", + market_value_base="-40", + exposure_value_base="-80", + asset_class="equity", + ), + ) + ) + + assert result.state == "ready" + assert result.level == 3 + assert result.basis == "exposure_value_base" + assert result.gross == Decimal("200") + assert result.net == Decimal("40") + assert result.top_1_share == Decimal("0.6") + assert result.top_5_share == Decimal("1") + assert result.hhi == Decimal("0.52") + assert result.coverage_ratio == Decimal("1") + + +def test_incomplete_basis_returns_reason_instead_of_false_zero() -> None: + result = analyze_exposure( + snapshot(position("A", weight="0.5"), position("B", quantity="2")) + ) + + assert result.state == "unavailable" + assert result.gross is None + assert result.net is None + assert result.reason == "incomplete_basis" + assert result.candidate_basis == "weight" + assert result.coverage_ratio == Decimal("0.5") + assert result.coverage_by_basis["weight"] == Decimal("0.5") + + +def test_quantity_only_is_level_zero_without_a_candidate_value_basis() -> None: + result = analyze_exposure(snapshot(position("A", quantity="2"), position("B", quantity="-1"))) + + assert result.level == 0 + assert result.basis is None + assert result.candidate_basis is None + assert result.coverage_ratio == Decimal("0") + assert (result.long_count, result.short_count) == (1, 1) + + +def test_explicit_empty_portfolio_returns_real_zero_without_claiming_a_basis() -> None: + result = analyze_exposure(snapshot()) + + assert result.state == "empty_portfolio" + assert result.position_count == 0 + assert result.zero_position_count == 0 + assert result.gross == Decimal("0") + assert result.net == Decimal("0") + assert result.basis is None + assert result.top_1_share is None + assert result.hhi is None + assert all(value is None for value in result.coverage_by_basis.values()) + + +def test_zero_selected_exposure_has_zero_gross_reason_instead_of_dividing_by_zero() -> None: + result = analyze_exposure( + snapshot( + position("A", quantity="2", exposure_value_base="0"), + position("B", quantity="-1", exposure_value_base="0"), + ) + ) + + assert result.state == "ready" + assert result.basis == "exposure_value_base" + assert result.gross == Decimal("0") + assert result.net == Decimal("0") + assert result.top_1_share is None + assert result.top_5_share is None + assert result.hhi is None + assert result.reason == "zero_gross_exposure" + + +def test_top_five_and_categories_use_same_basis_with_unclassified_bucket() -> None: + positions = tuple( + position( + f"S{index}", + weight=str(value), + sector="Technology" if index < 2 else None, + country="US", + ) + for index, value in enumerate((6, 5, 4, 3, 2, -1)) + ) + result = analyze_exposure(snapshot(*positions)) + + assert result.gross == Decimal("21") + assert result.net == Decimal("19") + assert result.top_5_share == Decimal("0.952380952380952381") + sectors = {item.label: item for item in result.categories["sector"]} + assert sectors["Technology"].gross == Decimal("11") + assert sectors["unclassified"].gross == Decimal("10") + assert sectors["unclassified"].net == Decimal("8") + assert result.category_coverage["sector"] == Decimal("0.333333333333333333") + assert result.category_coverage["country"] == Decimal("1") + + +def test_zero_positions_are_counted_but_excluded_from_coverage_denominator() -> None: + result = analyze_exposure( + snapshot( + position("A", weight="1"), + position("B", quantity="0"), + ) + ) + + assert result.position_count == 2 + assert result.zero_position_count == 1 + assert result.coverage_by_basis["weight"] == Decimal("1") + assert result.gross == Decimal("1") From 5df5a10275b951f5a66b29291c333f697559888d Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:56:42 +0800 Subject: [PATCH 09/18] feat: expose portfolio coverage and exposure api --- frontend/openapi.json | 533 ++++++++++++++++++++++++++++++++ frontend/src/generated/api.ts | 214 +++++++++++++ src/quantcockpit/api.py | 45 ++- src/quantcockpit/api_models.py | 59 ++++ src/quantcockpit/service.py | 186 ++++++++++- src/quantcockpit/store.py | 48 +++ src/quantcockpit/store_types.py | 7 + tests/test_api.py | 184 +++++++++++ 8 files changed, 1274 insertions(+), 2 deletions(-) diff --git a/frontend/openapi.json b/frontend/openapi.json index da6e789..05577f7 100644 --- a/frontend/openapi.json +++ b/frontend/openapi.json @@ -1,6 +1,42 @@ { "components": { "schemas": { + "CategoryExposureResponse": { + "additionalProperties": false, + "properties": { + "gross": { + "title": "Gross", + "type": "string" + }, + "label": { + "title": "Label", + "type": "string" + }, + "net": { + "title": "Net", + "type": "string" + }, + "share": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Share" + } + }, + "required": [ + "label", + "gross", + "net", + "share" + ], + "title": "CategoryExposureResponse", + "type": "object" + }, "CorrelationEvidenceResponse": { "additionalProperties": false, "properties": { @@ -475,6 +511,411 @@ "title": "IngestionIssueResponse", "type": "object" }, + "PortfolioExposureResponse": { + "additionalProperties": false, + "properties": { + "age_seconds": { + "title": "Age Seconds", + "type": "integer" + }, + "analysis_state": { + "enum": [ + "ready", + "unavailable", + "empty_portfolio" + ], + "title": "Analysis State", + "type": "string" + }, + "base_currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Base Currency" + }, + "basis": { + "anyOf": [ + { + "enum": [ + "weight", + "market_value_base", + "exposure_value_base" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Basis" + }, + "candidate_basis": { + "anyOf": [ + { + "enum": [ + "weight", + "market_value_base", + "exposure_value_base" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Candidate Basis" + }, + "capability_level": { + "title": "Capability Level", + "type": "integer" + }, + "categories": { + "additionalProperties": { + "items": { + "$ref": "#/components/schemas/CategoryExposureResponse" + }, + "type": "array" + }, + "title": "Categories", + "type": "object" + }, + "category_coverage": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": "Category Coverage", + "type": "object" + }, + "coverage_by_basis": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "propertyNames": { + "enum": [ + "weight", + "market_value_base", + "exposure_value_base" + ] + }, + "title": "Coverage By Basis", + "type": "object" + }, + "coverage_ratio": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Coverage Ratio" + }, + "environment": { + "enum": [ + "live", + "paper" + ], + "title": "Environment", + "type": "string" + }, + "evidence_refs": { + "items": { + "type": "string" + }, + "title": "Evidence Refs", + "type": "array" + }, + "gross": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Gross" + }, + "hhi": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Hhi" + }, + "long_count": { + "title": "Long Count", + "type": "integer" + }, + "mapping_profile_hash": { + "title": "Mapping Profile Hash", + "type": "string" + }, + "net": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Net" + }, + "portfolio_id": { + "title": "Portfolio Id", + "type": "string" + }, + "position_count": { + "title": "Position Count", + "type": "integer" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reason" + }, + "short_count": { + "title": "Short Count", + "type": "integer" + }, + "snapshot_time": { + "title": "Snapshot Time", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "strategy_id": { + "title": "Strategy Id", + "type": "string" + }, + "top_1_share": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Top 1 Share" + }, + "top_5_share": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Top 5 Share" + }, + "zero_position_count": { + "title": "Zero Position Count", + "type": "integer" + } + }, + "required": [ + "portfolio_id", + "strategy_id", + "environment", + "source", + "snapshot_time", + "age_seconds", + "base_currency", + "mapping_profile_hash", + "analysis_state", + "capability_level", + "basis", + "candidate_basis", + "position_count", + "zero_position_count", + "long_count", + "short_count", + "gross", + "net", + "top_1_share", + "top_5_share", + "hhi", + "coverage_ratio", + "coverage_by_basis", + "categories", + "category_coverage", + "reason", + "evidence_refs" + ], + "title": "PortfolioExposureResponse", + "type": "object" + }, + "PortfolioSummaryResponse": { + "additionalProperties": false, + "properties": { + "age_seconds": { + "title": "Age Seconds", + "type": "integer" + }, + "analysis_state": { + "enum": [ + "ready", + "unavailable", + "empty_portfolio" + ], + "title": "Analysis State", + "type": "string" + }, + "basis": { + "anyOf": [ + { + "enum": [ + "weight", + "market_value_base", + "exposure_value_base" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Basis" + }, + "candidate_basis": { + "anyOf": [ + { + "enum": [ + "weight", + "market_value_base", + "exposure_value_base" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Candidate Basis" + }, + "capability_level": { + "title": "Capability Level", + "type": "integer" + }, + "environment": { + "enum": [ + "live", + "paper" + ], + "title": "Environment", + "type": "string" + }, + "missing_fields": { + "items": { + "type": "string" + }, + "title": "Missing Fields", + "type": "array" + }, + "portfolio_id": { + "title": "Portfolio Id", + "type": "string" + }, + "position_count": { + "title": "Position Count", + "type": "integer" + }, + "snapshot_time": { + "title": "Snapshot Time", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "strategy_id": { + "title": "Strategy Id", + "type": "string" + }, + "zero_position_count": { + "title": "Zero Position Count", + "type": "integer" + } + }, + "required": [ + "portfolio_id", + "strategy_id", + "environment", + "source", + "snapshot_time", + "age_seconds", + "position_count", + "zero_position_count", + "capability_level", + "analysis_state", + "basis", + "candidate_basis", + "missing_fields" + ], + "title": "PortfolioSummaryResponse", + "type": "object" + }, + "PortfoliosResponse": { + "additionalProperties": false, + "properties": { + "portfolios": { + "items": { + "$ref": "#/components/schemas/PortfolioSummaryResponse" + }, + "title": "Portfolios", + "type": "array" + }, + "state": { + "enum": [ + "ready", + "empty" + ], + "title": "State", + "type": "string" + } + }, + "required": [ + "state", + "portfolios" + ], + "title": "PortfoliosResponse", + "type": "object" + }, "StrategiesResponse": { "additionalProperties": false, "properties": { @@ -709,6 +1150,98 @@ "summary": "Ingestion Errors" } }, + "/api/v1/portfolios": { + "get": { + "operationId": "portfolios_api_v1_portfolios_get", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PortfoliosResponse" + } + } + }, + "description": "Successful Response" + } + }, + "summary": "Portfolios" + } + }, + "/api/v1/portfolios/{portfolio_id}/exposure": { + "get": { + "operationId": "portfolio_exposure_api_v1_portfolios__portfolio_id__exposure_get", + "parameters": [ + { + "in": "path", + "name": "portfolio_id", + "required": true, + "schema": { + "title": "Portfolio Id", + "type": "string" + } + }, + { + "in": "query", + "name": "strategy_id", + "required": true, + "schema": { + "maxLength": 128, + "minLength": 1, + "title": "Strategy Id", + "type": "string" + } + }, + { + "in": "query", + "name": "environment", + "required": true, + "schema": { + "enum": [ + "live", + "paper" + ], + "title": "Environment", + "type": "string" + } + }, + { + "in": "query", + "name": "source", + "required": true, + "schema": { + "maxLength": 256, + "minLength": 1, + "title": "Source", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PortfolioExposureResponse" + } + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Portfolio Exposure" + } + }, "/api/v1/strategies": { "get": { "operationId": "list_strategies_api_v1_strategies_get", diff --git a/frontend/src/generated/api.ts b/frontend/src/generated/api.ts index f1f1c6d..a0fb703 100644 --- a/frontend/src/generated/api.ts +++ b/frontend/src/generated/api.ts @@ -38,6 +38,40 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/portfolios": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Portfolios */ + get: operations["portfolios_api_v1_portfolios_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/portfolios/{portfolio_id}/exposure": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Portfolio Exposure */ + get: operations["portfolio_exposure_api_v1_portfolios__portfolio_id__exposure_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/strategies": { parameters: { query?: never; @@ -93,6 +127,17 @@ export interface paths { export type webhooks = Record; export interface components { schemas: { + /** CategoryExposureResponse */ + CategoryExposureResponse: { + /** Gross */ + gross: string; + /** Label */ + label: string; + /** Net */ + net: string; + /** Share */ + share: string | null; + }; /** CorrelationEvidenceResponse */ CorrelationEvidenceResponse: { /** Observed Value */ @@ -194,6 +239,120 @@ export interface components { /** Source Ref */ source_ref: string; }; + /** PortfolioExposureResponse */ + PortfolioExposureResponse: { + /** Age Seconds */ + age_seconds: number; + /** + * Analysis State + * @enum {string} + */ + analysis_state: "ready" | "unavailable" | "empty_portfolio"; + /** Base Currency */ + base_currency: string | null; + /** Basis */ + basis: ("weight" | "market_value_base" | "exposure_value_base") | null; + /** Candidate Basis */ + candidate_basis: ("weight" | "market_value_base" | "exposure_value_base") | null; + /** Capability Level */ + capability_level: number; + /** Categories */ + categories: { + [key: string]: components["schemas"]["CategoryExposureResponse"][]; + }; + /** Category Coverage */ + category_coverage: { + [key: string]: string | null; + }; + /** Coverage By Basis */ + coverage_by_basis: { + [key: string]: string | null; + }; + /** Coverage Ratio */ + coverage_ratio: string | null; + /** + * Environment + * @enum {string} + */ + environment: "live" | "paper"; + /** Evidence Refs */ + evidence_refs: string[]; + /** Gross */ + gross: string | null; + /** Hhi */ + hhi: string | null; + /** Long Count */ + long_count: number; + /** Mapping Profile Hash */ + mapping_profile_hash: string; + /** Net */ + net: string | null; + /** Portfolio Id */ + portfolio_id: string; + /** Position Count */ + position_count: number; + /** Reason */ + reason: string | null; + /** Short Count */ + short_count: number; + /** Snapshot Time */ + snapshot_time: string; + /** Source */ + source: string; + /** Strategy Id */ + strategy_id: string; + /** Top 1 Share */ + top_1_share: string | null; + /** Top 5 Share */ + top_5_share: string | null; + /** Zero Position Count */ + zero_position_count: number; + }; + /** PortfolioSummaryResponse */ + PortfolioSummaryResponse: { + /** Age Seconds */ + age_seconds: number; + /** + * Analysis State + * @enum {string} + */ + analysis_state: "ready" | "unavailable" | "empty_portfolio"; + /** Basis */ + basis: ("weight" | "market_value_base" | "exposure_value_base") | null; + /** Candidate Basis */ + candidate_basis: ("weight" | "market_value_base" | "exposure_value_base") | null; + /** Capability Level */ + capability_level: number; + /** + * Environment + * @enum {string} + */ + environment: "live" | "paper"; + /** Missing Fields */ + missing_fields: string[]; + /** Portfolio Id */ + portfolio_id: string; + /** Position Count */ + position_count: number; + /** Snapshot Time */ + snapshot_time: string; + /** Source */ + source: string; + /** Strategy Id */ + strategy_id: string; + /** Zero Position Count */ + zero_position_count: number; + }; + /** PortfoliosResponse */ + PortfoliosResponse: { + /** Portfolios */ + portfolios: components["schemas"]["PortfolioSummaryResponse"][]; + /** + * State + * @enum {string} + */ + state: "ready" | "empty"; + }; /** StrategiesResponse */ StrategiesResponse: { /** @@ -318,6 +477,61 @@ export interface operations { }; }; }; + portfolios_api_v1_portfolios_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PortfoliosResponse"]; + }; + }; + }; + }; + portfolio_exposure_api_v1_portfolios__portfolio_id__exposure_get: { + parameters: { + query: { + strategy_id: string; + environment: "live" | "paper"; + source: string; + }; + header?: never; + path: { + portfolio_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PortfolioExposureResponse"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; list_strategies_api_v1_strategies_get: { parameters: { query?: never; diff --git a/src/quantcockpit/api.py b/src/quantcockpit/api.py index fdbd539..f3b8c31 100644 --- a/src/quantcockpit/api.py +++ b/src/quantcockpit/api.py @@ -17,11 +17,21 @@ HealthzResponse, IngestionErrorsResponse, IngestionIssueResponse, + PortfolioExposureResponse, + PortfoliosResponse, + PortfolioSummaryResponse, StrategiesResponse, StrategyHealthResponse, StrategySummaryResponse, ) -from quantcockpit.service import CockpitService, correlation_payload, evidence_payload, utc_text +from quantcockpit.service import ( + CockpitService, + correlation_payload, + evidence_payload, + portfolio_exposure_payload, + portfolio_summary_payload, + utc_text, +) from quantcockpit.store import DatabaseUnavailableError, DuckDBStore @@ -129,6 +139,39 @@ def ingestion_errors(service: CockpitService = Depends(get_service)) -> Ingestio failed_runs=[IngestionIssueResponse.model_validate(item) for item in errors.failed_runs], ) + @app.get("/api/v1/portfolios") + def portfolios(service: CockpitService = Depends(get_service)) -> PortfoliosResponse: + items = service.portfolios() + return PortfoliosResponse( + state="ready" if items else "empty", + portfolios=[ + PortfolioSummaryResponse.model_validate(portfolio_summary_payload(item)) + for item in items + ], + ) + + @app.get("/api/v1/portfolios/{portfolio_id}/exposure") + def portfolio_exposure( + portfolio_id: str, + strategy_id: Annotated[str, Query(min_length=1, max_length=128)], + environment: Literal["live", "paper"], + source: Annotated[str, Query(min_length=1, max_length=256)], + service: CockpitService = Depends(get_service), + ) -> PortfolioExposureResponse: + strategy_id = strategy_id.strip() + source = source.strip() + if not strategy_id or not source: + raise HTTPException(status_code=422, detail="identity query values must not be blank") + result = service.portfolio_exposure( + portfolio_id, + strategy_id, + environment, + source, + ) + if result is None: + raise HTTPException(status_code=404, detail="portfolio identity not found") + return PortfolioExposureResponse.model_validate(portfolio_exposure_payload(result)) + return app diff --git a/src/quantcockpit/api_models.py b/src/quantcockpit/api_models.py index 3ae9bfe..7f2ed8f 100644 --- a/src/quantcockpit/api_models.py +++ b/src/quantcockpit/api_models.py @@ -12,6 +12,8 @@ Environment = Literal["live", "paper"] HealthStatus = Literal["healthy", "warning", "critical", "unknown"] State = Literal["ready", "empty"] +AnalysisState = Literal["ready", "unavailable", "empty_portfolio"] +Basis = Literal["weight", "market_value_base", "exposure_value_base"] class ApiResponseModel(BaseModel): @@ -95,3 +97,60 @@ class IngestionErrorsResponse(ApiResponseModel): state: State quarantines: list[IngestionIssueResponse] failed_runs: list[IngestionIssueResponse] + + +class PortfolioIdentityResponse(ApiResponseModel): + portfolio_id: str + strategy_id: str + environment: Environment + source: str + + +class PortfolioSummaryResponse(PortfolioIdentityResponse): + snapshot_time: str + age_seconds: int + position_count: int + zero_position_count: int + capability_level: int + analysis_state: AnalysisState + basis: Basis | None + candidate_basis: Basis | None + missing_fields: list[str] + + +class PortfoliosResponse(ApiResponseModel): + state: State + portfolios: list[PortfolioSummaryResponse] + + +class CategoryExposureResponse(ApiResponseModel): + label: str + gross: str + net: str + share: str | None + + +class PortfolioExposureResponse(PortfolioIdentityResponse): + snapshot_time: str + age_seconds: int + base_currency: str | None + mapping_profile_hash: str + analysis_state: AnalysisState + capability_level: int + basis: Basis | None + candidate_basis: Basis | None + position_count: int + zero_position_count: int + long_count: int + short_count: int + gross: str | None + net: str | None + top_1_share: str | None + top_5_share: str | None + hhi: str | None + coverage_ratio: str | None + coverage_by_basis: dict[Basis, str | None] + categories: dict[str, list[CategoryExposureResponse]] + category_coverage: dict[str, str | None] + reason: str | None + evidence_refs: list[str] diff --git a/src/quantcockpit/service.py b/src/quantcockpit/service.py index e66d430..d7abd2c 100644 --- a/src/quantcockpit/service.py +++ b/src/quantcockpit/service.py @@ -4,6 +4,7 @@ from dataclasses import dataclass from datetime import datetime, timezone +from decimal import Decimal from itertools import combinations from typing import Callable, Mapping @@ -14,7 +15,8 @@ calculate_daily_correlation, ) from quantcockpit.analysis.health import HealthAssessment, HealthEvidence, assess_strategy_health -from quantcockpit.models import Environment +from quantcockpit.analysis.exposure import ExposureAnalysis, analyze_exposure +from quantcockpit.models import Environment, EventRecord, PositionSnapshotPayload from quantcockpit.store import DuckDBStore @@ -54,6 +56,31 @@ class IngestionErrors: failed_runs: tuple[dict[str, object], ...] +@dataclass(frozen=True) +class PortfolioIdentity: + portfolio_id: str + strategy_id: str + environment: Environment + source: str + + +@dataclass(frozen=True) +class PortfolioExposure: + identity: PortfolioIdentity + snapshot_time: datetime + age_seconds: int + base_currency: str | None + mapping_profile_hash: str + analysis: ExposureAnalysis + evidence_refs: tuple[str, str] + + +@dataclass(frozen=True) +class PortfolioSummary: + exposure: PortfolioExposure + missing_fields: tuple[str, ...] + + class CockpitService: """将持久化事件转换为可审计的策略观测,不产生模拟数据。""" @@ -145,6 +172,74 @@ def ingestion_errors(self) -> IngestionErrors: failed_runs=tuple(_limited_message(row) for row in raw["failed_runs"]), ) + def portfolios( + self, + *, + evaluated_at: datetime | None = None, + ) -> tuple[PortfolioSummary, ...]: + return tuple( + PortfolioSummary(exposure=item, missing_fields=_missing_fields(item.analysis)) + for item in self._portfolio_exposures(evaluated_at=evaluated_at) + ) + + def portfolio_exposure( + self, + portfolio_id: str, + strategy_id: str, + environment: Environment, + source: str, + *, + evaluated_at: datetime | None = None, + ) -> PortfolioExposure | None: + identity = (portfolio_id, strategy_id, environment, source) + return next( + ( + item + for item in self._portfolio_exposures(evaluated_at=evaluated_at) + if ( + item.identity.portfolio_id, + item.identity.strategy_id, + item.identity.environment, + item.identity.source, + ) + == identity + ), + None, + ) + + def _portfolio_exposures( + self, + *, + evaluated_at: datetime | None, + ) -> tuple[PortfolioExposure, ...]: + point_in_time = evaluated_at or self.evaluated_at() + results: list[PortfolioExposure] = [] + for row in self._store.current_position_snapshots(point_in_time): + event = EventRecord.model_validate_json(row["normalized_json"]) + payload = event.payload + if not isinstance(payload, PositionSnapshotPayload): + raise ValueError("position snapshot query returned a non-position payload") + results.append( + PortfolioExposure( + identity=PortfolioIdentity( + portfolio_id=payload.portfolio_id, + strategy_id=event.strategy_id, + environment=event.environment, + source=event.source, + ), + snapshot_time=event.event_time, + age_seconds=max(int((point_in_time - event.event_time).total_seconds()), 0), + base_currency=payload.base_currency, + mapping_profile_hash=payload.mapping_profile_hash, + analysis=analyze_exposure(payload), + evidence_refs=( + f"event:{row['event_id']}", + f"mapping:{payload.mapping_profile_hash}", + ), + ) + ) + return tuple(results) + def _limited_message(row: Mapping[str, object]) -> dict[str, object]: result = dict(row) @@ -162,6 +257,95 @@ def _supported_environment(value: str) -> Environment: raise ValueError(f"unsupported strategy environment in database: {value!r}") +def _missing_fields(analysis: ExposureAnalysis) -> tuple[str, ...]: + if analysis.state == "empty_portfolio" or analysis.level == 3: + return () + if analysis.level == 2: + return ("exposure_value_base",) + if analysis.level == 1: + return ("exposure_value_base", "market_value_base") + if analysis.candidate_basis is not None: + return (analysis.candidate_basis,) + return ("exposure_value_base", "market_value_base", "weight") + + +def decimal_text(value: Decimal | None) -> str | None: + if value is None: + return None + text = format(value, "f") + if "." in text: + text = text.rstrip("0").rstrip(".") + return "0" if text in {"", "-0"} else text + + +def portfolio_summary_payload(item: PortfolioSummary) -> dict[str, object]: + exposure = item.exposure + analysis = exposure.analysis + return { + "portfolio_id": exposure.identity.portfolio_id, + "strategy_id": exposure.identity.strategy_id, + "environment": exposure.identity.environment, + "source": exposure.identity.source, + "snapshot_time": utc_text(exposure.snapshot_time), + "age_seconds": exposure.age_seconds, + "position_count": analysis.position_count, + "zero_position_count": analysis.zero_position_count, + "capability_level": analysis.level, + "analysis_state": analysis.state, + "basis": analysis.basis, + "candidate_basis": analysis.candidate_basis, + "missing_fields": list(item.missing_fields), + } + + +def portfolio_exposure_payload(item: PortfolioExposure) -> dict[str, object]: + analysis = item.analysis + return { + "portfolio_id": item.identity.portfolio_id, + "strategy_id": item.identity.strategy_id, + "environment": item.identity.environment, + "source": item.identity.source, + "snapshot_time": utc_text(item.snapshot_time), + "age_seconds": item.age_seconds, + "base_currency": item.base_currency, + "mapping_profile_hash": item.mapping_profile_hash, + "analysis_state": analysis.state, + "capability_level": analysis.level, + "basis": analysis.basis, + "candidate_basis": analysis.candidate_basis, + "position_count": analysis.position_count, + "zero_position_count": analysis.zero_position_count, + "long_count": analysis.long_count, + "short_count": analysis.short_count, + "gross": decimal_text(analysis.gross), + "net": decimal_text(analysis.net), + "top_1_share": decimal_text(analysis.top_1_share), + "top_5_share": decimal_text(analysis.top_5_share), + "hhi": decimal_text(analysis.hhi), + "coverage_ratio": decimal_text(analysis.coverage_ratio), + "coverage_by_basis": { + basis: decimal_text(value) for basis, value in analysis.coverage_by_basis.items() + }, + "categories": { + name: [ + { + "label": category.label, + "gross": decimal_text(category.gross), + "net": decimal_text(category.net), + "share": decimal_text(category.share), + } + for category in categories + ] + for name, categories in analysis.categories.items() + }, + "category_coverage": { + name: decimal_text(value) for name, value in analysis.category_coverage.items() + }, + "reason": analysis.reason, + "evidence_refs": list(item.evidence_refs), + } + + def evidence_payload(item: HealthEvidence | CorrelationEvidence) -> dict[str, object]: return { "rule_id": item.rule_id, diff --git a/src/quantcockpit/store.py b/src/quantcockpit/store.py index 598eea8..7abc8bb 100644 --- a/src/quantcockpit/store.py +++ b/src/quantcockpit/store.py @@ -13,6 +13,7 @@ from quantcockpit.models import EventRecord from quantcockpit.store_types import ( CurrentReturnPointRow, + CurrentPositionSnapshotRow, HealthInputs, SafeIngestionErrors, SafeIngestionIssue, @@ -540,6 +541,53 @@ def current_return_points(self, evaluated_at: datetime) -> list[CurrentReturnPoi for event_id, strategy_id, environment, source, event_time, simple_return in rows ] + def current_position_snapshots( + self, + evaluated_at: datetime, + ) -> list[CurrentPositionSnapshotRow]: + """返回每个严格 portfolio 四元身份在计算时点前的最新 current 快照。""" + + rows = self.connection.execute( + """ + SELECT event_id, event_time, recorded_at, normalized_json + FROM ( + SELECT + event_id, + event_time, + recorded_at, + normalized_json, + ROW_NUMBER() OVER ( + PARTITION BY + json_extract_string(normalized_json, '$.payload.portfolio_id'), + json_extract_string(normalized_json, '$.strategy_id'), + json_extract_string(normalized_json, '$.environment'), + json_extract_string(normalized_json, '$.source') + ORDER BY event_time DESC, recorded_at DESC, event_id DESC + ) AS row_number + FROM events + WHERE is_current = TRUE + AND json_extract_string(normalized_json, '$.event_type') = 'position_snapshot' + AND event_time <= ? + ) latest + WHERE row_number = 1 + ORDER BY + json_extract_string(normalized_json, '$.payload.portfolio_id'), + json_extract_string(normalized_json, '$.strategy_id'), + json_extract_string(normalized_json, '$.environment'), + json_extract_string(normalized_json, '$.source') + """, + [evaluated_at], + ).fetchall() + return [ + { + "event_id": event_id, + "event_time": event_time, + "recorded_at": recorded_at, + "normalized_json": normalized_json, + } + for event_id, event_time, recorded_at, normalized_json in rows + ] + def safe_ingestion_errors(self) -> SafeIngestionErrors: """返回可公开的导入失败摘要,绝不读取原始行内容。""" diff --git a/src/quantcockpit/store_types.py b/src/quantcockpit/store_types.py index 1ef19d1..3990cd3 100644 --- a/src/quantcockpit/store_types.py +++ b/src/quantcockpit/store_types.py @@ -40,6 +40,13 @@ class CurrentReturnPointRow(StrategyIdentityRow): simple_return: str +class CurrentPositionSnapshotRow(TypedDict): + event_id: str + event_time: datetime + recorded_at: datetime + normalized_json: str + + class SafeIngestionIssue(TypedDict): error_code: str error_message: str diff --git a/tests/test_api.py b/tests/test_api.py index 6caa0e9..524eaba 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -47,6 +47,52 @@ def event_line( ) +def position_event_line( + *, + portfolio_id: str = "book-a", + strategy_id: str = "alpha", + environment: str = "paper", + source: str = "broker-export", + event_time: str = "2026-07-20T12:00:00Z", + recorded_at: str = "2026-07-20T12:01:00Z", + positions: list[dict[str, object]] | None = None, +) -> str: + return json.dumps( + { + "schema_version": "1.1", + "strategy_id": strategy_id, + "environment": environment, + "event_type": "position_snapshot", + "event_time": event_time, + "recorded_at": recorded_at, + "source": source, + "payload": { + "event_type": "position_snapshot", + "portfolio_id": portfolio_id, + "base_currency": "USD", + "mapping_profile_hash": f"sha256:{'a' * 64}", + "positions": positions + if positions is not None + else [ + { + "instrument_id": "AAPL", + "instrument_id_type": "ticker", + "market_value_base": "60", + "asset_class": "equity", + }, + { + "instrument_id": "MSFT", + "instrument_id_type": "ticker", + "market_value_base": "-40", + "asset_class": "equity", + }, + ], + }, + }, + sort_keys=True, + ) + + def seed_database(database_path: Path, tmp_path: Path, *lines: str) -> None: source_path = tmp_path / "events.jsonl" source_path.write_text("\n".join(lines) + "\n", encoding="utf-8") @@ -93,6 +139,8 @@ def test_openapi_uses_named_response_models(tmp_path: Path) -> None: "/api/v1/strategies": "StrategiesResponse", "/api/v1/correlations": "CorrelationsResponse", "/api/v1/ingestion/errors": "IngestionErrorsResponse", + "/api/v1/portfolios": "PortfoliosResponse", + "/api/v1/portfolios/{portfolio_id}/exposure": "PortfolioExposureResponse", } for path, model_name in expected.items(): response_schema = schema["paths"][path]["get"]["responses"]["200"]["content"]["application/json"]["schema"] @@ -356,3 +404,139 @@ def test_ingestion_errors_expose_traceable_metadata_without_raw_sensitive_lines( assert body["failed_runs"] == [] assert "do-not-disclose" not in response.text assert "raw_line" not in response.text + + +def test_empty_database_explicitly_reports_empty_portfolio_state(tmp_path: Path) -> None: + database_path = tmp_path / "empty-portfolios.duckdb" + DuckDBStore(database_path).close() + + response = client(database_path).get("/api/v1/portfolios") + + assert response.status_code == 200 + assert response.json() == {"state": "empty", "portfolios": []} + + +def test_portfolio_api_returns_latest_strict_identity_with_mapping_evidence(tmp_path: Path) -> None: + database_path = tmp_path / "portfolios.duckdb" + seed_database(database_path, tmp_path, position_event_line()) + app_client = client(database_path) + + portfolios = app_client.get("/api/v1/portfolios") + detail = app_client.get( + "/api/v1/portfolios/book-a/exposure" + "?strategy_id=alpha&environment=paper&source=broker-export" + ) + + assert portfolios.status_code == 200 + summary = portfolios.json()["portfolios"][0] + assert summary == { + "portfolio_id": "book-a", + "strategy_id": "alpha", + "environment": "paper", + "source": "broker-export", + "snapshot_time": "2026-07-20T12:00:00Z", + "age_seconds": 21600, + "position_count": 2, + "zero_position_count": 0, + "capability_level": 2, + "analysis_state": "ready", + "basis": "market_value_base", + "candidate_basis": None, + "missing_fields": ["exposure_value_base"], + } + assert detail.status_code == 200 + body = detail.json() + assert body["portfolio_id"] == "book-a" + assert body["base_currency"] == "USD" + assert body["basis"] == "market_value_base" + assert body["gross"] == "100" + assert body["net"] == "20" + assert body["top_1_share"] == "0.6" + assert body["hhi"] == "0.52" + assert body["coverage_by_basis"] == { + "exposure_value_base": "0", + "market_value_base": "1", + "weight": "0", + } + assert body["evidence_refs"][0].startswith("event:") + assert body["evidence_refs"][1] == f"mapping:sha256:{'a' * 64}" + + +def test_portfolio_detail_never_crosses_source_environment_or_portfolio(tmp_path: Path) -> None: + database_path = tmp_path / "isolation.duckdb" + seed_database( + database_path, + tmp_path, + position_event_line(portfolio_id="book-a", environment="paper", source="source-a"), + position_event_line(portfolio_id="book-a", environment="live", source="source-a"), + position_event_line(portfolio_id="book-b", environment="paper", source="source-b"), + ) + app_client = client(database_path) + + assert app_client.get( + "/api/v1/portfolios/book-a/exposure?strategy_id=alpha&environment=paper&source=source-a" + ).status_code == 200 + assert app_client.get( + "/api/v1/portfolios/book-a/exposure?strategy_id=alpha&environment=paper&source=source-b" + ).status_code == 404 + assert app_client.get( + "/api/v1/portfolios/book-b/exposure?strategy_id=alpha&environment=paper&source=source-a" + ).status_code == 404 + + +def test_portfolio_query_ignores_future_snapshot_and_reads_current_revision(tmp_path: Path) -> None: + database_path = tmp_path / "as-of-position.duckdb" + seed_database( + database_path, + tmp_path, + position_event_line( + positions=[{"instrument_id": "AAPL", "market_value_base": "50"}], + ), + position_event_line( + recorded_at="2026-07-20T12:02:00Z", + positions=[{"instrument_id": "AAPL", "market_value_base": "75"}], + ), + position_event_line( + event_time="2026-07-21T12:00:00Z", + recorded_at="2026-07-21T12:01:00Z", + positions=[{"instrument_id": "AAPL", "market_value_base": "999"}], + ), + ) + + body = client(database_path).get( + "/api/v1/portfolios/book-a/exposure" + "?strategy_id=alpha&environment=paper&source=broker-export" + ).json() + + assert body["gross"] == "75" + assert body["snapshot_time"] == "2026-07-20T12:00:00Z" + + +def test_portfolio_api_preserves_explicit_empty_portfolio_zero_semantics(tmp_path: Path) -> None: + database_path = tmp_path / "flat.duckdb" + seed_database(database_path, tmp_path, position_event_line(positions=[])) + + body = client(database_path).get( + "/api/v1/portfolios/book-a/exposure" + "?strategy_id=alpha&environment=paper&source=broker-export" + ).json() + + assert body["analysis_state"] == "empty_portfolio" + assert body["gross"] == "0" + assert body["net"] == "0" + assert body["basis"] is None + assert body["coverage_ratio"] is None + + +def test_portfolio_detail_validates_query_and_unknown_identity(tmp_path: Path) -> None: + database_path = tmp_path / "validation.duckdb" + seed_database(database_path, tmp_path, position_event_line()) + app_client = client(database_path) + + assert app_client.get("/api/v1/portfolios/book-a/exposure").status_code == 422 + assert app_client.get( + "/api/v1/portfolios/book-a/exposure?strategy_id=alpha&environment=backtest&source=broker-export" + ).status_code == 422 + assert app_client.get( + "/api/v1/portfolios/missing/exposure?strategy_id=alpha&environment=paper&source=broker-export" + ).status_code == 404 From 7bb96a06f1f8a2c1442a82982f578879daf8ad84 Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:59:36 +0800 Subject: [PATCH 10/18] feat: report synthetic portfolio exposure --- .../positions/demo-positions-profile.json | 23 ++++++ examples/positions/demo-positions.csv | 4 + scripts/import_demo.py | 24 ++++++ src/quantcockpit/report.py | 60 ++++++++++++++- tests/test_report.py | 73 ++++++++++++++++++- tests/test_scripts.py | 30 ++++++++ 6 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 examples/positions/demo-positions-profile.json create mode 100644 examples/positions/demo-positions.csv diff --git a/examples/positions/demo-positions-profile.json b/examples/positions/demo-positions-profile.json new file mode 100644 index 0000000..bfd7aab --- /dev/null +++ b/examples/positions/demo-positions-profile.json @@ -0,0 +1,23 @@ +{ + "profile_version": "1.0", + "name": "synthetic-demo-positions", + "format": "csv", + "layout": "tabular_snapshot", + "snapshot_scope": "grouped_rows", + "fields": { + "strategy_id": {"literal": "healthy-demo"}, + "environment": {"literal": "paper"}, + "source": {"literal": "synthetic-demo"}, + "portfolio_id": {"path": "account_alias", "transforms": ["trim"]}, + "snapshot_time": {"path": "as_of", "transforms": ["utc_timestamp"]}, + "base_currency": {"literal": "USD"} + }, + "position_fields": { + "instrument_id": {"path": "symbol", "transforms": ["trim"]}, + "instrument_id_type": {"literal": "ticker"}, + "quantity": {"path": "quantity", "transforms": ["decimal"]}, + "market_value_base": {"path": "market_value_base", "transforms": ["decimal"]}, + "asset_class": {"path": "asset_class", "transforms": ["trim", "lowercase"]}, + "country": {"path": "country", "transforms": ["trim", "uppercase"]} + } +} diff --git a/examples/positions/demo-positions.csv b/examples/positions/demo-positions.csv new file mode 100644 index 0000000..bee6b04 --- /dev/null +++ b/examples/positions/demo-positions.csv @@ -0,0 +1,4 @@ +account_alias,as_of,symbol,quantity,market_value_base,asset_class,sector,country +synthetic-book,2026-07-20T17:30:00Z,SYNTH_A,100,60000,equity,Technology,US +synthetic-book,2026-07-20T17:30:00Z,SYNTH_B,-50,-30000,equity,Financials,US +synthetic-book,2026-07-20T17:30:00Z,SYNTH_C,25,10000,bond,,GB diff --git a/scripts/import_demo.py b/scripts/import_demo.py index fbcf2f9..20c9548 100644 --- a/scripts/import_demo.py +++ b/scripts/import_demo.py @@ -9,6 +9,8 @@ from pathlib import Path from quantcockpit.ingestion.jsonl import import_jsonl +from quantcockpit.ingestion.position_profile import PositionMappingProfile +from quantcockpit.ingestion.positions import import_positions from quantcockpit.store import DuckDBStore @@ -20,6 +22,11 @@ def main(argv: list[str] | None = None) -> int: help="DuckDB 路径;默认读取 QUANTCOCKPIT_DB_PATH 或 quantcockpit.duckdb", ) parser.add_argument("--data-dir", default="examples/data", help="JSONL 数据目录") + parser.add_argument( + "--positions-dir", + default="examples/positions", + help="合成仓位文件和 *-profile.json 映射目录", + ) args = parser.parse_args(argv) data_dir = Path(args.data_dir) @@ -28,6 +35,12 @@ def main(argv: list[str] | None = None) -> int: print(f"导入失败:未在 {data_dir} 找到 .jsonl 文件", file=sys.stderr) return 1 + positions_dir = Path(args.positions_dir) + position_profiles = sorted(positions_dir.glob("*-profile.json")) + if not position_profiles: + print(f"导入失败:未在 {positions_dir} 找到 *-profile.json", file=sys.stderr) + return 1 + store = DuckDBStore(args.database) try: for path in files: @@ -36,6 +49,17 @@ def main(argv: list[str] | None = None) -> int: f"已导入 {path}: imported={result.imported} duplicates={result.duplicates} " f"revisions={result.revisions} quarantined={result.quarantined}" ) + for profile_path in position_profiles: + profile = PositionMappingProfile.model_validate_json( + profile_path.read_text(encoding="utf-8") + ) + input_name = profile_path.name.removesuffix("-profile.json") + f".{profile.format}" + input_path = positions_dir / input_name + result = import_positions(store, input_path, profile) + print( + f"已导入 {input_path}: imported={result.imported} " + f"duplicates={result.duplicates} revisions={result.revisions}" + ) except Exception as error: print(f"导入失败:{error}", file=sys.stderr) return 1 diff --git a/src/quantcockpit/report.py b/src/quantcockpit/report.py index e77e9cc..ccdec79 100644 --- a/src/quantcockpit/report.py +++ b/src/quantcockpit/report.py @@ -5,7 +5,13 @@ from datetime import datetime, timezone import re -from quantcockpit.service import CockpitService, StrategyHealth, utc_text +from quantcockpit.service import ( + CockpitService, + PortfolioExposure, + StrategyHealth, + decimal_text, + utc_text, +) class NoStrategyDataError(ValueError): @@ -25,7 +31,7 @@ def render_markdown(service: CockpitService, *, generated_at: datetime) -> str: lines = [ "# QuantCockpit 本地健康报告", "", - "- 数据来源:DuckDB 中的 current 版本化 JSONL 事件", + "- 数据来源:DuckDB 中的 current 版本化事件", f"- 生成时间:{utc_text(generated_at)}", "", "## 策略健康", @@ -55,6 +61,14 @@ def render_markdown(service: CockpitService, *, generated_at: datetime) -> str: ) lines.append("") + lines.extend(["## 仓位覆盖与集中度", ""]) + portfolios = service.portfolios(evaluated_at=generated_at) + if not portfolios: + lines.extend(["- 无 current 仓位快照。", ""]) + else: + for item in portfolios: + _append_portfolio(lines, item.exposure) + errors = service.ingestion_errors() lines.extend(["## 导入错误摘要", ""]) if errors.quarantines: @@ -110,6 +124,48 @@ def _append_strategy(lines: list[str], item: StrategyHealth) -> None: lines.append("") +def _append_portfolio(lines: list[str], item: PortfolioExposure) -> None: + analysis = item.analysis + lines.extend( + [ + f"### {_markdown_inline(item.identity.portfolio_id)} / " + f"{_markdown_inline(item.identity.strategy_id)} / " + f"{_markdown_inline(item.identity.environment)}", + "", + f"- source = {_markdown_inline(item.identity.source)}", + f"- snapshot\\_time = {utc_text(item.snapshot_time)};age\\_seconds = {item.age_seconds}", + f"- state = {_markdown_inline(analysis.state)};level = {analysis.level};" + f"basis = {_markdown_inline(analysis.basis)};candidate\\_basis = " + f"{_markdown_inline(analysis.candidate_basis)}", + f"- position\\_count = {analysis.position_count};zero\\_position\\_count = " + f"{analysis.zero_position_count};long = {analysis.long_count};short = {analysis.short_count}", + f"- coverage = {_markdown_inline(decimal_text(analysis.coverage_ratio))};" + f"reason = {_markdown_inline(analysis.reason)}", + f"- gross = {_markdown_inline(decimal_text(analysis.gross))};" + f"net = {_markdown_inline(decimal_text(analysis.net))};" + f"Top-1 = {_markdown_inline(decimal_text(analysis.top_1_share))};" + f"Top-5 = {_markdown_inline(decimal_text(analysis.top_5_share))};" + f"HHI = {_markdown_inline(decimal_text(analysis.hhi))}", + ] + ) + for dimension, categories in analysis.categories.items(): + if not categories: + continue + rendered = ";".join( + f"{_markdown_inline(category.label)}: gross={_markdown_inline(decimal_text(category.gross))}, " + f"net={_markdown_inline(decimal_text(category.net))}, " + f"share={_markdown_inline(decimal_text(category.share))}" + for category in categories + ) + lines.append(f"- {_markdown_inline(dimension)}:{rendered}") + lines.extend( + [ + f"- evidence = {_markdown_inline(', '.join(item.evidence_refs))}", + "", + ] + ) + + def _markdown_inline(value: object) -> str: """把数据库中的非可信文本限制为单行普通 inline 文本。""" diff --git a/tests/test_report.py b/tests/test_report.py index d4138f7..f5a4f20 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -33,6 +33,28 @@ def event_line(strategy_id: str, day: int, value: str) -> str: ) +def position_line(*, portfolio_id: str, positions: list[dict[str, object]]) -> str: + return json.dumps( + { + "schema_version": "1.1", + "strategy_id": "alpha", + "environment": "paper", + "event_type": "position_snapshot", + "event_time": "2026-07-20T17:30:00Z", + "recorded_at": "2026-07-20T17:31:00Z", + "source": "report-fixture", + "payload": { + "event_type": "position_snapshot", + "portfolio_id": portfolio_id, + "base_currency": "USD", + "mapping_profile_hash": f"sha256:{'b' * 64}", + "positions": positions, + }, + }, + sort_keys=True, + ) + + def populated_store(tmp_path: Path) -> DuckDBStore: source = tmp_path / "report-events.jsonl" source.write_text( @@ -67,7 +89,7 @@ def test_report_is_deterministic_and_contains_traceable_health_correlation_and_e finally: store.close() - assert "数据来源:DuckDB 中的 current 版本化 JSONL 事件" in report + assert "数据来源:DuckDB 中的 current 版本化事件" in report assert "生成时间:2026-07-20T18:00:00Z" in report assert "规则 `latest_current_event_freshness`" in report assert "引用 = event:" in report @@ -184,3 +206,52 @@ def test_report_script_writes_only_the_explicit_output_target(tmp_path: Path) -> assert "报告已写入" in result.stdout assert output_path.exists() assert "# QuantCockpit 本地健康报告" in output_path.read_text(encoding="utf-8") + + +def test_report_contains_position_metrics_missing_reason_and_evidence(tmp_path: Path) -> None: + from quantcockpit.report import render_markdown + + source = tmp_path / "position-report.jsonl" + source.write_text( + "\n".join( + ( + event_line("alpha", 19, "0.01"), + position_line( + portfolio_id="ready-book", + positions=[ + {"instrument_id": "AAPL", "market_value_base": "60", "sector": "Technology"}, + {"instrument_id": "MSFT", "market_value_base": "-40"}, + ], + ), + position_line( + portfolio_id="partial-book", + positions=[ + {"instrument_id": "AAPL", "weight": "0.5"}, + {"instrument_id": "MSFT", "quantity": "2"}, + ], + ), + ) + ) + + "\n", + encoding="utf-8", + ) + store = DuckDBStore(":memory:") + try: + import_jsonl(store, source, observed_at=GENERATED_AT) + report = render_markdown(CockpitService(store), generated_at=GENERATED_AT) + finally: + store.close() + + assert "## 仓位覆盖与集中度" in report + assert r"ready\-book" in report + assert r"basis = market\_value\_base" in report + assert "gross = 100" in report + assert "net = 20" in report + assert "Top-1 = 0.6" in report + assert "HHI = 0.52" in report + assert "unclassified" in report + assert r"partial\-book" in report + assert r"incomplete\_basis" in report + assert "coverage = 0.5" in report + assert "mapping:sha256:" in report + assert "event:" in report diff --git a/tests/test_scripts.py b/tests/test_scripts.py index 13c0cf7..38a7b4d 100644 --- a/tests/test_scripts.py +++ b/tests/test_scripts.py @@ -139,3 +139,33 @@ def test_position_import_cli_writes_explicit_database_and_reports_counts(tmp_pat assert result.returncode == 0 assert database.exists() assert "imported=1" in result.stdout + + +def test_demo_import_includes_synthetic_position_snapshot(tmp_path: Path) -> None: + database = tmp_path / "demo-with-positions.duckdb" + + result = subprocess.run( + [ + "uv", + "run", + "scripts/import_demo.py", + "--database", + str(database), + "--data-dir", + "examples/data", + "--positions-dir", + "examples/positions", + ], + cwd=Path(__file__).parents[1], + capture_output=True, + text=True, + check=False, + ) + + assert result.returncode == 0 + assert "demo-positions.csv" in result.stdout + store = DuckDBStore(database) + try: + assert len(store.current_position_snapshots(datetime(2026, 7, 20, 18, tzinfo=timezone.utc))) == 1 + finally: + store.close() From 44aa82f5c15b173e2d5a043e9e152d523e2b47b8 Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:04:15 +0800 Subject: [PATCH 11/18] feat: show portfolio exposure in cockpit --- frontend/src/Dashboard.tsx | 211 ++++++++++++++++++++++++++++-- frontend/src/styles.css | 40 +++++- frontend/src/types.ts | 4 + frontend/tests/dashboard.test.tsx | 127 +++++++++++++++++- 4 files changed, 366 insertions(+), 16 deletions(-) diff --git a/frontend/src/Dashboard.tsx b/frontend/src/Dashboard.tsx index e967d55..2a07eed 100644 --- a/frontend/src/Dashboard.tsx +++ b/frontend/src/Dashboard.tsx @@ -5,6 +5,9 @@ import type { CorrelationsResponse, IngestionErrorsResponse, Mode, + PortfolioExposureResponse, + PortfolioSummary, + PortfoliosResponse, StrategiesResponse, StrategyHealthResponse, StrategySummary, @@ -25,7 +28,11 @@ interface DashboardData { strategies: StrategySummary[]; health: Map; healthFailures: Set; + portfolios: PortfolioSummary[]; + exposures: Map; + exposureFailures: Set; strategyFailed: boolean; + portfolioFailed: boolean; correlations?: CorrelationsResponse; errors?: IngestionErrorsResponse; correlationFailed: boolean; @@ -36,7 +43,11 @@ const EMPTY_DATA: DashboardData = { strategies: [], health: new Map(), healthFailures: new Set(), + portfolios: [], + exposures: new Map(), + exposureFailures: new Set(), strategyFailed: false, + portfolioFailed: false, correlationFailed: false, errorsFailed: false, }; @@ -47,6 +58,17 @@ function strategyKey( return `${strategy.strategy_id}/${strategy.environment}/${strategy.source}`; } +function portfolioKey( + portfolio: Pick, +): string { + return JSON.stringify([ + portfolio.portfolio_id, + portfolio.strategy_id, + portfolio.environment, + portfolio.source, + ]); +} + function displayValue(value: unknown): string { if (value === null || value === undefined) return "无"; if (typeof value === "object") return JSON.stringify(value); @@ -62,6 +84,33 @@ function displayTime(value: string | null): string { }).format(new Date(value)) + " UTC"; } +function displayPercent(value: string | null): string { + if (value === null) return "无"; + const percent = Number(value) * 100; + return `${Number.isInteger(percent) ? percent.toFixed(0) : percent.toFixed(1)}%`; +} + +function displayMetric(value: string | null, percent = false): string { + if (value === null) return "不可计算"; + return percent ? displayPercent(value) : value; +} + +function displayAnalysisState(state: PortfolioSummary["analysis_state"]): string { + return { + ready: "可分析", + unavailable: "数据不足", + empty_portfolio: "明确空仓", + }[state]; +} + +function displayCategory(name: string): string { + return { + asset_class: "资产类别", + sector: "行业", + country: "国家 / 地区", + }[name] ?? name; +} + export function Dashboard({ mode, requestTimeoutMs = 6000 }: DashboardProps) { const [loadState, setLoadState] = useState("loading"); const [data, setData] = useState(EMPTY_DATA); @@ -90,22 +139,34 @@ export function Dashboard({ mode, requestTimeoutMs = 6000 }: DashboardProps) { } const requestOptions = { timeoutMs: requestTimeoutMs, signal: controller.signal }; - const [strategyResult, correlationResult, errorsResult] = await Promise.allSettled([ + const [strategyResult, correlationResult, errorsResult, portfolioResult] = await Promise.allSettled([ getJson("/api/v1/strategies", requestOptions), getJson("/api/v1/correlations", requestOptions), getJson("/api/v1/ingestion/errors", requestOptions), + getJson("/api/v1/portfolios", requestOptions), ]); if (controller.signal.aborted) return; const strategies = strategyResult.status === "fulfilled" ? strategyResult.value.strategies : []; - const healthResults = await Promise.allSettled( - strategies.map((strategy) => - getJson( - `/api/v1/strategies/${encodeURIComponent(strategy.strategy_id)}/${strategy.environment}/health?source=${encodeURIComponent(strategy.source)}`, - requestOptions, + const portfolios = portfolioResult.status === "fulfilled" ? portfolioResult.value.portfolios : []; + const [healthResults, exposureResults] = await Promise.all([ + Promise.allSettled( + strategies.map((strategy) => + getJson( + `/api/v1/strategies/${encodeURIComponent(strategy.strategy_id)}/${strategy.environment}/health?source=${encodeURIComponent(strategy.source)}`, + requestOptions, + ), ), ), - ); + Promise.allSettled( + portfolios.map((portfolio) => + getJson( + `/api/v1/portfolios/${encodeURIComponent(portfolio.portfolio_id)}/exposure?strategy_id=${encodeURIComponent(portfolio.strategy_id)}&environment=${portfolio.environment}&source=${encodeURIComponent(portfolio.source)}`, + requestOptions, + ), + ), + ), + ]); if (controller.signal.aborted) return; const health = new Map(); @@ -115,24 +176,39 @@ export function Dashboard({ mode, requestTimeoutMs = 6000 }: DashboardProps) { if (result.status === "fulfilled") health.set(key, result.value); else healthFailures.add(key); }); + const exposures = new Map(); + const exposureFailures = new Set(); + exposureResults.forEach((result, index) => { + const key = portfolioKey(portfolios[index]); + if (result.status === "fulfilled") exposures.set(key, result.value); + else exposureFailures.add(key); + }); const partial = strategyResult.status === "rejected" || correlationResult.status === "rejected" || errorsResult.status === "rejected" || - healthFailures.size > 0; + portfolioResult.status === "rejected" || + healthFailures.size > 0 || + exposureFailures.size > 0; setData({ strategies, health, healthFailures, + portfolios, + exposures, + exposureFailures, strategyFailed: strategyResult.status === "rejected", + portfolioFailed: portfolioResult.status === "rejected", correlations: correlationResult.status === "fulfilled" ? correlationResult.value : undefined, errors: errorsResult.status === "fulfilled" ? errorsResult.value : undefined, correlationFailed: correlationResult.status === "rejected", errorsFailed: errorsResult.status === "rejected", }); setLastRefresh(new Date().toISOString()); - setLoadState(partial ? "partial" : strategies.length === 0 ? "empty" : "ready"); + setLoadState( + partial ? "partial" : strategies.length === 0 && portfolios.length === 0 ? "empty" : "ready", + ); }, [requestTimeoutMs]); useEffect(() => { @@ -141,7 +217,9 @@ export function Dashboard({ mode, requestTimeoutMs = 6000 }: DashboardProps) { }, [load]); const showDemoWatermark = - mode === "demo" || data.strategies.some((strategy) => strategy.source === "synthetic-demo"); + mode === "demo" || + data.strategies.some((strategy) => strategy.source === "synthetic-demo") || + data.portfolios.some((portfolio) => portfolio.source === "synthetic-demo"); const reportCommand = showDemoWatermark ? DEMO_REPORT_COMMAND : LOCAL_REPORT_COMMAND; const copyReportCommand = async () => { @@ -169,7 +247,7 @@ export function Dashboard({ mode, requestTimeoutMs = 6000 }: DashboardProps) {

LOCAL OBSERVABILITY / PUBLIC ALPHA

QuantCockpit

-

策略日志的健康度、证据与相关性观察台

+

策略与仓位日志的健康度、证据、敞口与相关性观察台

+ {copyState === "error" &&

复制失败,请手动复制

} )} diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 18ccaac..0bf9141 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -125,6 +125,7 @@ dd { margin: 3px 0 0; overflow-wrap: anywhere; } .command-row { display: flex; align-items: stretch; border: 1px solid var(--ink); background: white; } .command-row code { flex: 1; padding: 14px; overflow-wrap: anywhere; font-size: 12px; } .command-row button { border: 0; border-left: 1px solid var(--ink); background: var(--signal); min-width: 84px; font-weight: 800; } +.copy-feedback { grid-column: 2; margin: -6px 0 0; color: #a0290d; font-weight: 750; } .offline-panel { margin-top: 1px; background: var(--danger); color: #1d0904; padding: 48px; border: 2px solid var(--ink); } .offline-panel h2 { margin: 0 0 12px; font-size: 42px; } .offline-panel p { margin: 0; max-width: 680px; font-size: 16px; } From 9ca607878f32b7ac21439c67fbb0f5d4d3b4fc2b Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:13:48 +0800 Subject: [PATCH 14/18] =?UTF-8?q?test(qa):=20regression=20test=20for=20ISS?= =?UTF-8?q?UE-001=20=E2=80=94=20clipboard=20denial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/dashboard.regression-1.test.tsx | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 frontend/tests/dashboard.regression-1.test.tsx diff --git a/frontend/tests/dashboard.regression-1.test.tsx b/frontend/tests/dashboard.regression-1.test.tsx new file mode 100644 index 0000000..07503e5 --- /dev/null +++ b/frontend/tests/dashboard.regression-1.test.tsx @@ -0,0 +1,36 @@ +// Regression: ISSUE-001 — 剪贴板权限被拒绝时没有用户反馈 +// Found by /qa on 2026-07-20 +// Report: .gstack/qa-reports/qa-report-127-0-0-1-2026-07-20.md + +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; + +import { Dashboard } from "../src/Dashboard"; + +function response(body: object): Response { + return { ok: true, status: 200, json: async () => body } as Response; +} + +test("剪贴板权限被拒绝时提示用户手动复制", async () => { + const user = userEvent.setup(); + vi.spyOn(globalThis, "fetch").mockImplementation(async (input) => { + const path = String(input); + if (path === "/healthz") return response({ status: "ok" }); + if (path === "/api/v1/strategies") return response({ state: "empty", strategies: [] }); + if (path === "/api/v1/correlations") return response({ state: "empty", pairs: [] }); + if (path === "/api/v1/ingestion/errors") { + return response({ state: "empty", quarantines: [], failed_runs: [] }); + } + if (path === "/api/v1/portfolios") return response({ state: "empty", portfolios: [] }); + throw new Error(`unexpected route ${path}`); + }); + vi.spyOn(navigator.clipboard, "writeText").mockRejectedValue( + new DOMException("Write permission denied", "NotAllowedError"), + ); + + render(); + await screen.findByText("尚未导入策略日志"); + await user.click(screen.getByRole("button", { name: "复制报告命令" })); + + expect(screen.getByText("复制失败,请手动复制")).toBeVisible(); +}); From 85086dcef7f1146dee256b150ffb09eaa8b369e6 Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:14:14 +0800 Subject: [PATCH 15/18] docs: refresh cockpit portfolio screenshot --- docs/assets/quantcockpit-demo.png | Bin 141498 -> 400994 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/assets/quantcockpit-demo.png b/docs/assets/quantcockpit-demo.png index b016345217ce7290772a9b4180263f7092c82b8b..f646d7cb2289dbad26371c1e7e808b2377707672 100644 GIT binary patch literal 400994 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 BKg9q5 literal 141498 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 Pd^UG<3}F@8cH#d6fW`aF From 3548ef0475782801cf734799a70268d550ddfd76 Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:20:09 +0800 Subject: [PATCH 16/18] fix: enforce source byte limits during reads --- SECURITY.md | 2 +- .../ingestion/position_sources.py | 30 +++++++++++++++++-- tests/test_position_sources.py | 26 ++++++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 7ad8fa7..9f3373b 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -12,7 +12,7 @@ Public Alpha 只支持当前默认分支。尚未承诺长期维护窗口或安 ## 威胁模型与部署边界 -QuantCockpit 设计为本机只读观察工具:API 默认只监听 `127.0.0.1`,没有认证,也不应直接暴露到公网。仓位源文件只由本地进程读取,不上传到外部服务;DuckDB 保存校验后的规范事件、来源坐标和映射哈希。若自行更改监听地址或部署到共享网络,必须另行提供 TLS、认证、授权、速率限制和日志脱敏;这不在 Public Alpha 的支持范围内。 +QuantCockpit 设计为本机只读观察工具:API 默认只监听 `127.0.0.1`,没有认证,也不应直接暴露到公网。仓位源文件只由本地进程读取,不上传到外部服务;DuckDB 保存校验后的规范事件、来源坐标、映射哈希,以及组成快照的原始记录证据。原始记录不会通过当前 API 返回,但导入前仍应删除与监控无关的敏感列。若自行更改监听地址或部署到共享网络,必须另行提供 TLS、认证、授权、速率限制和日志脱敏;这不在 Public Alpha 的支持范围内。 请把以下内容视为敏感并保持在 Git 之外: diff --git a/src/quantcockpit/ingestion/position_sources.py b/src/quantcockpit/ingestion/position_sources.py index 87b30db..d018872 100644 --- a/src/quantcockpit/ingestion/position_sources.py +++ b/src/quantcockpit/ingestion/position_sources.py @@ -8,6 +8,7 @@ import json from pathlib import Path import re +import stat from typing import TextIO, cast from quantcockpit.ingestion.position_profile import PositionMappingProfile @@ -47,6 +48,11 @@ def __iter__(self) -> _TrackedLines: def __next__(self) -> str: line = next(self._source) self.total_bytes += len(line.encode("utf-8")) + if self.total_bytes > MAX_SOURCE_BYTES: + raise SourceReadError( + "ingestion_limit_exceeded", + "source file exceeds the 100 MiB limit", + ) return line @@ -73,10 +79,12 @@ def _validate_source_file(source_path: Path, profile: PositionMappingProfile) -> "file extension does not match mapping profile format", ) try: - size = source_path.stat().st_size + source_stat = source_path.stat() except OSError as error: raise SourceReadError("file_read_error", "source file cannot be inspected") from error - if size > MAX_SOURCE_BYTES: + if not stat.S_ISREG(source_stat.st_mode): + raise SourceReadError("file_read_error", "source path must be a regular file") + if source_stat.st_size > MAX_SOURCE_BYTES: raise SourceReadError( "ingestion_limit_exceeded", "source file exceeds the 100 MiB limit", @@ -143,8 +151,15 @@ def _read_csv(source_path: Path) -> Iterator[SourceRecord]: def _read_jsonl(source_path: Path) -> Iterator[SourceRecord]: try: file_size = source_path.stat().st_size + total_bytes = 0 with source_path.open("rb") as source: for line_number, raw_line in enumerate(source, start=1): + total_bytes += len(raw_line) + if total_bytes > MAX_SOURCE_BYTES: + raise SourceReadError( + "ingestion_limit_exceeded", + "source file exceeds the 100 MiB limit", + ) if len(raw_line) > MAX_RECORD_BYTES: raise SourceReadError( "ingestion_limit_exceeded", @@ -184,7 +199,16 @@ def _read_jsonl(source_path: Path) -> Iterator[SourceRecord]: def _read_json(source_path: Path, *, document: bool) -> Iterator[SourceRecord]: try: - text = source_path.read_text(encoding="utf-8") + with source_path.open("rb") as source: + raw = source.read(MAX_SOURCE_BYTES + 1) + if len(raw) > MAX_SOURCE_BYTES: + raise SourceReadError( + "ingestion_limit_exceeded", + "source file exceeds the 100 MiB limit", + ) + text = raw.decode("utf-8") + except SourceReadError: + raise except (OSError, UnicodeError) as error: raise SourceReadError("file_read_error", "source JSON cannot be read as UTF-8") from error try: diff --git a/tests/test_position_sources.py b/tests/test_position_sources.py index 39debfb..0878495 100644 --- a/tests/test_position_sources.py +++ b/tests/test_position_sources.py @@ -2,6 +2,7 @@ import pytest +from quantcockpit.ingestion import position_sources from quantcockpit.ingestion.position_profile import PositionMappingProfile from quantcockpit.ingestion.position_sources import SourceReadError, read_source @@ -54,6 +55,31 @@ def test_source_larger_than_100_mib_is_rejected_before_parse(tmp_path: Path) -> assert captured.value.code == "ingestion_limit_exceeded" +@pytest.mark.parametrize( + ("format", "contents"), + [ + ("csv", "symbol,weight\nAAPL,0.5\nMSFT,0.5\n"), + ("jsonl", '{"symbol":"AAPL","weight":"0.5"}\n{"symbol":"MSFT","weight":"0.5"}\n'), + ("json", '[{"symbol":"AAPL","weight":"0.5"},{"symbol":"MSFT","weight":"0.5"}]'), + ], +) +def test_reader_enforces_total_byte_limit_during_read( + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + format: str, + contents: str, +) -> None: + path = tmp_path / f"positions.{format}" + path.write_text(contents, encoding="utf-8") + monkeypatch.setattr(position_sources, "MAX_SOURCE_BYTES", 24) + monkeypatch.setattr(position_sources, "_validate_source_file", lambda *_: None) + + with pytest.raises(SourceReadError) as captured: + list(read_source(path, profile(format))) + + assert captured.value.code == "ingestion_limit_exceeded" + + def test_jsonl_record_larger_than_one_mib_is_rejected(tmp_path: Path) -> None: path = tmp_path / "positions.jsonl" path.write_text('{"symbol":"' + ("A" * (1024 * 1024)) + '","weight":"1"}\n', encoding="utf-8") From ed84ae6099fa369ea4468ed695306b5bd0538743 Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:23:19 +0800 Subject: [PATCH 17/18] chore: prepare v0.2.0 release metadata --- CHANGELOG.md | 2 +- frontend/openapi.json | 2 +- frontend/package.json | 2 +- pyproject.toml | 2 +- src/quantcockpit/api.py | 8 +++++++- uv.lock | 2 +- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee371f8..3a0046c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ QuantCockpit 的重要变更记录在这里。版本遵循 [Semantic Versioning](https://semver.org/)。 -## [Unreleased] +## [0.2.0] - 2026-07-20 ### Added diff --git a/frontend/openapi.json b/frontend/openapi.json index 05577f7..37abe5e 100644 --- a/frontend/openapi.json +++ b/frontend/openapi.json @@ -1110,7 +1110,7 @@ }, "info": { "title": "QuantCockpit", - "version": "0.1.0" + "version": "0.2.0" }, "openapi": "3.1.0", "paths": { diff --git a/frontend/package.json b/frontend/package.json index 2e9b73e..2463639 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "quantcockpit-frontend", "private": true, - "version": "0.1.0", + "version": "0.2.0", "type": "module", "scripts": { "dev": "vite --host 127.0.0.1", diff --git a/pyproject.toml b/pyproject.toml index 5ee9042..08c5d6b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "quantcockpit" -version = "0.1.0" +version = "0.2.0" requires-python = ">=3.13" dependencies = [ "duckdb>=1.5.4", diff --git a/src/quantcockpit/api.py b/src/quantcockpit/api.py index f3b8c31..d2a93bb 100644 --- a/src/quantcockpit/api.py +++ b/src/quantcockpit/api.py @@ -4,6 +4,7 @@ import os from datetime import datetime, timezone +from importlib.metadata import version from pathlib import Path from typing import Annotated, Callable, Literal @@ -61,7 +62,12 @@ def create_app( configured_path = Path(database_path or os.environ.get("QUANTCOCKPIT_DB_PATH", "quantcockpit.duckdb")) service_clock = clock if clock is not None else _demo_clock_from_environment() - app = FastAPI(title="QuantCockpit", docs_url=None, redoc_url=None) + app = FastAPI( + title="QuantCockpit", + version=version("quantcockpit"), + docs_url=None, + redoc_url=None, + ) def get_service(): try: diff --git a/uv.lock b/uv.lock index 686f660..d6d9384 100644 --- a/uv.lock +++ b/uv.lock @@ -280,7 +280,7 @@ wheels = [ [[package]] name = "quantcockpit" -version = "0.1.0" +version = "0.2.0" source = { editable = "." } dependencies = [ { name = "duckdb" }, From 4b9a01a3d88b001cfc43c75cf7cbd7c9b2861760 Mon Sep 17 00:00:00 2001 From: elexingyu <48146084+elexingyu@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:26:33 +0800 Subject: [PATCH 18/18] ci: avoid duplicate feature branch runs --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8ab886d..7861172 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,7 @@ name: CI on: push: + branches: [main] pull_request: permissions:

dVR3gOL&6#nEowRLRhUtYu;dklSDF>chPQi>txw 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%0A5!hknP9opm_Own6u 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