一个面向中国 A 股市场的全栈投研系统,用来把价值投资研究流程串成一套可落地的工作台。
它不是单一的”估值计算器”,而是围绕以下研究闭环构建的:
- 看市场当前处于什么阶段(估值、情绪、广度、资金面)
- 找到估值、质量、动量兼具的候选股票
- 深入查看个股财务、行业位置、估值区间和技术面
- 将候选标的纳入自选股持续跟踪,目标价命中自动推送通知
- 通过投资备忘录和复盘记录沉淀决策过程
项目采用 FastAPI + Vue 3 + TimescaleDB + Redis + Celery + Docker Compose,默认以 Docker 方式一键启动。
QVS 当前更适合以下场景:
- A 股价值投资研究与候选池筛选
- 个股基本面与估值的辅助判断
- 行业横向比较与市场情绪观察
- 自选股跟踪与投资复盘记录
它当前不属于:
- 自动交易系统
- 回测与组合优化平台
- 完整券商交易终端
- 多用户 SaaS 投研平台
- 展示上证指数、沪深 300、深证成指、创业板指等主要指数
- 展示行业热力图,支持按
PE / PB快速观察行业估值 - 展示基于融资余额与市场 PB 分位计算的情绪指标
- 市场广度快照:上涨 / 下跌 / 平盘家数、涨跌停、大涨大跌分布、领涨领跌股
- 首页缓存展示”近期价值信号”,用于快速查看高分候选标的
- 采集微博舆情、股吧帖子等社区文本
- 使用词典规则和可选
FinBERT做情绪打分 - 按小时 / 按日生成情绪快照并落库到 TimescaleDB 超表
- 输出
z-score、PB 十年分位、流动性分值、恐惧贪婪指数、风险摘要 - 前端提供市场时钟、周期象限、趋势曲线、帖子明细等可视化
- 情绪过热 / 过冷、目标价命中等事件会写入站内通知中心
- 手动多因子筛选:
PE / PB / PS / ROE / 毛利率 / 净利率 / 流动比率 / 负债权益比 / 市值 / 行业 - 自动筛选:
/screener/auto-screen支持多算法并跑graham/graham+moat:价值 + 护城河叠加momentum:MA 多头排列 + 突破 + 相对强度共振canslim:O'Neil 七因子成长股
- 首页”价值信号”与自动选股共用同一套筛选引擎
- 支持筛选结果导出 CSV、空结果给出行业命中诊断
- 提供行业列表、行业估值统计、行业成分股列表
- 计算行业
PE / PB / ROE中位数 - 在行业详情页中查看估值分布和成分股横向对比
- 支持从本地数据库数据和实时数据做兜底融合
- 个股实时价格、成交量、市值、估值指标
- 日 / 周 / 月 K 线,支持前复权、后复权、不复权
- 多期财务报表查看与同比指标展示
- 多年平均
EPS / 净利润,帮助识别”便宜但不稳定”的标的 - 公司资料、主营业务、概念标签、护城河得分
- 内嵌质量分析模块,如
Piotroski F-Score - 技术指标面板:均线、MACD、KDJ、RSI、布林带、量能、技术面文字解读
单股估值(前端工具 Tab):
Monte Carlo DCFQuality-Adjusted Graham NumberNCAV / NNWCCAN SLIM七因子Piotroski F-Score
全市场扫描(均支持行业过滤、市值 / ST 过滤、候选池采样、Redis 30 分钟缓存):
Magic Formula扫描(Joel Greenblatt)Davis Double-Click扫描(戴维斯双击:EPS 增速 + 估值扩张)RS Rating + 52 周新高突破扫描(O'Neil 动量因子,1-99 百分位打分)
可调用但暂未接入前端的后端接口:
EPVMagic Formula单股评分Moat ScoreGraham 7 Criteria
专门的 A 股资金面模块(/capital-flow/*):
- 北向资金:沪股通 / 深股通净流入历史、累计净买入、北向持股 TOP 榜
- 龙虎榜:近 N 日龙虎榜明细、上榜原因、买卖席位净额
- 融资余额:沪深两市融资 / 融券余额趋势,多线对比
前端 资金面 页面用 ECharts 柱图 / 多线图 + 持仓明细表格呈现。
- 自选股增删改查,支持多列排序 / 筛选 / 对比分析
- 目标价跟踪:交易时段每 15 分钟刷新一次命中状态,命中触发站内通知
- 投资备忘录(买前逻辑)
- 投资日记(买后复盘)
- 当前为单用户模式(
user_id=”default”),后续可扩展为多用户
- 顶部导航集成通知铃铛、未读计数、下拉列表
- 系统事件(目标价命中、情绪观测异常等)统一入库
- 支持标记已读 / 全部已读
市场仪表盘 / 情绪观测台 / 资金面
↓
自动选股(价值 / 动量 / CAN SLIM / 魔法公式 / 戴维斯双击 / RS 领涨)
↓
行业分析 / 个股详情 / 估值 + 技术工具
↓
加入自选股持续跟踪(目标价命中 → 通知中心)
↓
记录投资备忘录与复盘
用户访问
|
Nginx
+----------------+----------------+
| |
Vue 3 Frontend FastAPI Backend
(Vite + TypeScript + Antd) (REST API)
| |
| +-----------------------------+
| | |
| TimescaleDB Redis
| (时序 / 落库存储) (缓存 / 结果共享)
| |
| +-------------+---------------+
| |
| Celery
| (定时采集 / 刷新)
| |
+-----------------------------------------------+
AkShare / 新浪 / 腾讯 /
雪球 / 同花顺 / 巨潮 /
东方财富 / 股吧 / 微博
系统采用”实时拉取 + 本地落库(TimescaleDB)+ Redis 缓存”混合模式:
- 实时数据:
AkShare及其封装的新浪、腾讯、东方财富、巨潮、同花顺、雪球等源 - 情绪 / 舆情:股吧、微博
- A 股资金面:
stock_hsgt_*(沪深港通)、stock_lhb_*(龙虎榜)、上交所 / 深交所融资融券 - 落库数据:
- 股票基础信息
stocks - 行情快照
stock_quotes - 财报指标
financial_reports - 行业估值
industry_valuations - 自选股
watchlist - 投资记录
investment_records - 情绪帖子 / 情绪快照
sentiment_posts、sentiment_snapshots(TimescaleDB 超表) - 通知中心
notification_messages
- 股票基础信息
- 缓存(Redis,典型 TTL 15~30 分钟):
- 市场概览、市场广度、行业列表与估值
- 个股快照、技术指标
- 价值信号、各扫描器结果(按参数 hash 缓存)
- 资金面北向 / 龙虎榜 / 融资余额快照
- 应用启动后会立即触发一次”首页价值信号”后台构建任务
Celery Beat负责日常定时刷新行情、财报、行业估值、自选股目标价、情绪快照- 目标价命中 / 情绪异常事件由定时任务写入通知中心
- 前端页面优先读取接口聚合结果,不直接拼接底层数据源
quantitative-value-system/
├── backend/ # FastAPI 后端
│ ├── app/
│ │ ├── api/v1/ # REST API
│ │ ├── core/ # 配置 / 数据库 / Redis / 安全
│ │ ├── models/ # SQLAlchemy 模型
│ │ ├── schemas/ # Pydantic Schema
│ │ └── services/
│ │ ├── akshare/ # 数据获取与映射
│ │ ├── analysis/ # 估值与筛选算法
│ │ └── scheduler/ # Celery 定时任务
│ ├── alembic/ # 数据库迁移
│ └── pyproject.toml
├── frontend/ # Vue 3 前端
│ ├── src/
│ │ ├── api/ # 请求层
│ │ ├── components/ # 组件
│ │ ├── layouts/ # 布局
│ │ ├── router/ # 路由
│ │ ├── stores/ # Pinia 状态管理
│ │ └── views/ # 页面
├── nginx/ # 反向代理配置
├── scripts/ # 初始化 / 种子脚本
├── docs/ # 扩展文档
├── docker-compose.yml
├── docker-compose.prod.yml
└── README.md
前端导航与后端模块基本一一对应:
市场概览-> 市场指数、行业热力图、市场情绪、市场广度、价值信号情绪观测台-> 情绪快照、市场时钟、周期象限、帖子明细股票筛选-> 手动多因子筛选股票详情-> 行情 / K 线 / 财务 / 技术指标 / 估值工具行业分析-> 行业列表、估值统计、行业成分股自选股-> 候选池跟踪、目标价监控、对比分析投资记录-> 备忘录 / 交易复盘量化工具-> 估值模型 + Magic Formula / Davis Double / RS 领涨三大全市场扫描资金面-> 北向资金 / 龙虎榜 / 融资余额AI 分析-> 当前为占位页,未接入真实 LLM 分析链路
git clone https://github.com/longyi-xw/quantitative-value-system.git
cd quantitative-value-system
cp .env.example .env
# 根据本地环境修改 .env
docker compose up -d --build启动后可访问:
- 前端首页:
http://localhost - 后端 Swagger:
http://localhost/docs - 健康检查:
http://localhost/health
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --buildcd frontend
npm install
npm run dev默认开发地址:
- 前端:
http://localhost:5173 - Vite 会将
/api代理到http://localhost:8000
如果你不通过 Docker 运行后端,可参考仓库中的 Python 依赖配置自行准备环境。后端应用入口为:
cd backend
uvicorn app.main:app --host 0.0.0.0 --port 8000注意:
- 后端依赖 TimescaleDB 与 Redis
alembic upgrade head需要先执行- 部分行情与财务接口首次拉取会比较慢,属于正常现象
.env.example 中已经提供了默认项,常用配置如下:
| 变量 | 说明 |
|---|---|
POSTGRES_SERVER |
TimescaleDB / PostgreSQL 主机 |
POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DB |
TimescaleDB / PostgreSQL 连接信息 |
REDIS_HOST / REDIS_PORT / REDIS_PASSWORD |
Redis 连接信息 |
BACKEND_CORS_ORIGINS |
后端跨域白名单 |
SECRET_KEY |
JWT 密钥预留 |
AKSHARE_TIMEOUT |
数据源超时控制 |
TIMESCALEDB_ENABLED |
是否启用 TimescaleDB 模式与展示标记 |
FINBERT_ENABLED |
API / 手动刷新是否开启 FinBERT 情绪分析 |
CELERY_FINBERT_ENABLED |
Celery 定时任务是否启用 FinBERT,默认关闭以降低常驻内存 |
CELERY_WORKER_CONCURRENCY |
Celery worker 并发数,默认 2 |
CELERY_WORKER_MAX_TASKS_PER_CHILD |
Celery 子进程处理任务上限,达到后自动回收 |
STARTUP_VALUE_SCREENER_ENABLED |
后端启动时是否立即启动首页价值信号常驻刷新 |
BACKEND_DB_POOL_SIZE / BACKEND_DB_MAX_OVERFLOW |
API 进程数据库连接池大小 |
CELERY_SYNC_DB_POOL_SIZE / CELERY_SYNC_DB_MAX_OVERFLOW |
Celery 同步任务数据库连接池大小 |
OPENAI_API_KEY / ANTHROPIC_API_KEY |
AI 分析预留配置 |
当前 Celery Beat 已配置以下任务(定义在 backend/app/services/scheduler/tasks.py):
| 任务 | 调度 | 说明 |
|---|---|---|
update_daily_market_data |
工作日 16:00 |
更新股票基础信息和当日行情 |
calculate_industry_valuations |
工作日 17:00 |
计算行业 PE/PB/ROE 中位数 |
update_financial_data |
周六 20:00 |
更新全市场财务报表数据 |
refresh_watchlist_target_status |
工作日 09:00-15:59 每 15 分钟 |
自选股目标价命中检测,命中入库并发送通知 |
refresh_sentiment_observatory |
每日 08:10-22:10 定时刷新 |
刷新情绪观测台快照 |
refresh_value_signals |
每 6 小时 | 刷新首页价值信号缓存 |
value_screener_loop |
可选的后端启动预热任务 | 在 API 进程内刷新首页价值信号 |
GET /api/v1/market/overviewGET /api/v1/market/industry-valuationGET /api/v1/market/sentimentGET /api/v1/market/breadthGET /api/v1/market/breadth-detailsGET /api/v1/sentiment/dashboardPOST /api/v1/sentiment/refresh
GET /api/v1/stocks/listGET /api/v1/stocks/searchGET /api/v1/stocks/{code}GET /api/v1/stocks/{code}/technicalGET /api/v1/stocks/{code}/financialGET /api/v1/stocks/{code}/historyGET /api/v1/stocks/{code}/company-infoGET /api/v1/industry/listGET /api/v1/industry/list-with-statsGET /api/v1/industry/{name}/stocksGET /api/v1/industry/{name}/valuation
POST /api/v1/screener/runPOST /api/v1/screener/auto-screen— 参数algorithms:graham / graham+moat / momentum / canslimGET /api/v1/screener/presetsGET /api/v1/screener/industry-paramsGET /api/v1/screener/value-signalsPOST /api/v1/analysis/canslimPOST /api/v1/analysis/piotroskiPOST /api/v1/analysis/piotroski-by-codeGET /api/v1/analysis/dcf-params/{code}POST /api/v1/analysis/dcfGET /api/v1/analysis/graham-params/{code}POST /api/v1/analysis/graham-numberGET /api/v1/analysis/ncav-params/{code}POST /api/v1/analysis/ncavPOST /api/v1/analysis/epvPOST /api/v1/analysis/magic-formulaPOST /api/v1/analysis/moat-scorePOST /api/v1/analysis/graham-criteriaPOST /api/v1/analysis/magic-formula-scan— 全市场魔法公式扫描POST /api/v1/analysis/davis-double-scan— 戴维斯双击扫描POST /api/v1/analysis/rs-breakout-scan— O'Neil RS Rating + 52 周突破扫描
GET /api/v1/capital-flow/northboundGET /api/v1/capital-flow/northbound/holdingsGET /api/v1/capital-flow/dragon-tigerGET /api/v1/capital-flow/margin
GET /api/v1/watchlistPOST /api/v1/watchlistPUT /api/v1/watchlist/{code}DELETE /api/v1/watchlist/{code}GET /api/v1/investment-recordsPOST /api/v1/investment-recordsPUT /api/v1/investment-records/{record_id}DELETE /api/v1/investment-records/{record_id}GET /api/v1/notificationsPOST /api/v1/notifications/{notification_id}/readPOST /api/v1/notifications/mark-all-read
为了避免 README 过度包装,这里明确写出当前实现边界:
AI 分析页面和接口仍然是占位实现,尚未接入真实 LLM 推理链路- 系统当前为单用户模式,自选股和投资记录默认绑定到
user_id="default" - 前端请求层已预留 token 注入逻辑,但仓库内尚未提供完整登录 / 权限系统
- 资金面依赖 AkShare 外部源,遇到源限流 / 节假日空数据时会返回空集合由前端提示
- 个别行业接口在 Docker 环境下会因为外部源稳定性问题走缓存或兜底逻辑
- 目前没有配套自动化测试目录,测试基础设施仍需补齐
如果你准备继续把它打磨成更完整的投研系统,建议优先考虑以下方向:
- 补齐真实 AI 研究助手,将系统内已有的行情、财务、行业、情绪、资金面数据组织成结构化上下文
- 引入账户体系、权限控制和多用户隔离
- 从”自选股”升级到”持仓与交易流水”,形成完整投资生命周期
- 增加回测、策略收益归因、组合风险控制
- 扩展通知渠道:目前已有站内通知,可接入邮件 / 飞书 / 企业微信
- 完善测试、监控、数据质量校验和异常告警
- 情绪观测台接入 TimescaleDB 的改造说明: docs/sentiment-observatory-timescaledb.md
本项目仅用于学习、研究和投研辅助,不构成任何投资建议。所有估值结果、筛选结果和情绪分析结果都依赖外部数据源与模型假设,使用前请自行核验。
MIT