4、数据获取与预处理:从交易所官网、财经数据平台获取龙虎榜数据,并进行清洗、标准化和存储
龙虎榜数据的价值高度依赖数据质量。原始数据分散在交易所官网、财经数据平台和第三方终端中,格式不一、字段命名混乱、缺失值和异常值频发。若未经清洗和标准化直接入库,后续的席位行为分析、游资风格识别和量化回测都将建立在不可靠的基础上。本章围绕“获取—清洗—标准化—存储”四条主线,构建一套可复用的龙虎榜数据工程链路,并给出字段级处理规范与实战案例。
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())
4.2 数据清洗:从原始到可用
核心原理:原始数据存在三类典型问题:结构性问题(字段缺失、类型错误)、语义性问题(单位不统一、名称含噪声)、逻辑性问题(买卖金额不匹配、日期异常)。清洗的目标是让数据满足“一行一记录、一列一属性、值域合法、逻辑自洽”的基本规范。
清洗步骤清单:
- 去重:按(交易日期、股票代码、席位名称、买入排名、卖出排名)五元组去重,保留最新一条。
- 类型转换:金额字段统一转为float(单位:万元),日期转为datetime类型,代码转为字符串并补齐6位。
- 缺失值处理:买入额或卖出额为空时,用0填充;席位名称为空时标记为“未知席位”。
- 异常值识别:单笔买入额超过该股当日成交额时,标记为可疑并人工复核。
- 名称归一化:去除席位名称中的全角空格、繁体字、括号内注释(如“机构专用(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%)。
总结复盘:数据获取与预处理是龙虎榜分析的“地基工程”。常见误区包括:① 只关注买入额而忽略卖出额,导致净额计算错误;② 未处理席位名称的别名问题,造成游资行为碎片化;③ 直接使用第三方数据而不与官网交叉验证,埋下数据质量隐患。建议建立每日数据质量监控看板,对缺失率、重复率、异常值比例进行持续跟踪,确保数据管道长期稳定运行。