期货交易盈亏统计系统

期货交易盈亏统计系统

自动化处理 CFMMC(中国期货市场监控中心)结算单,提供成交记录管理、逐笔对冲盈亏计算、可视化统计分析的一站式工具。

功能特性

多期货公司支持

  • 多账户管理 — 支持多个期货公司账户,可在 Web 管理界面自由增删改
  • CFMMC 账户配置 — 每个账户独立存储期货公司名称、监控中心账号、密码
  • 数据隔离 — 各账户的成交记录、持仓、盈亏按期货公司标识存储,互不干扰
  • 合并统计 — 首页总览显示全部账户合计数,同时按期货公司拆分显示盈亏卡片
  • 持仓区分 — 持仓明细表显示每笔持仓所属的期货公司

数据自动化

  • 结算单下载 — Selenium 自动化登录 CFMMC,下载月度/每日结算文件
  • 结算单解析 — 自动解析 xlsx/xls 结算单,提取成交明细、持仓明细、资金汇总
  • 夜盘处理 — 解析成交时间字段,自动判断日盘/夜盘(21:00-次日6:00),还原实际成交日期
  • 平仓明细配对 — 解析结算单「平仓明细」Sheet,精确匹配每笔开平仓

盈亏计算

  • 逐笔对冲算法 — 采用 FIFO 先进先出原则进行开平仓配对
  • 结算单优先 — 优先使用结算单原始平仓盈亏数据,回退至 FIFO 计算
  • 精确手续费分配 — 按每手持仓比例分配手续费,余数补偿法确保总和一致
  • 双浮动盈亏 — 同时显示按结算价和按收盘价计算的浮动盈亏

Web 可视化界面

标签页 功能
📈 总览 统计卡片 + 4 个图表(净盈亏走势、盈亏分布、品种占比、月度趋势)
📅 每日明细 按月查看每日资金变动与交易统计
📋 成交记录 可搜索/筛选的成交明细表,标注日盘/夜盘时段(支持分页)
💰 盈亏明细 逐笔对冲盈亏详情,底部汇总行(支持分页)
📦 持仓记录 每日持仓汇总,显示期货公司、结算价与收盘价两种浮动盈亏(支持分页)
🔍 持仓明细 每笔开仓详细记录,按日期筛选,显示期货公司、结算价/收盘价/两种浮动盈亏(支持分页)
🏦 资金曲线 资金变动曲线 + 交易日明细表(支持分页)
📑 按合约统计 各合约盈亏汇总(支持分页)
🏷️ 按品种统计 各品种盈亏汇总,费用与结算单一致(支持分页)
⚙️ 管理 多期货公司账户管理、收盘价管理、手工交易录入、数据导出、交易日志、修改密码、系统日志

收盘价管理

  • 独立存储data/close_prices.json 单独保存各合约收盘价,不依赖数据库
  • 自动下载 — 点击管理界面的「🌐 从互联网下载」,从新浪财经(AKShares)获取所有历史品种的收盘价
  • 刷新机制 — 支持从交易记录刷新当前持仓品种收盘价
  • 手动编辑 — 管理界面直接输入修改任意合约收盘价
  • 双浮动盈亏 — 持仓页面同时显示「浮动盈亏(结算)」和「浮动盈亏(收盘)」两个指标

数据导出

  • XLSX 导出 — 成交记录、盈亏明细、每日结算、品种统计(带隔行色样式)
  • PDF 导出 — 带日期范围和账户水印的专业报告(WeasyPrint,支持中文)

交易日志

  • 手动记录每笔交易的心得与感受
  • 支持星级评分(⭐1-5)、标签分类
  • 按日期/合约/方向筛选

用户管理

  • 修改密码
  • 系统日志查看(Web 服务、每日同步、月度同步、应用日志)
  • 管理员账户管理(添加/删除用户)

