基于财新数据(CXDA)API 的公募基金数据可视化 Web 应用,支持基金搜索、净值走势、收益对比、K 线行情、资产配置、重仓股票等多维度分析。
- 支持按基金代码(如 000001)或基金名称(如 华夏)搜索
- 搜索结果展示基金名称、代码、类型
- 提供热门基金快捷入口:华夏成长、易方达中小盘、沪深300ETF、白酒指数
- 展示单位净值与累计净值双轴折线图
- 支持自定义日期范围查询
- 快捷选择:近 30 天 / 90 天 / 180 天 / 1 年
- 底部滑动条支持区间缩放
- 多周期收益对比柱状图:近 1 周 / 近 1 月 / 近 1 季 / 近 1 年
- 同时展示净值增长率与收益率
- 涨跌颜色区分(红涨绿跌)
- 标准 K 线图(开盘、收盘、最高、最低)
- 下方成交量柱状图联动
- 支持时间范围筛选
- 仅上市基金(如 ETF)支持此功能
- 饼图:各类资产占净值比例
- 柱状图:各类资产市值分布
- 自动过滤占比极低的类别,避免图表杂乱
- 水平柱状图展示前 10 大重仓股
- 显示股票名称、代码、占净值比例、市值
- 支持搜索基金指数
- 多周期走势切换:周 / 月 / 季 / 年
- 展示收盘价、最高价、最低价
- 主题切换:支持亮色 / 暗色主题,偏好本地持久化
- 响应式布局:适配桌面和移动端
- 加载状态:数据请求时展示 loading 动画
- 空数据处理:API 无数据或失败时显示友好提示
所有用户操作和 API 调用均被记录,支持双写存储。
| 类型 | 路径 | 说明 |
|---|---|---|
| JSON 日志 | logs/query_log.jsonl |
每行一条 JSON,方便文本查看 |
| SQLite 数据库 | logs/query_log.db |
结构化存储,支持 SQL 查询分析 |
每次后端 API 请求自动记录:
| 字段 | 说明 |
|---|---|
| ts | 时间戳 |
| method | 请求方法(GET/POST) |
| path | 接口路径 |
| query_args | 请求参数 |
| api_skill | 对应的财新 API skill 名 |
| fund_code | 基金代码 |
| status_code | 响应状态码 |
| duration_ms | 耗时(毫秒) |
| error | 错误信息 |
| 动作标识 | 说明 |
|---|---|
| search | 搜索基金 |
| select_fund | 从搜索结果选择基金 |
| quick_select | 点击热门基金快捷按钮 |
| switch_tab | 切换图表标签页 |
| nav_range | 净值图切换时间范围 |
| kline_range | K 线图切换时间范围 |
| index_search | 搜索基金指数 |
| toggle_theme | 切换主题 |
-- 查看最近 20 条 API 调用
SELECT ts, path, api_skill, fund_code, status_code, duration_ms
FROM api_log ORDER BY id DESC LIMIT 20;
-- 统计各接口调用次数
SELECT api_skill, COUNT(*) as cnt, AVG(duration_ms) as avg_ms
FROM api_log WHERE api_skill IS NOT NULL
GROUP BY api_skill ORDER BY cnt DESC;
-- 查看用户行为分布
SELECT action, COUNT(*) as cnt
FROM user_action_log GROUP BY action ORDER BY cnt DESC;
-- 查看某天的操作记录
SELECT * FROM user_action_log WHERE ts LIKE '2026-05-24%';| 接口路由 | 财新 Skill | 用途 |
|---|---|---|
| /api/fund/search | getDFundBasicInfoByCond-G | 基金基本信息查询 |
| /api/fund/nav | getDFundNetValByCond-G | 基金净值数据 |
| /api/fund/performance | getFundNvPerfWeekByCond-G | 周收益表现 |
| /api/fund/performance | getFundNvPerfMonthByCond-G | 月收益表现 |
| /api/fund/performance | getFundNvPerfQtrByCond-G | 季度收益表现 |
| /api/fund/performance | getFundNvPerfYearByCond-G | 年度收益表现 |
| /api/fund/kline | getFundDayQuoByCond-G | 上市基金日行情 |
| /api/fund/asset-alloc | getDFundPfAssetAlloc1ByCond-G | 资产配置 |
| /api/fund/stock-holding | getDFundPfStkAlloc1ByCond-G | 重仓股票持仓 |
| /api/index/search | getIndCodeInfo3ByCond-G | 基金指数信息 |
| /api/index/trend | getFundIndexMarWeekByCond-G | 指数周行情 |
| /api/index/trend | getFundIndexMarMonthByCond-G | 指数月行情 |
| /api/index/trend | getFundIndexMarQtrByCond-G | 指数季行情 |
| /api/index/trend | getFundIndexMarYearByCond-G | 指数年行情 |
| /api/fund/market-perf | getDFundMarFerfByCond-G | 上市基金多周期行情 |
数据来源:财新数据 CXDA(http://cxapi.ccxe.com.cn/cxda)
┌─────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 浏览器 │────→│ Nginx │────→│ Gunicorn │────→│ Flask App │
│ ECharts │ │ (反向代理) │ │ (WSGI服务器) │ │ (Python) │
└─────────────┘ └──────────────┘ └──────────────┘ └──────┬───────┘
│
┌──────────────────────┼──────────────┐
↓ ↓ ↓
┌──────────────┐ ┌───────────────┐ ┌──────────────┐
│ cxda_client │ │ query_logger │ │ mock_data │
│ (财新API对接) │ │ (日志记录) │ │ (模拟数据) │
└──────────────┘ └───────────────┘ └──────────────┘
| 层级 | 技术 |
|---|---|
| 前端 | HTML5 + CSS3 + JavaScript (ES6+) + ECharts |
| 后端 | Python + Flask |
| 生产服务器 | Gunicorn (WSGI) + systemd |
| 数据源 | 财新数据 CXDA REST API |
| 日志存储 | SQLite + JSONL 文件 |
| 部署环境 | 阿里云 ECS (CentOS) |
fund-visualization/
├── app.py # Flask 主应用(路由、API 中间件)
├── cxda_client.py # 财新 API 客户端(认证、请求、解码)
├── mock_data.py # 模拟数据生成器
├── query_logger.py # 查询日志模块(SQLite + JSONL 双写)
├── deploy.sh # 一键部署脚本
├── requirements.txt # Python 依赖
├── .env # 环境变量配置(API KEY)
├── templates/
│ └── index.html # 主页面模板
├── static/
│ ├── css/
│ │ └── style.css # 样式(亮/暗主题)
│ └── js/
│ └── app.js # 前端逻辑(图表渲染、交互、埋点)
└── logs/
├── query_log.jsonl # JSON 行日志
└── query_log.db # SQLite 数据库
cd fund-visualization
pip install -r requirements.txt
python app.py
# 访问 http://127.0.0.1:5000前置条件:阿里云 ECS 实例,CentOS/Ubuntu 系统
部署方式:
- 通过 WinSCP 上传项目文件夹至服务器
/root/fund-visualization/ - 执行一键部署脚本:
bash /root/fund-visualization/deploy.sh- 阿里云安全组放行 5000 端口(TCP 入方向)
部署脚本自动完成:
- 检测并安装 Python3 环境
- 创建虚拟环境并安装依赖
- 配置 systemd 服务(开机自启 + 崩溃自动重启)
- 开放防火墙端口
- 启动服务并输出访问地址
服务管理命令:
systemctl status fund-viz # 查看状态
systemctl restart fund-viz # 重启
systemctl stop fund-viz # 停止
journalctl -u fund-viz -f # 实时日志本应用使用独立端口(5000),与现有 80 端口的网站互不影响:
| 应用 | 端口 | 地址 |
|---|---|---|
| 现有网站 | 80 | http://你的服务器IP |
| 基金可视化平台 | 5000 | http://你的服务器IP:5000 |
# 财新数据 API 密钥(必填)
CXDA_USER_KEY=你的API密钥
# API 基础地址
BASE_URL=http://cxapi.ccxe.com.cn/cxda
# Token 缓存(自动管理,请勿手动修改)
AUTH_TOKEN=
AUTH_TOKEN_EXPIRE=- 配置了
CXDA_USER_KEY→ 使用财新真实数据 - 未配置 → 自动降级为模拟数据模式