← 返回 Skill 列表
extension
分类: 数据与分析无需 API Key

CFMMC 期货操盘手画像

CFMMC(中国期货市场监控中心)交易数据抓取与操盘手画像分析。从 investorservice.cfmmc.com 抓取投资者资金状况、期货/期权成交与持仓数据(含验证码 ddddocr 识别),存入本地 SQLite,通过持仓快照变化推断期权开平方向,输出多维度操盘手画像报告与可视化页面。触发场景:抓取 CFMMC 交易数据、批量回溯历史数据、分析交易者操作习惯与风格、生成操盘手画像报告、处理期货/期权成交持仓数据、验证码识别、构建交易者画像 Web 应用

person作者: user_a79304a1hubcommunity

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 次):

  1. GET https://investorservice.cfmmc.com/logout.do → 提取 org.apache.struts.taglib.html.TOKEN
  2. GET https://investorservice.cfmmc.com/veriCode.do?t={timestamp} → 下载验证码图片 → ddddocr 识别
  3. POST https://investorservice.cfmmc.com/login.do → 提交 TOKEN + userID + password + vericode
  4. 登录成功后获取新 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 大类:

  1. 资金状况分析 — 权益趋势、波动率、最大回撤、风险度分布、盈亏能力、交易活跃度
  2. 期货成交分析 — 品种偏好、买卖方向、开平仓习惯、交易规模、投机/套保偏好、盈亏表现、时间特征
  3. 期货持仓分析 — 持仓规模与方向、持仓盈亏、均价与结算价、持仓时间、保证金
  4. 期权成交分析 — 品种偏好、看涨/看跌分布、执行价偏好、交易规模、备兑行为
  5. 期权持仓分析 — 持仓结构、持仓成本与估值、交易编码
  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 查询统一采用参数绑定(? 占位符),表名前缀经过字符白名单校验(仅字母/数字/下划线)