多期货公司账户管理

  • ⚙️ 管理 → 🏦 多账户 中自由添加/编辑/删除 CFMMC 账户
  • 每个账户包含:期货公司名称、监控中心账号、密码、别名
  • 数据入库时自动关联期货公司,持仓明细和统计按公司区分
  • 页面顶部下拉框可按期货公司筛选查看数据

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
futures/
├── main.py # 命令行入口(7个子命令)
├── requirements.txt # Python 依赖
├── Dockerfile # Docker 容器构建
├── docker-compose.yml # Docker Compose 配置
├── auto_sync.sh # 每日自动同步脚本
├── auto_monthly_sync.sh # 月度自动同步脚本
├── config/
│ └── settings.py # 项目配置(账户、合约乘数等)
├── src/
│ ├── web_app.py # Flask Web 应用(精简版,~600行)
│ ├── web_auth.py # 用户认证模块
│ ├── web_routes/ # Blueprint 路由模块
│ │ ├── data_bp.py # 数据查询路由
│ │ ├── sync_bp.py # 同步与收盘价路由
│ │ ├── admin_bp.py # 管理路由
│ │ └── trade_bp.py # 手工交易与日志路由
│ ├── close_prices.py # 收盘价管理(JSON 独立存储)
│ ├── database.py # SQLite 数据库操作
│ ├── settlement_parser.py # 结算单解析器(xlsx/xls/html)
│ ├── pnl_calculator.py # 逐笔对冲盈亏计算引擎
│ ├── reporter.py # 报表生成器
│ ├── cfmmc_crawler.py # CFMMC 网站爬虫
│ ├── monthly_crawler.py # 月度结算单爬虫
│ ├── captcha_solver.py # 验证码识别
│ └── trading_calendar.py # 交易日历
├── data/
│ ├── futures.db # SQLite 数据库
│ ├── close_prices.json # 收盘价独立存储
│ ├── varieties.json # 期货品种配置(三大交易所+中金所)
│ └── cache/ # 结算单缓存文件
└── output/
├── js/ # 前端 JS
│ ├── app.js # 应用主逻辑(从 web_app.py 分离)
│ ├── jquery.min.js
│ ├── bootstrap-table.min.js
│ ├── bootstrap-table-init.js
│ └── echarts.min.js
├── css/
│ ├── app.css # 应用样式(从 web_app.py 分离)
│ └── bootstrap-table.min.css
└── favicon.svg # 网站图标

快速开始

安装依赖

1
2
pip install -r requirements.txt
pip install openpyxl reportlab weasyprint akshare

启动 Web 界面

1
2
3
python main.py web
# 访问 http://localhost:8080
# 默认账号: admin / admin888

命令行工具

1
2
3
4
5
6
7
8
9
# 全量流程(下载→解析→计算→报表)
python main.py all

# 单独步骤
python main.py fetch # 下载结算单
python main.py parse # 解析结算单
python main.py calc # 计算盈亏
python main.py report # 生成报表
python main.py user # 用户管理

Docker 部署

构建镜像

1
2
3
4
5
6
# 使用 Docker Compose(推荐)
docker compose build
# 镜像名: futures-trading:latest

# 或直接构建
docker build -t qxz5637/futures-trading:latest .

启动容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 主机端口 : 容器端口(容器内固定 8080,主机端口可自定义)
# 例: -p 8888:8080 则访问 http://localhost:8888

# 使用 Docker Compose(推荐)
docker compose up -d

# 或直接运行
docker run -d \
--name futures-trading \
-p 8080:8080 \
-v $(pwd)/data:/app/data \
-v $(pwd)/output:/app/output \
-v $(pwd)/tmp:/app/tmp \
-e TZ=Asia/Shanghai \
--restart unless-stopped \
qxz5637/futures-trading:latest

# 查看日志
docker logs -f futures-trading

# 停止
docker compose down
# 或 docker stop futures-trading && docker rm futures-trading

# 访问 http://localhost:8080
# 默认账号: admin / admin888

迁移到其他服务器

1
2
3
4
5
6
7
8
9
10
# 源服务器:导出镜像为文件
docker save qxz5637/futures-trading:latest -o futures-trading.tar

