IB 投资组合看板,支持多账户管理、IB FlexQuery 自动同步、实时行情刷新、持仓分析、业绩归因等功能。
本地单用户部署,数据存储在本地 PostgreSQL,无需联网即可查看分析结果。
- 📊 多账户总览 — 支持合并账户(Combined)和独立账户切换,实时显示总资产、收益、仓位分布
- 📈 业绩分析 — 多时间维度收益率、盈亏日历、交易热力图、回撤分析
- 📋 持仓明细 — 实时行情覆盖、成本基础计算、未实现盈亏、期权到期提醒
- 🔄 IB FlexQuery 自动同步 — 定时从 Interactive Brokers 拉取报表数据
- 💹 实时行情 — Finnhub + Yahoo Finance 双源报价,自动覆盖持仓市价
- 🔐 用户认证 — JWT 登录、游客模式、模块权限控制
- 📱 移动端适配 — 响应式布局,支持手机端浏览
- 后端: Python 3.11 + Flask + Gunicorn
- 数据库: PostgreSQL 15
- 缓存/队列: Redis
- 前端: React 18 + Vite + Tailwind CSS
- 任务队列: RQ (Redis Queue)
- Python 3.11+
- PostgreSQL 15
- Redis 7+
- Node.js 18+
git clone <repo-url>
cd ibdashboardpersonalpython3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtcd web
npm install
npm run build
cd ..复制 config/.env.example 为 config/.env 并填入你的凭证:
cp config/.env.example config/.env
# 编辑 config/.env需要填写的环境变量:
| 变量 | 说明 |
|---|---|
IB_QUERY_ID |
IB FlexQuery ID |
IB_TOKEN |
IB FlexQuery Token |
JWT_SECRET_KEY |
JWT 密钥(建议设置固定值,否则重启后需重新登录) |
DATABASE_URL |
PostgreSQL 连接地址 |
REDIS_URL |
Redis 连接地址 |
IB_PROXY |
代理地址(可选,中国大陆访问 IB API 可能需要) |
如何获取 IB Query ID 和 Token:登录 IB Account Management → Reports → Flex Queries → 创建 Activity 模板 → 保存后获得 Query ID;进入 Flex Web Service 页面启用服务并获取 Token。
createdb ib_dashboard
psql -d ib_dashboard -f db/schema.sql启动服务
python server_personal.py访问 http://localhost:8080
RQ Worker(后台任务,用于自动同步)
rq worker --url redis://localhost:6379/0编辑 config/server_config.json:
{
"users": {
"admin": {
"password_hash": "sha256:...",
"modules": {
"overview": true,
"positions": true,
"performance": true,
"details": true
},
"visible_accounts": ["combined", "u12345678"]
}
},
"accounts": {
"combined": {
"real_id": "COMBINED",
"file": "data/dashboard_combined.json",
"label": "全部账户",
"color": "#000000"
},
"u12345678": {
"real_id": "U12345678",
"file": "data/dashboard_U12345678.json",
"label": "主账户",
"color": "#6366f1"
}
}
}密码可通过
server_personal.py中的hash_password()函数生成。
编辑 web/src/config/features.js:
export const FEATURES = {
enablePromotion: false, // 推广弹窗开关
// ... 其他功能开关
};├── server_personal.py # 后端入口
├── config/ # 配置文件
├── db/ # 数据库 schema 和客户端
├── scripts/ # 数据导入、同步、行情脚本
│ ├── xml_to_postgres.py # XML 导入器
│ ├── sqlite_to_dashboard.py # Dashboard JSON 生成器
│ ├── market_data.py # 实时行情刷新
│ └── auto_refresh.sh # 一键刷新脚本
├── workers/ # RQ 后台任务
│ └── jobs_personal.py # 后台任务
├── web/ # React 前端
│ ├── src/
│ └── dist/ # 生产构建产物
├── data/ # 生成的 Dashboard JSON(.gitignore)
├── uploads/ # 上传的 XML 文件(.gitignore)
└── archive/ # 旧代码存档
python3 -c "
from workers.jobs_personal import flex_sync_job
print(flex_sync_job('personal'))
"python3 scripts/reimport_all.pypython3 -c "from scripts.market_data import scheduled_update_all; scheduled_update_all()"- 使用 systemd 管理 Gunicorn 和 RQ Worker 服务
- 配置反向代理(Nginx / Caddy / Cloudflare Tunnel)
- 定期备份
uploads/和数据库 - 设置 cron 定时执行行情刷新(每 30 分钟)
- IB API 在中国大陆访问可能超时,建议配置代理(
IB_PROXY环境变量)
⚠️ 切勿将 IB FlexQuery Token 提交到 Git。使用环境变量或config/.env(已被 .gitignore 排除)⚠️ 生产环境必须设置JWT_SECRET_KEY,不要使用默认值⚠️ 定期更换 IB Token,特别是在怀疑泄露时
MIT