量化选股如何获取历史行情数据

企业微信

为什么历史行情数据是量化选股的基础

量化选股的核心逻辑在于通过历史数据寻找市场规律,进而构建能够产生超额收益的选股模型。无论是基于技术指标的多因子策略,还是依赖财务数据的基本面策略,其研发过程都依赖于完整、准确的历史行情数据作为回测基础。若数据存在缺失、错误或口径不一致的问题,即使策略逻辑本身具有有效性,回测结果也会产生严重偏差,导致实盘表现与历史回测大相径庭。

历史行情数据在量化选股中的主要作用体现在三个方面。其一,为策略回测提供原材料,模拟策略在历史时间段内的买卖信号生成与收益表现。其二,支撑特征工程构建,通过对历史价量数据的加工处理,提取出具有预测力的因子变量。其三,用于策略样本外检验,将策略置于未参与建模的历史数据中进行验证,评估策略的泛化能力与稳健性。因此,获取高质量的历史行情数据是开展量化选股工作的首要环节。

量化选股如何获取历史行情数据

主流数据获取渠道对比分析

市场上获取历史行情数据的渠道可以分为三大类别,各类别在数据完整性、更新时效、使用成本等方面存在明显差异。

免费开源数据接口是个人投资者与初创量化团队的首选方案。国内市场常用Tushare Pro接口,该平台提供A股、基金、期货、期权等多品种历史数据,注册后可免费获取部分数据权限,付费后可解锁更高频率与更大容量数据。国外市场则以Yahoo Finance、Alpha Vantage等接口为主,支持美股、港股等全球主要市场的行情数据获取。免费接口的优势在于零成本入门,但通常存在数据延迟、更新不稳定、接口调用频率限制等不足。

付费商业数据平台提供更为专业化的数据服务。国内主要供应商包括Wind万得、同花顺iFinD、Choice东方财富等,这些平台提供分钟级甚至Tick级别的深度行情数据,涵盖财务数据、复权因子、停牌除权等完整信息,数据质量经过严格校验。国际供应商如Bloomberg、Refinitiv、FactSet等面向机构投资者,提供全球跨市场的统一数据接口。付费平台的优势在于数据覆盖全面、质量可靠、接口稳定,适合机构级量化团队使用,但年费成本通常较高。

交易所直连与券商API是专业量化机构采用的方式。通过交易所或券商提供的API接口直连交易系统,获取实时行情与历史数据推送,数据延迟最低且完整性最高。这种方式需要具备一定技术能力与资质申请,适合高频交易与对数据时效性要求极高的场景。

Python环境下的数据获取实操

Python在量化领域的主导地位很大程度上源于其丰富的数据获取生态。以下介绍几种主流的数据获取实现方式。

使用Tushare获取A股历史K线数据是最为常见的选择。安装Tushare库后,通过token认证即可调用接口获取股票历史行情,代码示例如下:


import tushare as ts

import pandas as pd

# 初始化tushare,需要先在官网注册获取token

pro = ts.pro_api('your_token_here')

# 获取上证指数历史行情

df = pro.index_daily(ts_code='000001.SH', 

                      start_date='20200101', 

                      end_date='20231231')

# 按日期排序并设置日期索引

df['trade_date'] = pd.to_datetime(df['trade_date'])

df = df.sort_values('trade_date').reset_index(drop=True)

print(df.head())

上述代码返回的数据包含开盘价、最高价、最低价、收盘价、成交量、成交额等字段,可直接用于技术指标计算与因子构建。若需要获取全市场股票历史数据,可通过循环遍历所有股票代码实现批量获取,但需注意接口调用频率限制。

使用yfinance库获取国际市场数据同样便捷:


import yfinance as yf

# 获取苹果公司股票历史数据

aapl = yf.download('AAPL', start='2020-01-01', end='2023-12-31')

print(aapl.head())

该库支持美股、港股、外汇、加密货币等多品种数据获取,数据来源为Yahoo Finance,适合进行国际市场量化策略研发。

对于需要本地化部署的数据管理系统,可采用Backtrader框架内置的数据源机制,或使用pandas_datareader库统一接入多种数据源:


import pandas_datareader as pdr

from datetime import datetime

# 获取苹果公司股票数据

start = datetime(2020, 1, 1)

end = datetime(2023, 12, 31)

aapl = pdr.get_data_stooq('AAPL.US', start, end)

数据质量验证与预处理要点

获取到的历史行情数据往往存在各类质量问题,在进入策略回测前必须进行系统性校验与预处理。

数据缺失值处理是首要任务。股票停牌期间不存在交易数据会导致连续日期出现缺失,对于需要连续数据的策略需要根据业务需求选择前向填充、后向填充或插值等处理方式。使用Tushare获取的数据通常以日期为索引,可通过以下方式检查缺失情况:


# 检查数据缺失情况

print(df.isnull().sum())

# 向前填充处理缺失值

df_filled = df.fillna(method='ffill')

复权因子调整是股票数据预处理的关键环节。上市公司存在分红送股等行为会导致股价出现跳空缺口,若不进行复权处理将导致历史收益率计算失真。Tushare提供了未复权、前复权、后复权三种数据类型,回测时应根据策略特性选择合适类型,通常基本面策略使用前复权,技术策略使用未复权或后复权。

异常值检测与处理能够避免因数据错误导致的策略失效。股价数据可能出现明显异常值,如单日涨幅超过20%或成交量异常放大等情况,可通过设定阈值或使用统计方法进行识别与处理。

数据一致性校验包括时间范围一致性、品种一致性、字段完整性等维度。跨数据源获取数据时需特别关注字段口径是否统一,例如不同数据源对成交量的单位定义可能存在差异。

历史数据存储与管理策略

随着量化研究深度与广度的扩展,历史数据规模会快速增长,建立高效的数据存储与管理机制至关重要。

文件存储方案适合小规模数据管理与快速原型开发。CSV格式通用性强、便于查看,但读取效率较低。Parquet格式作为列式存储格式,具有压缩率高、查询速度快、支持嵌套数据结构等优势,适合大规模数据存储:


import pyarrow.parquet as pq

# 将DataFrame保存为Parquet格式

df.to_parquet('stock_history.parquet', engine='pyarrow', compression='snappy')

# 读取Parquet文件

df_loaded = pd.read_parquet('stock_history.parquet')

数据库存储方案更适合企业级量化系统。MySQL适合结构化交易数据存储,MongoDB适合存储非结构化日志数据,InfluxDB等时序数据库专为金融时序数据优化,支持高效的时间范围查询与聚合计算。

增量更新机制能够保持数据的时效性。每次获取数据时仅请求最新增量部分,与本地存量数据进行合并,既能提高接口调用效率,也能降低数据存储压力。实现时需记录本地数据的最新时间戳,以此作为增量获取的起始日期。

数据版本管理对于策略可复现性至关重要。不同时间点获取的历史数据可能存在差异,建议对原始下载数据进行归档保存,并在策略回测时记录所使用的数据版本,确保研究结果的可复现性。

量化选股的历史行情数据获取是一项系统性工程,从数据源选择、接口调用、质量控制到存储管理,每个环节都需要精心设计。只有建立在高质量数据基础之上,量化选股策略的回测结果才具备参考价值,后续的实盘交易才有稳定支撑。

转载请注明出处:https://www.lianghuajiaoyi.top/wenzhang/lishi-hangqing-shuju-lianghua-xuangu-123.html