14 KiB
上海房市投资研究系统架构与开发计划
0. 当前状态
当前项目是一个纯 Python 的研究内核 MVP:
- SQLite 存储
- 样例数据
- 板块指标计算
- Markdown 月报生成
- 命令行入口
它的价值是验证研究口径和指标框架。它不是最终系统形态。后续应演进为一个具备数据采集、资产库、模型、API、前端看板、报告和预警能力的长期研究平台。
1. 系统定位
目标是搭建一个面向上海房市长期投资判断的研究操作系统。系统最终要回答:
- 市场处在什么周期位置?
- 哪些板块值得重点跟踪?
- 哪些小区具有流动性、租金和稀缺性支撑?
- 合理买入价区间是多少?
- 什么信号触发买入、观望、卖出或换仓?
- 判断依据是否可复盘、可解释、可更新?
系统不追求单点预测“下月涨跌”,而追求持续形成稳定的投资判断流程。
2. 总体架构
flowchart LR
A["数据源<br/>官方/市场/手工/文档"] --> B["采集层<br/>Ingestion"]
B --> C["原始数据层<br/>Raw Lake"]
C --> D["标准化层<br/>Normalized Store"]
D --> E["特征与指标层<br/>Feature Mart"]
E --> F["模型层<br/>Scoring/Forecast/Scenario"]
F --> G["API 层<br/>Rust Axum"]
G --> H["前端<br/>React + TypeScript + shadcn/ui"]
F --> I["报告与预警<br/>周报/月报/观察池"]
D --> J["研究工作台<br/>Notebook/CLI"]
3. 推荐技术路线
3.1 推荐结论
长期看,推荐采用混合架构:
- 前端:TypeScript + React + shadcn/ui
- API 后端:Rust Axum + SQLx
- 分析与模型服务:Python,必要时引入 Rust 数据处理组件
- 主数据库:PostgreSQL + PostGIS
- 本地分析引擎:DuckDB + Parquet
- 数据处理:Python Polars 起步,Rust Polars/DataFusion 用于稳定高性能任务
- 后台任务:先用轻量 cron/脚本,后续升级 Prefect 或 Airflow
本项目按长期平台建设,因此不采用 FastAPI 过渡。API 层从第一版就采用 Rust Axum,Python 保留为分析、建模、数据实验和离线任务服务。
3.2 为什么不是纯 Python
纯 Python 很适合研究、建模和快速迭代,但当系统开始承载更多前端交互、权限、并发查询、任务调度和长期服务稳定性时,单体 Python 项目会逐渐变重。
更成熟的做法是:
- Python 专注数据、模型、研究逻辑。
- Rust API 专注服务边界、权限、查询、任务编排。
- 前端专注研究工作台和投资决策界面。
3.3 为什么不是纯 Rust
Rust 很适合高可靠服务和性能敏感 API,但房市研究最重的工作通常不是 API 性能,而是数据清洗、特征工程、统计建模、回测、报告解释和探索式分析。这些领域 Python 生态明显更成熟。
因此不建议把模型和研究逻辑全部用 Rust 重写。那会降低迭代速度。
4. Rust 后端 vs Python 后端
| 维度 | Rust 后端 | Python 后端 |
|---|---|---|
| 性能 | 很强,适合高并发、低延迟、重查询网关 | 足够支撑早期和中等规模内部系统 |
| 稳定性 | 编译期约束强,运行期类型错误少 | 依赖测试和类型检查,长期维护需更强纪律 |
| 开发速度 | 初期慢,类型和生命周期成本更高 | 很快,尤其适合快速验证业务逻辑 |
| 数据科学生态 | 可用但不如 Python 丰富 | 极强,Polars、pandas、statsmodels、sklearn 等成熟 |
| API 工程 | Axum + SQLx 很稳,适合长期服务 | FastAPI 开发快,OpenAPI 友好 |
| 团队门槛 | 较高 | 较低 |
| 部署 | 单二进制优势明显 | 依赖环境和包管理,容器化后可控 |
| 与模型集成 | 通常需要调用 Python 服务或共享数据库 | 原生集成最顺 |
| 推荐阶段 | 从第一版开始承担主 API、权限、查询网关 | 只保留为模型服务、数据任务、研究实验 |
推荐策略:
- 第一阶段:Rust Axum 建立主 API 和服务边界。
- Python 保持研究内核、数据处理、模型和报告生成。
- 前后端通过 OpenAPI 或共享 schema 对齐契约。
- 稳定、重复、高性能的数据处理任务可逐步迁入 Rust Polars/DataFusion。
本项目采用 Rust API + Python analytics 双服务作为默认路线。
4.1 Rust 数据处理 vs Python 数据处理
Rust 的数据处理能力并不弱。Polars 有 Rust 版本,DataFusion 本身就是基于 Rust 和 Apache Arrow 的高性能查询引擎,适合构建稳定、高性能、可嵌入的数据系统。
但对本系统来说,Python 仍然在以下方面更强:
- 探索式分析更快,交互式 Notebook、临时统计、画图、验证假设都更顺手。
- 统计建模和机器学习生态更完整,尤其是回归、时间序列、聚类、解释性分析、模型评估。
- 采集、清洗、Excel/CSV、报告、可视化周边库更丰富。
- 研究逻辑经常变化,Python 的迭代成本低。
Rust 更适合:
- API 查询层和权限层。
- 稳定的数据校验、标准化和导入管线。
- 大批量 CSV/Parquet 扫描、聚合、特征预计算。
- 需要长期运行、低内存占用、高并发的服务。
- 已经沉淀稳定的数据处理逻辑。
因此判断不是“Rust 弱”,而是“Rust 更工程化,Python 更研究化”。本系统的最佳分工是:
Rust:API、数据库访问、权限、稳定导入、稳定特征计算、高性能查询
Python:探索分析、模型实验、统计预测、报告解释、策略研究
5. 前端方案
你的偏好是 TypeScript + React + shadcn/ui,这个方向适合本系统。
推荐栈:
- Next.js App Router 或 Vite + React
- TypeScript
- shadcn/ui
- Tailwind CSS
- TanStack Query
- Recharts 或 ECharts
- MapLibre GL,用于地图和板块空间分析
- Zod,用于前端数据校验
选择建议:
- 如果要做完整产品、登录、路由、服务端渲染、报告页分享,选 Next.js。
- 如果只是本地研究工作台和内部 SPA,选 Vite + React 更轻。
我建议采用 Next.js,因为后续报告页、板块详情页、观察池和权限体系会自然变复杂。
6. 前端信息架构
第一版前端应直接进入研究工作台,不做营销式首页。
核心页面:
-
市场总览
- 上海整体成交、挂牌、库存、租金、利率、政策事件
- 周期状态判断
- 关键风险提示
-
板块地图
- 按综合评分、供应压力、租售比、价格动量着色
- 支持行政区、环线、地铁、产业标签筛选
-
板块详情
- 成交/挂牌/租金走势
- 新房供应与土地成交
- 小区排行
- 相似板块对比
-
小区观察池
- 自定义关注小区
- 合理买入价
- 挂牌变化
- 成交样本
- 风险标签
-
策略与情景
- 利率变化情景
- 政策松紧情景
- 收入/租金/供应变化情景
-
报告中心
- 周报
- 月报
- 板块专题
- 投资备忘录
7. 后端模块设计
7.1 API 模块
职责:
- 用户、权限、配置
- 板块、小区、指标查询
- 观察池管理
- 报告查询
- 模型结果查询
- 任务触发和状态查询
典型接口:
GET /api/market/overview?month=YYYY-MMGET /api/areasGET /api/areas/{area_id}/scoresGET /api/areas/{area_id}/metricsGET /api/neighborhoods/{id}POST /api/watchlistGET /api/reports/monthly/{month}POST /api/jobs/ingest
7.2 Analytics 模块
职责:
- 数据清洗
- 特征生成
- 板块评分
- 小区评分
- 异常检测
- 情景推演
- 报告生成
当前 Python 代码应逐步演进为这个模块。
7.3 Ingestion 模块
职责:
- 官方数据导入
- 市场数据导入
- 手工 CSV/Excel 导入
- 数据源版本记录
- 失败重试
- 采集日志
所有采集结果必须保留原始文件或原始响应,不直接覆盖。
7.4 Report 模块
职责:
- 周报/月报
- 板块专题
- 小区备忘录
- 组合观察报告
报告不应只是文本,应保留结构化结论,方便前端二次展示。
8. 数据架构
8.1 数据分层
raw 原始数据,保留来源、采集时间、文件哈希
bronze 初步解析,字段类型基本清理
silver 标准化实体,统一板块、小区、月份、口径
gold 指标、特征、模型输出、报告结论
8.2 核心实体
areas:板块districts:行政区neighborhoods:小区transactions:成交样本listings:挂牌样本rents:租赁样本new_projects:新房项目land_sales:土地成交policy_events:政策事件rates:利率area_monthly_features:板块月度特征neighborhood_monthly_features:小区月度特征model_runs:模型运行版本watchlists:观察池reports:报告
8.3 数据治理要求
每条关键数据至少记录:
- 来源
- 采集时间
- 原始字段
- 清洗规则版本
- 是否估算
- 是否人工修正
- 置信度
这是系统长期可信的核心。
9. 模型体系
9.1 第一阶段:可解释评分
- 流动性评分
- 价格动量评分
- 成交动量评分
- 租金支撑评分
- 安全边际评分
- 供应风险评分
- 政策/信贷环境评分
输出:
- 重点研究
- 观察池
- 中性观望
- 谨慎等待
9.2 第二阶段:相对估值
- 同板块小区比较
- 相似小区比较
- 同总价段比较
- 同楼龄/地铁距离/物业类型比较
- 历史价格分位
输出:
- 合理买入价区间
- 溢价/折价解释
- 替代标的推荐
9.3 第三阶段:预测与情景推演
先做情景推演,再做点预测。
情景变量:
- 利率
- 首付比例
- 限购/限贷政策
- 新房供应
- 租金变化
- 板块产业兑现
- 人口和就业变化
输出:
- 乐观/基准/谨慎情景
- 价格压力区间
- 流动性风险区间
- 买入触发条件
10. 推荐仓库结构
apps/
web/ React + TypeScript + shadcn/ui
api/ Rust Axum + SQLx
services/
analytics/ Python 指标、模型、报告
ingestion/ 数据采集与导入任务
packages/
contracts/ OpenAPI schema / shared types
config/ 共享配置
data/
raw/
bronze/
silver/
gold/
sample/
infra/
docker-compose.yml
migrations/
docs/
system_architecture_and_development_plan.md
research_framework.md
data_dictionary.md
tests/
当前 src/shanghai_housing 后续可以迁移到 services/analytics。
11. 开发路线
Phase 0:研究内核验证,已开始
目标:
- 建立基本数据表
- 建立板块评分
- 生成月报
- 验证指标口径
状态:
- 已完成 MVP。
Phase 1:数据底座
目标:
- 引入 PostgreSQL/PostGIS
- 建立 raw/bronze/silver/gold 数据分层
- 建立数据源版本记录
- 增加 CSV/Excel 导入
- 增加官方数据手工导入模板
交付:
- 可导入真实数据
- 可追踪数据来源
- 可复跑指标
Phase 2:API 与前端骨架
目标:
- 建立 API 服务
- 建立 React 前端
- 实现市场总览、板块列表、板块详情
- 前端接入真实 API
推荐实现:
- 前端:Next.js + TypeScript + shadcn/ui
- API:Rust Axum + SQLx
- 数据库:PostgreSQL/PostGIS
交付:
- 可浏览市场总览
- 可查看板块评分
- 可生成并查看月报
Phase 3:小区观察池
目标:
- 小区资产库
- 小区评分
- 合理买入价
- 关注列表
- 风险标签
交付:
- 小区筛选
- 观察池
- 标的对比
- 投资备忘录
Phase 4:模型与情景推演
目标:
- 历史分位
- 相似资产比较
- 异常成交检测
- 利率/政策/供应情景推演
交付:
- 板块和小区估值解释
- 买入价区间
- 情景报告
Phase 5:自动化与预警
目标:
- 定时数据更新
- 指标重算
- 报告自动生成
- 预警规则
交付:
- 周报自动生成
- 板块风险预警
- 观察池价格变动提醒
12. 工程质量要求
12.1 数据质量
- 所有数据有来源和时间戳
- 所有清洗规则版本化
- 样本数据和真实数据严格隔离
- 模型输出记录运行版本
12.2 API 质量
- OpenAPI 契约
- 统一错误格式
- 分页、排序、筛选
- 请求日志
- 慢查询追踪
12.3 前端质量
- 页面以研究工作流为中心
- 表格、图表、地图是核心,不做装饰性首页
- 所有图表口径可查看
- 所有评分可解释
- 重要结论可回溯到数据
12.4 测试
- 指标单元测试
- 数据导入测试
- API 契约测试
- 前端组件测试
- 端到端测试
13. 技术决策建议
推荐默认路线:
前端:Next.js + TypeScript + React + shadcn/ui
API:Rust Axum + SQLx
分析:Python + Polars + DuckDB
数据库:PostgreSQL + PostGIS
任务:先脚本/cron,后 Prefect 或 Airflow
图表:Recharts 起步,复杂图表可加入 ECharts
地图:MapLibre GL
Python 分析服务保留为长期组件:
API:Rust Axum 负责在线服务
Analytics:Python 负责研究、建模、报告和实验
Stable ETL:Rust Polars/DataFusion 可逐步承接稳定高性能任务
Contract:OpenAPI 或共享 schema
这条路线从第一天就按强工程化平台建设,同时保留 Python 的研究效率。
14. 官方资料参考
- React TypeScript 文档:https://react.dev/learn/typescript
- shadcn/ui 文档:https://ui.shadcn.com/
- Next.js 文档:https://nextjs.org/docs
- TanStack Query 文档:https://tanstack.com/query/latest/docs/framework/react/overview
- Recharts 文档:https://recharts.org/en-US/
- Axum 文档:https://docs.rs/axum/latest/axum/
- SQLx 文档:https://docs.rs/sqlx/latest/sqlx/
- Polars 文档:https://docs.pola.rs/
- DataFusion 文档:https://datafusion.apache.org/user-guide/introduction.html
- DuckDB 文档:https://duckdb.org/docs/
- PostgreSQL 文档:https://www.postgresql.org/docs/