报告问题
如果券商页面没有回答收益率的问题,该怎么看?
账户余额和持仓浮盈,回答不了完整的收益率问题。如果券商界面没有直观呈现时间加权收益率(TWR)或资金加权收益率(IRR),就需要按日期整理账户价值与外部资金流,才能分别看清投资本身的表现和实际投入资金的回报。两种口径回答的不是同一个问题。
这里以 IBKR 为例。它本身已有业绩分析工具,也通过 Flex 提供结构化报表。Portfolio Performance 读取这些记录,为一位投资者整理出独立的只读视图。顾问或家庭办公室可以有不同的报告需求,但相应的视图和访问规则并不是当前单用户系统的功能。
报表导入与页面读取,走两条路径
Google 身份验证控制私有 Dashboard 的访问。浏览器经由 Repository 读取 PostgreSQL 中的投资组合记录,没有连接 IBKR 或下单的接口。只有独立的 GitHub Actions Worker 会请求 Flex 报表。
计划任务或 Settings 中获授权的请求会启动 Worker。它检查数据库状态,取得 PostgreSQL advisory lock,再以有限退避轮询 Flex。返回的 XML 经过标准化和核对后,才在事务内幂等写入。验证失败时,最近一次成功导入的记录仍可供查看。
目前系统只服务一位获授权用户。若要给不同受众提供独立视图,需要增加相应的访问规则;多账户报告还需账户级数据分区。
每个视图回答一个具体问题
概览把期末净值与现金流调整后的收益放在一起。盈亏分析区分账户层面的构成与单只证券的期间贡献;Treemap 显示资金集中在哪里;风险页补上期末余额看不出的回撤。它们读取相同日期的记录,但各自回答不同的问题。
以下公开画面使用 Kaggle 标普 500 日收盘价数据集中事后选取的九只股票,区间为 2013 年 2 月 8 日至 2018 年 2 月 7 日。资金流、季度再平衡和交易费均为假设规则,而非事前验证的策略。该情景只计算价格变化,不含股息、利息或基准,也不展示真实账户。 Kaggle S&P 500 ↗








从 Flex XML 到有日期的投资组合记录
Flex XML 按报表区段返回。解析器把这些区段映射到账户快照、现金流、交易和持仓,并保留日期与币种金额。导入前,系统核对指定区段的总计以及快照之间的关系。
会计领域模型据此计算以 NAV 为基础的每日盈亏、收益率与证券贡献。界面把结果与对应日期、口径放在一起;读者可以从账户数字继续找到背后的时间序列或持仓。
结论
页面上的数字,应当有路可循。
私有系统有明确的限制:只有 Worker 能请求 Flex 数据,导入失败也不会覆盖最近一次成功的投资组合记录。Dashboard 只读取已保存的数据,不获得券商访问能力。
公开 Demo 同样把历史收盘价与假设交易分别标明。它用来展示界面和计算方法,不代表真实账户的投资结果。这条界线出现在图表之前,也是产品设计的一部分。
Live product
Portfolio Performance
一个只读的投资组合报告界面:集中查看业绩、现金流、持仓和风险,日常复盘无需进入交易会话。