Portfolio Manager

投资组合管理器

角色: developer
状态: 进行中
技术栈:
PythonTypeScriptReact

Portfolio Manager

投资组合管理作为一个重要且复杂的任务,目前市面上免费、无限制使用且数据全面、指标多样的产品罕见。在此次参加WGHS(Wharton Global High School Investment Competition)的契机下,我决定开发一个名为Portfolio Manager的应用程序,旨在为用户提供一个强大且易于使用的投资组合管理工具。

作为一个拥有真实需求的用户,我深知市场上工具的不足之处以及用户的痛点,因此我将以下需求列为一等公民目标:

  1. 数据准确性:确保所有财务数据的准确性和及时更新。
  2. 指标全面:提供多种财务指标,帮助用户全面了解其投资组合的表现。
  3. 速度与响应性:确保应用程序在处理大型投资组合时依然保持快速响应。
  4. 免费且无限制使用。

因此,在pipeline设计中,我选择了使用Yahoo Finance和IBKR作为数据源,确保了数据的准确性、时效性和全面性,包含了全球所有主流交易所的标的。在技术选型上,我使用Python作为后端,TypeScript + React作为前端,确保了应用的高性能和良好的用户体验。

后端设计

我使用FastAPI作为后端的API框架,开发了一套全面的指标计算工具,使用了Pandas和NumPy这样的高性能库,这些库大量使用C作为底层计算框架,确保了速度。同时,我精心设计了数据模型和API接口,确保每个Portfolio从前端发起请求到后端计算返回结果仅有一次网络往返。

经过多次设计和验证,pipeline分为五层顺序执行:

  1. 数据获取层:异步读取数据,同时读取投资组合内所有资产的价格数据和基准指数数据,并缓存结果。
  2. NAV计算层:使用缓存的数据计算投资组合的净值历史。
  3. 基础指标计算层:并行计算基础指标和基准对比指标。
  4. 全部指标计算层:串行计算所有指标,复用基础数据缓存。
  5. 返回最终结果给前端。

这个并行架构确保了即使面对超过60个资产的portfolio,也能够在三秒内完成所有数据读取、计算和响应。

目前,主要用户是俱乐部内部成员,因此需求量不大。即使面对未来的大规模用户,该架构设计也有极高的冗余性,目前我并未实现LRU cache、向量化算子、异步IO、全并行化等优化。这些冗余设计保证了未来的可扩展性。

前端设计

前端使用Next.js框架搭配React和TypeScript构建,采用TailwindCSS进行样式管理。数据可视化方面使用Recharts绘制净值曲线、收益分布等图表,Lucide提供图标支持。

前端通过SSE(Server-Sent Events)接收后端的流式计算结果,实现指标的渐进式加载,提升用户体验。整体界面支持中英文双语切换。