一、量化数据全景:数据源分类、频率与获取方式
做量化投研,说白了就是跟数据打交道。我经常跟团队里新人说,你策略再牛,模型再花哨,数据源没搞明白,一切都是空中楼阁。今天咱们就来聊聊量化数据的全景图——数据从哪来、长什么样、怎么拿到手。
核心观点:量化数据是策略的「原材料」,数据质量直接决定策略上限。我见过太多人花几个月调参,结果发现是数据有脏值——嗯,这种坑踩过一次就记住了。
1.1 数据源分类:三大阵营
量化数据按来源,我习惯分成三类:行情数据、财务数据、另类数据。这三类数据各有各的脾气,咱们一个个说。
1.1.1 行情数据
行情数据是最基础的,说白了就是价格和成交量。包括开盘价、收盘价、最高价、最低价、成交量、成交额这些。A股市场里,沪深交易所的Level-2行情算是比较精细的,能看到逐笔成交和十档盘口。
常见字段:
- 时间戳(精确到毫秒甚至微秒)
- 开盘价、收盘价、最高价、最低价
- 成交量、成交额
- 涨跌幅、换手率
- 盘口数据(买一卖一、买五卖五)
个人经验:我在做高频策略时发现,不同交易所的时间戳精度不一样。上交所的Level-2行情时间戳是毫秒级,深交所是微秒级。如果你做跨市场套利,这个差异必须处理,否则信号会错位。
1.1.2 财务数据
财务数据是基本面分析的命根子。包括资产负债表、利润表、现金流量表,还有各种衍生指标(PE、PB、ROE等)。
关键点:
- 财报有季节性:一季报、中报、三季报、年报
- 数据有滞后性:年报截止日是次年4月底
- 要注意会计准则差异(比如新旧收入准则)
避坑指南:我曾经用Wind拉财务数据,发现某公司ROE突然飙升,差点直接买入。后来一查,是因为公司卖了一套房产,属于非经常性损益。所以财务数据一定要做「扣非」处理,否则会被表面数字骗了。
1.1.3 另类数据
另类数据是近年来的热门。包括舆情数据(新闻、社交媒体)、卫星图像、电商数据、供应链数据等。这类数据的特点是:非结构化、量大、噪声多。
常见类型:
- 新闻情感分析(比如用NLP处理财经新闻)
- 搜索指数(百度指数、谷歌趋势)
- 供应链数据(比如港口集装箱吞吐量)
- 招聘数据(某公司招聘岗位激增,可能预示扩张)
我的看法:另类数据是「信息差」的来源。但处理成本高,清洗难度大。我建议新手先从行情和财务数据入手,等基本功扎实了再碰另类数据。
1.2 数据频率:Tick、分钟、日线
数据频率决定了你能做什么级别的策略。频率越高,数据量越大,噪声也越多。
| 频率 | 典型用途 | 数据量(单只股票/天) | 常见问题 |
|---|---|---|---|
| Tick级 | 高频交易、做市策略 | 数万条 | 数据量大、噪声多、需要降噪 |
| 分钟级 | 日内策略、统计套利 | 240条(1分钟线) | 需处理缺失值、异常值 |
| 日线 | 趋势跟踪、均值回归 | 1条 | 复权处理、停牌处理 |
1.2.1 Tick数据
Tick数据是逐笔成交数据。A股市场里,Level-2行情能提供逐笔成交,但数据量巨大。一只活跃股票一天可能有几万笔成交。
处理要点:
- 需要做「去重」处理(同一毫秒可能有重复数据)
- 需要做「时间对齐」(不同股票的时间戳可能不同步)
- 需要做「异常值过滤」(比如价格突然跳变)
经验之谈:我处理Tick数据时,习惯先做「时间戳标准化」。把时间戳统一成纳秒级整数,然后按时间排序。这一步看似简单,但能避免后面很多坑。
1.2.2 分钟数据
分钟数据是Tick数据聚合而来的。1分钟线就是每1分钟内的开盘、收盘、最高、最低、成交量。这是日内策略最常用的数据频率。
常见问题:
- 集合竞价时段的数据处理(9:15-9:25)
- 午休时段(11:30-13:00)的数据缺失
- 尾盘集合竞价(14:57-15:00)的特殊处理
1.2.3 日线数据
日线数据是最常用的。但要注意复权问题。前复权和后复权会影响价格序列的连续性。
避坑指南:我曾经用后复权数据做回测,结果发现策略收益被高估了。后来才意识到,后复权会改变历史价格,导致回测结果失真。我现在的习惯是:用前复权做回测,用后复权做分析。
1.3 数据获取方式:API、爬虫、数据库
数据怎么拿到手?主要有三种方式。每种方式各有优劣,我根据自己的经验说说。
1.3.1 API获取
API是最规范的方式。国内常用的数据API有:
- Wind API(机构常用,收费)
- Tushare(开源,免费但有频率限制)
- 聚宽、米筐等量化平台的API
- 交易所官方API(如上交所Level-2)
# 以Tushare为例,获取日线数据
import tushare as ts
# 设置token
ts.set_token('your_token_here')
pro = ts.pro_api()
# 获取平安银行日线数据
df = pro.daily(ts_code='000001.SZ',
start_date='20240101',
end_date='20241231')
print(df.head())
个人建议:API获取数据时,一定要做「断点续传」。我写了个小脚本,每次请求前先检查本地数据库里已有数据的最新日期,然后只请求缺失的部分。这样既省时间,又避免被API限流。
1.3.2 爬虫获取
爬虫适合获取公开数据,比如财经新闻、公司公告、社交媒体数据。但要注意合规问题。
常用工具:
- Requests + BeautifulSoup(简单页面)
- Selenium(动态页面)
- Scrapy(大规模爬取)
合规提醒:我曾经爬某财经网站的数据,结果被对方发了律师函。后来才知道,有些数据虽然公开,但网站有版权声明。所以爬虫前一定要看robots.txt和用户协议,别给自己惹麻烦。
1.3.3 数据库获取
数据库是数据存储和管理的核心。量化投研常用的数据库有:
- MySQL/PostgreSQL(关系型,适合结构化数据)
- MongoDB(文档型,适合非结构化数据)
- InfluxDB(时序数据库,适合高频数据)
- ClickHouse(列式存储,适合分析查询)
# 从MySQL读取数据示例
import pymysql
import pandas as pd
# 连接数据库
conn = pymysql.connect(
host='localhost',
user='quant',
password='password',
database='quant_data'
)
# 查询日线数据
query = """
SELECT trade_date, open, high, low, close, volume
FROM daily_data
WHERE ts_code = '000001.SZ'
AND trade_date BETWEEN '2024-01-01' AND '2024-12-31'
ORDER BY trade_date
"""
df = pd.read_sql(query, conn)
conn.close()
我的习惯:我一般用PostgreSQL存结构化数据(行情、财务),用MongoDB存非结构化数据(新闻、舆情)。数据量大的时候,会用ClickHouse做分析查询。嗯,这套架构用了三年,挺稳的。
1.4 知识体系总览
下面这张图是我自己画的,把量化数据全景梳理了一遍。你保存下来,以后做数据清洗和特征工程时,可以对照着看。
这张图把今天讲的内容串起来了。从上到下看:先确定数据源(行情、财务、另类),再选频率(Tick、分钟、日线),最后决定怎么拿(API、爬虫、数据库)。每一步都有坑,但每一步也都有套路。
总结一句话:量化数据没有「最好」的,只有「最合适」的。你的策略需要什么频率、什么精度、什么时效性,决定了你应该用哪类数据、怎么获取。别盲目追求高频,也别忽视数据质量——这两条是我用真金白银换来的教训。