# 目标服务器:导入镜像并启动
docker load -i futures-trading.tar
docker run -d --name futures-trading -p 8080:8080 \
-v $(pwd)/data:/app/data \
-v $(pwd)/output:/app/output \
-e TZ=Asia/Shanghai --restart unless-stopped \
qxz5637/futures-trading:latest

数据持久化data/(数据库+收盘价+品种配置)、output/(导出文件+静态资源)、tmp/(运行时缓存)通过 -v 挂载到容器外。迁移时复制 data/ 目录即可保留所有历史数据和收盘价配置。

其他用户使用说明

不同用户使用该镜像时,需修改以下配置:

1. CFMMC 账户(自动下载结算单)

编辑 config/settings.py,替换为你的监控中心账号:

1
2
3
4
CFMMC_ACCOUNT = {
"user_id": "你的监控中心账号",
"password": "你的监控中心密码",
}

修改后重新构建镜像,或通过 volume 挂载自定义的 config/settings.py

1
docker run -d ... -v $(pwd)/custom_settings.py:/app/config/settings.py ...

2. CFMMC 多账户(自动下载结算单)

启动容器后,登录 Web 界面 → ⚙️ 管理 → 🏦 多账户,添加各期货公司的监控中心账号。数据保存在 data/futures.dbcfmmc_accounts 表中,容器重启不丢失。

4. 收盘价数据

首次启动后,进入 Web 界面 → ⚙️ 管理 → 📈 收盘价,点击 🌐 从互联网下载 按钮自动获取所有历史品种的最新收盘价。数据保存在 data/close_prices.json,容器重启不丢失,也可手动编辑该文件。

5. 首次启动

空数据库首次启动时,页面会显示空数据。需先执行全量同步(点击页面 🔄 全量同步 按钮),或通过命令行导入结算单。

自动同步

任务 时间 说明
每日结算 交易日 19:00 下载当日结算单并解析
月度结算 每月1日 08:00 下载上月月度结算单并解析
1
2
3
# cron 配置
00 19 * * * /home/qxz5637/futures/auto_sync.sh # 每日
00 08 1 * * /home/qxz5637/futures/auto_monthly_sync.sh # 月度
  • 每日:使用 trading_calendar.py(基于 chinese_calendar)判断交易日,自动跳过周末和法定公休日
  • 月度:每月1日自动下载上个月的月度结算文件,校验笔数/手数/手续费/盈亏是否一致。若发现差异,以月度结算单为准自动修正
  • 日志文件:/tmp/auto_sync.log(每日)、/tmp/auto_monthly_sync.log(月度)

技术栈

  • 后端: Python 3, Flask, SQLite, AKShare (财经数据接口)
  • 前端: Bootstrap 5(本地文件,无需 CDN), Bootstrap Table(全表分页), ECharts, jQuery
  • 数据解析: openpyxl, xlrd, BeautifulSoup
  • 自动化: Selenium, ddddocr (验证码识别)
  • 报表: openpyxl (XLSX), WeasyPrint (PDF 含中文)
  • 部署: Docker 容器化,cron 定时同步
  • 行情接口: AKShare(新浪财经/东方财富,免费获取收盘价)

数据说明

  • 品种配置存储在 data/varieties.json,覆盖上海、大连、郑州三大商品交易所及中金所
  • 合约代码自动生成(当前年度 + 下年度全月份),已到期合约自动过滤
  • 所有金额数据以结算单(daily_summary 表)为权威来源
  • 月度结算单为最高优先级:每月1日下载上月月度结算单后,自动覆盖修正该月所有每日数据的偏差
  • 收盘价独立存储data/close_prices.json 单独保存各合约收盘价,可由新浪财经(AKShare)自动下载或手动编辑

期货交易盈亏统计系统
https://www.qxz5637.top/2026/06/27/期货交易盈亏统计系统/
作者
文心
发布于
2026年6月27日
许可协议