CFMMC 操盘手画像(中文文档)
本文件为
SKILL.md的中文完整版说明文档,供中文使用者阅读;SKILL.md为英文版技能定义,两者内容一一对应。
概述
从中国期货市场监控中心(CFMMC)投资者服务系统抓取期货/期权交易数据,进行多维度分析,生成操盘手画像报告。
核心流程:登录(验证码 OCR)→ 按日期抓取数据 → 存入 SQLite → 多维度分析 → 画像报告。
功能范围
本工具查询使用者提供凭据的那一个 CFMMC 账户;验证码 OCR(ddddocr)用于自动化完成该账户的登录步骤。
数据安全设计
- 出站网络守卫:所有 HTTP 请求经过
GuardedSession(requests.Session子类),目标主机不在ALLOWED_HOSTS = {"investorservice.cfmmc.com"}中时在建立连接前抛出异常 - 登录凭据(账号/密码)、验证码识别结果与会话 TOKEN 的发送目标为上表中的 CFMMC 官方域名;日志语句输出占位符(如
TOKEN: 已获取),不输出值 - 客户名称、内部资金账户在解析源头即脱敏(
mask_text),控制台、JSON 导出、入库等任何输出路径都只含掩码值 - SQLite 表结构中不含身份类列,5 张表仅存交易/持仓/资金数值数据(表名带用户 ID 前缀,见“数据库表结构”)
- 分析报告(JSON/HTML)中的用户 ID 脱敏输出;报告模板内置占位符 ID
- 抓取的数据持久化到单个本地 SQLite 文件(
data/cfmmc.db),代码中不存在远端存储路径 - SQL 日期过滤采用参数绑定(
?占位符),表名前缀经过字母/数字/下划线格式校验
网络端点与数据流
全部网络请求仅发往以下一个已披露的公网 HTTPS 服务:
| 主机 | 用途 | 发送内容 |
|------|------|----------|
| https://investorservice.cfmmc.com | CFMMC 官方投资者服务(登录 + 数据查询) | userID、密码、验证码、会话 TOKEN、交易日期 |
无其他接收端。抓取的数据持久化到本地 SQLite 单文件(data/cfmmc.db)。
依赖版本说明:requirements.txt 中的版本均以 == 固定,并已逐一在 PyPI 核验真实存在(requests 2.34.2、ddddocr 1.6.1、beautifulsoup4 4.15.0 均为当前最新稳定版)。
功能列表
- 按日期抓取 CFMMC 交易数据(资金状况、期货成交/持仓、期权成交/持仓)
- 批量回溯历史交易数据(最近 N 天,自动跳过周末)
- 对交易数据进行多维度分析(资金、品种、方向、盈亏、风险等)
- 生成操盘手画像 HTML 报告
- 画像 Web 应用(登录、报告管理、公开报告浏览)
- 验证码图片识别(ddddocr)
前置条件
环境变量配置
| 环境变量 | 说明 | 必填 | 示例 |
|----------|------|------|------|
| CFMMC_USER_ID | CFMMC 投资者服务系统用户 ID | 是 | 0052*****015 |
| CFMMC_USER_PWD | CFMMC 投资者服务系统密码 | 是 | your_password |
也可通过命令行参数 --user / --pwd 指定 CFMMC 账号。
数据库说明:使用 SQLite,无需安装数据库服务器。数据库文件默认存放在 skill 目录下的
data/cfmmc.db(首次运行自动创建data目录和表结构),无需任何配置。如需指定其他位置,可用--db /path/to/cfmmc.db参数指定。
Python 依赖
ddddocr # 验证码 OCR 识别
requests # HTTP 请求
beautifulsoup4 # HTML 解析
# sqlite3 # Python 内置,无需安装
数据库表结构
使用 SQLite 数据库,默认文件路径为 skill 目录下的 data/cfmmc.db(可通过 --db 参数指定其他位置)。
5 张数据表,表名前缀 {userID}_,均含 trade_date(TEXT, YYYY-MM-DD)和自增 id(INTEGER PRIMARY KEY AUTOINCREMENT)。
| 表后缀 | 中文名 | 关键字段 |
|--------|--------|----------|
| capital_status | 资金状况 | prev_balance, client_equity, close_profit_loss, risk_ratio, margin_occupied, available_funds, margin_call |
| futures_trade | 期货成交汇总 | contract, buy_sell, spec_hedge_arb, trade_price, lots, turnover, open_close, commission, close_profit_loss |
| futures_position | 期货持仓汇总 | contract, buy_position, buy_avg_price, sell_position, sell_avg_price, floating_profit_loss, trade_margin |
| option_trade | 期权成交汇总 | product_contract, underlying_contract, option_type, strike_price, buy_sell, premium_unit, volume, premium, is_covered, commission |
| option_position | 期权持仓汇总 | product_contract, underlying_contract, option_type, strike_price, buy_position, premium_avg_price, sell_position, sell_premium_avg_price, prev_settle_price, today_settle_price, trade_margin, trade_code |
完整字段映射(中文→英文列名)见 scripts/cfmmc_fetcher.py 中的 COLUMN_NAME_MAP。
工作流程
1. 抓取单日数据
python scripts/cfmmc_fetcher.py --user <userID> --pwd <password> --date 20250618
python scripts/cfmmc_fetcher.py --date 20250618 --no-db --output result.json
登录流程(CFMMCFetcher.login(),最多重试 3 次):
- GET
https://investorservice.cfmmc.com/logout.do→ 提取org.apache.struts.taglib.html.TOKEN - GET
https://investorservice.cfmmc.com/veriCode.do?t={timestamp}→ 下载验证码图片 → ddddocr 识别 - POST
https://investorservice.cfmmc.com/login.do→ 提交 TOKEN + userID + password + vericode - 登录成功后获取新 TOKEN,复用 session 查询数据
数据查询:POST https://investorservice.cfmmc.com/customer/setParameter.do,payload 含 TOKEN + tradeDate + byType=date。
页面解析:BeautifulSoup 解析 HTML,按关键词匹配 5 个 front-table 表格。资金状况表为 key-value 两栏布局,其余 4 表为标准行列表格。解析后自动建表(如不存在)→ 删除该日期旧数据(防重复)→ 插入新数据。
2. 批量抓取历史数据
python scripts/batch_fetch.py # 默认最近 370 天
python scripts/batch_fetch.py --days 30 # 最近 30 天
python scripts/batch_fetch.py --start 20250601 # 从 6/1 到昨天
python scripts/batch_fetch.py --start 20250601 --end 20250618
一次登录复用 session,自动跳过周六日。Session 过期时自动重新登录。请求间隔 1 秒防限流。
3. 多维度分析
python scripts/analysis.py --user <userID> # 全部分析
python scripts/analysis.py --user <userID> --start 2025-01-01 --end 2025-06-30
python scripts/analysis.py --user <userID> --category capital # 仅资金状况
python scripts/analysis.py --user <userID> --output report.json
分析维度详见 references/analysis_dimensions.md,涵盖 6 大类:
- 资金状况分析 — 权益趋势、波动率、最大回撤、风险度分布、盈亏能力、交易活跃度
- 期货成交分析 — 品种偏好、买卖方向、开平仓习惯、交易规模、投机/套保偏好、盈亏表现、时间特征
- 期货持仓分析 — 持仓规模与方向、持仓盈亏、均价与结算价、持仓时间、保证金
- 期权成交分析 — 品种偏好、看涨/看跌分布、执行价偏好、交易规模、备兑行为
- 期权持仓分析 — 持仓结构、持仓成本与估值、交易编码
- 跨表综合分析 — 期货 vs 期权偏好、交易风格画像(日内/持仓、趋势/逆势、专注/分散)、时间模式、绩效归因、异常行为检测
期权开平方向推断:期权成交表无开平列,通过对比相邻交易日持仓快照(buy_position/sell_position 变化)推断开平方向。
4. 生成画像报告
报告格式参考 assets/report_template.html(模板文件,原中文名 画像.html 已改为英文名),需包含:
- 资金曲线和收益曲线图表
- 多维度分析结果的可视化呈现
- 报告标题格式:
{分数}-{报告日期}-{用户id(脱敏)}-{一句话总结} - 用户 ID 脱敏:前 4 位和后 2 位用
*替换 - 报告支持公开/取消公开
5. 验证码识别(独立工具)
python scripts/captcha_ocr.py # 识别 vericode 文件夹下所有图片
python scripts/captcha_ocr.py --image captcha.jpg # 识别单张图片
基于 ddddocr,支持 jpg/png/gif/bmp/webp 格式及无后缀文件。
Web 应用需求
Web 应用规格见 references/web.md,核心功能:
- 登录模块:网站注册/登录(邮箱注册);登录后查询用户绑定的保证金账号;未绑定则引导输入;验证通过后后台线程抓取最近一年数据
- 报告页面:两个 Tab(我的报告 / 公开报告);按期限(月/季/半年/年/全部)生成报告;报告可公开/取消公开
- 状态栏:头像 + 用户 ID + VIP 标签 + 状态徽章(就绪/抓取中/异常)+ 最新数据日期 + 报告数量
- 多账户:一个用户支持多个保证金账户
- 响应式:自适应手机和电脑屏幕
设计说明
- 重复抓取同一天数据时,程序先删除该日期旧数据再写入,避免重复记录
- 验证码识别存在误差,登录流程内置最多 3 次重试
- Session 过期后批量抓取流程会自动检测并重新登录
- 请求间隔固定 1 秒,避免触发 CFMMC 限流
- SQLite 数据库为单文件存储,直接复制
.db文件即可备份和迁移 - 数据库默认位于 skill 目录
data/cfmmc.db,通过--db参数可指定其他位置 - SQL 查询统一采用参数绑定(
?占位符),表名前缀经过字符白名单校验(仅字母/数字/下划线)
微信扫一扫