4、数据获取与预处理:从交易所官网、财经数据平台获取龙虎榜数据,并进行清洗、标准化和存储

龙虎榜数据的价值高度依赖数据质量。原始数据分散在交易所官网、财经数据平台和第三方终端中,格式不一、字段命名混乱、缺失值和异常值频发。若未经清洗和标准化直接入库,后续的席位行为分析、游资风格识别和量化回测都将建立在不可靠的基础上。本章围绕“获取—清洗—标准化—存储”四条主线,构建一套可复用的龙虎榜数据工程链路,并给出字段级处理规范与实战案例。

龙虎榜数据工程链路 数据源层 交易所官网 东方财富/同花顺 Wind/聚宽/Tushare 获取层 HTTP请求/API调用 定时任务调度 增量/全量拉取 清洗层 去重/去空/类型转换 异常值识别 席位名称归一化 存储层 MySQL/PostgreSQL ClickHouse Parquet/CSV 标准化核心字段 trade_date(交易日期) | stock_code(代码) | stock_name(名称) | reason_type(上榜原因) | buy_amount(买入额) | sell_amount(卖出额) | net_amount(净额) | seat_name(席位名称) | seat_type(席位类型) | buy_rank(买入排名) | sell_rank(卖出排名) 统一格式:日期YYYY-MM-DD,金额单位万元,席位名称去除空格/括号统一,类型映射为“机构专用/游资/北向/散户/其他” 质量校验规则 ✓ 买入额+卖出额 > 0 ✓ 净额 = 买入额 - 卖出额 ✓ 日期不晚于当前交易日 常见脏数据 ✗ 席位名称含全角/半角空格 ✗ 金额单位混用(元/万元) ✗ 重复记录(同日同股同席位) 存储策略 明细表(日粒度) + 汇总表(月粒度) 分区键: trade_date 索引: (stock_code, trade_date)

4.1 数据源选型与获取策略

核心原理:龙虎榜数据的权威源头是沪深交易所官网,但官网仅提供最近几个交易日的榜单,且页面结构为HTML表格,不便于程序化解析。财经数据平台(东方财富、同花顺)和量化数据服务商(Tushare、Wind、聚宽)则提供历史数据回溯和结构化API,但存在字段口径差异和更新延迟。实际工程中通常采用“交易所官网为基准、第三方平台为补充”的双轨策略。

数据源 覆盖范围 更新时效 获取方式 优点 缺点
上交所/深交所官网 最近5个交易日 每日收盘后约17:00 HTTP请求+HTML解析 权威、免费、字段完整 历史数据需逐日爬取,反爬严格
东方财富/同花顺 2010年至今 实时推送 JSON API接口 历史全、字段丰富、含席位名称 字段口径与官网略有差异
Tushare Pro 2005年至今 每日更新 Python SDK 标准化程度高、文档完善 积分制,高频调用需付费
Wind/聚宽 全历史 实时 终端API 数据质量最高、附带机构分类 商业授权费用高

操作流程:推荐使用Python编写采集脚本,核心步骤包括:① 构造请求头模拟浏览器行为;② 解析JSON或HTML提取榜单字段;③ 按交易日增量拉取,避免重复请求;④ 设置重试机制和限速策略(建议间隔1-2秒)。以下为东方财富接口的简化示例:

import requests
import pandas as pd

def fetch_lhb(date):
    url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
    params = {
        "reportName": "RPT_DAILYBILLBOARD_DETAILSNEW",
        "columns": "ALL",
        "filter": f"(TRADE_DATE='{date}')",
        "pageSize": 500,
        "pageNumber": 1
    }
    resp = requests.get(url, params=params, timeout=10)
    data = resp.json()["result"]["data"]
    return pd.DataFrame(data)

# 示例:获取2025-01-15的龙虎榜数据
df = fetch_lhb("2025-01-15")
print(df[["SECURITY_CODE", "SECURITY_NAME", "BILLBOARD_NET_AMT"]].head())
经验提醒:交易所官网的“上榜原因”字段(如“日涨幅偏离值达7%”)是后续分析的重要维度,务必完整保留。第三方平台有时会省略该字段或使用简化描述,建议以官网为准进行交叉校验。

4.2 数据清洗:从原始到可用

核心原理:原始数据存在三类典型问题:结构性问题(字段缺失、类型错误)、语义性问题(单位不统一、名称含噪声)、逻辑性问题(买卖金额不匹配、日期异常)。清洗的目标是让数据满足“一行一记录、一列一属性、值域合法、逻辑自洽”的基本规范。

清洗步骤清单:

  1. 去重:按(交易日期、股票代码、席位名称、买入排名、卖出排名)五元组去重,保留最新一条。
  2. 类型转换:金额字段统一转为float(单位:万元),日期转为datetime类型,代码转为字符串并补齐6位。
  3. 缺失值处理:买入额或卖出额为空时,用0填充;席位名称为空时标记为“未知席位”。
  4. 异常值识别:单笔买入额超过该股当日成交额时,标记为可疑并人工复核。
  5. 名称归一化:去除席位名称中的全角空格、繁体字、括号内注释(如“机构专用(2)”→“机构专用”)。
案例拆解:某日数据中,同一席位“中国中投证券深圳深南大道证券营业部”出现三种写法:“中国中投证券深圳深南大道营业部”、“中投证券深南大道营业部”、“中国中投证券深圳深南大道证券营业部”。若不归一化,统计游资席位活跃度时会被拆成三个不同实体,导致排名失真。清洗规则应包含:去除“证券”后缀、统一“深圳/上海市”前缀、建立别名映射表。

4.3 标准化:字段口径与席位分类

核心原理:标准化的核心是建立统一的字段字典和维度编码。龙虎榜数据涉及两个关键维度:上榜原因和席位类型。上榜原因需映射为枚举值(如“日涨幅偏离值达7%”映射为“涨幅偏离”),席位类型需根据名称特征自动分类。

字段名 类型 标准化规则 示例
trade_date DATE YYYY-MM-DD格式 2025-01-15
stock_code VARCHAR(6) 去空格,补零 000001
buy_amount DECIMAL(18,2) 统一为万元 12345.67
seat_name VARCHAR(100) 去除空格/括号注释 机构专用
seat_type VARCHAR(20) 映射为枚举值 游资
reason_type VARCHAR(30) 映射为枚举值 涨幅偏离

席位类型自动分类规则:

  • 机构专用:名称包含“机构专用”或“机构席位”。
  • 北向资金:名称包含“沪股通”或“深股通”。
  • 游资:名称包含“证券营业部”且非机构/北向,通常为知名游资席位(如“华鑫证券上海分公司”)。
  • 散户:名称包含“散户”或“普通账户”。
  • 其他:无法归类的标记为“未知”。
风险提示:席位名称中的“分公司”与“营业部”在业务上可能属于同一控制主体,但名称不同。建议建立“营业部—分公司—总部”的层级映射表,避免重复计数。

4.4 存储架构与数据校验

核心原理:龙虎榜数据量级为每日约100-300条记录,年数据量约5-8万条,属于轻量级数据。但考虑到后续需要与行情数据、财务数据关联分析,建议采用关系型数据库(MySQL/PostgreSQL)存储明细数据,同时导出Parquet格式供离线分析使用。

推荐表结构设计:

CREATE TABLE lhb_daily (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    trade_date DATE NOT NULL,
    stock_code VARCHAR(6) NOT NULL,
    stock_name VARCHAR(20),
    reason_type VARCHAR(30),
    buy_amount DECIMAL(18,2),
    sell_amount DECIMAL(18,2),
    net_amount DECIMAL(18,2),
    seat_name VARCHAR(100),
    seat_type VARCHAR(20),
    buy_rank INT,
    sell_rank INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_date_stock_seat (trade_date, stock_code, seat_name, buy_rank, sell_rank)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

数据校验流程:入库前执行三层校验——完整性校验(检查必填字段是否为空)、业务逻辑校验(净额=买入-卖出,且值不超过当日成交额)、一致性校验(与交易所官网原始数据抽样比对,误差率应低于0.5%)。

实战场景:某量化团队需要构建“游资席位月度活跃度”指标。原始数据中,同一游资席位在不同月份可能更换营业部名称(如从“国泰君安上海江苏路”迁至“国泰君安上海分公司”)。通过建立席位别名映射表,将历史数据统一映射到当前名称,再按月聚合计算交易次数和净买入额,最终得到连续12个月的活跃度趋势。该过程中,清洗和标准化环节占整体工作量的60%以上,但正是这些基础工作保证了后续分析的可靠性。

总结复盘:数据获取与预处理是龙虎榜分析的“地基工程”。常见误区包括:① 只关注买入额而忽略卖出额,导致净额计算错误;② 未处理席位名称的别名问题,造成游资行为碎片化;③ 直接使用第三方数据而不与官网交叉验证,埋下数据质量隐患。建议建立每日数据质量监控看板,对缺失率、重复率、异常值比例进行持续跟踪,确保数据管道长期稳定运行。