Skip to content

moneychen003/IB_dashboard

Repository files navigation

IB Dashboard

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+

1. 克隆项目

git clone <repo-url>
cd ibdashboardpersonal

2. 安装 Python 依赖

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

3. 安装前端依赖

cd web
npm install
npm run build
cd ..

4. 配置环境变量

复制 config/.env.exampleconfig/.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。

5. 初始化数据库

createdb ib_dashboard
psql -d ib_dashboard -f db/schema.sql

6. 启动服务

启动服务

python server_personal.py

访问 http://localhost:8080

RQ Worker(后台任务,用于自动同步)

rq worker --url redis://localhost:6379/0

配置说明

账户配置(Personal 版)

编辑 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/                    # 旧代码存档

常用操作

手动触发 FlexQuery 同步

python3 -c "
from workers.jobs_personal import flex_sync_job
print(flex_sync_job('personal'))
"

重新导入全部 XML

python3 scripts/reimport_all.py

手动刷新实时行情

python3 -c "from scripts.market_data import scheduled_update_all; scheduled_update_all()"

生产部署建议

  1. 使用 systemd 管理 Gunicorn 和 RQ Worker 服务
  2. 配置反向代理(Nginx / Caddy / Cloudflare Tunnel)
  3. 定期备份 uploads/ 和数据库
  4. 设置 cron 定时执行行情刷新(每 30 分钟)
  5. IB API 在中国大陆访问可能超时,建议配置代理(IB_PROXY 环境变量)

安全提示

  • ⚠️ 切勿将 IB FlexQuery Token 提交到 Git。使用环境变量或 config/.env(已被 .gitignore 排除)
  • ⚠️ 生产环境必须设置 JWT_SECRET_KEY,不要使用默认值
  • ⚠️ 定期更换 IB Token,特别是在怀疑泄露时

License

MIT

About

No description, website, or topics provided.

Resources

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors