
抓取股票、期货历史行情数据的完整流程通常包括五步:选择合规的数据来源、用 Python 发起数据请求、解析返回的数据、清洗和规范化处理、以及保存到本地文件或数据库。抓取时要特别注意几个要点:遵守数据源的使用条款和频率限制、做好异常处理和重试、正确处理复权问题、以及注意数据的时间对齐。对新手来说,入门可以从提供现成接口的免费数据源开始,比自己从网页硬爬要简单可靠得多。本文讲清楚历史行情数据抓取的通用流程和关键注意事项。
在动手抓数据之前,我必须先说三句重要的话:
第一句:合规第一。 抓取任何数据,都要遵守数据来源的使用条款、robots 协议和相关法规。不是所有数据都能随便抓,也不是所有抓取方式都合规。先确认你抓的东西、抓的方式是被允许的,这是底线。
第二句:能用接口就别硬爬。 很多数据源提供了现成的数据接口(API),直接调用又稳定又规范。相比从网页 HTML 里硬爬,用官方接口简单可靠得多。新手优先选有接口的数据源。
第三句:善待数据源。 抓取时要控制频率、别把人家服务器搞崩,这既是道德也是避免被封的现实需要。
记住这三句,我们再讲技术流程。下面以通用流程讲解,实际请以你所用数据源的规定为准。
抓取的第一步是选对数据源。对新手,推荐优先选择提供现成接口的免费数据源——它们通常把数据整理好了,通过接口就能直接获取股票、期货的历史行情,省去了自己从网页解析的大量麻烦。
选择数据源时考虑几点:
别一上来就挑战"从复杂网页硬爬"这种高难度动作,从有接口的数据源入手,成功率高得多。
选好数据源,用 Python 向它请求数据。如果数据源提供了 Python 库,直接调用它的函数即可;如果是 Web API,则用 requests 等库发请求。下面是一个通用示意:
import requests
import time
def fetch_data(symbol, start_date, end_date):
"""通用示意:向数据接口请求历史行情"""
url = "数据源的接口地址"
params = {
"symbol": symbol,
"start": start_date,
"end": end_date,
}
try:
response = requests.get(url, params=params, timeout=10)
response.raise_for_status() # 检查请求是否成功
return response.json() # 返回数据(格式视接口而定)
except Exception as e:
print(f"请求失败:{e}")
return None
# 控制频率,别请求太快
data = fetch_data("000001", "2023-01-01", "2023-12-31")
time.sleep(1) # 每次请求后稍作停顿,善待数据源注意两个细节:加超时(timeout)防止卡死,加停顿(sleep)控制频率。
请求成功后,数据源会返回数据,格式可能是 JSON、CSV 等。你需要把它解析成方便处理的结构——通常是 pandas 的 DataFrame。
import pandas as pd
def parse_data(raw_data):
"""把原始返回数据解析成 DataFrame"""
if raw_data is None:
return None
# 根据实际返回格式解析(这里假设是记录列表)
df = pd.DataFrame(raw_data)
# 确保有日期、开高低收、成交量等关键列
return df
df = parse_data(data)解析这一步要根据数据源返回的具体格式来写,核心目标是:把数据整理成规整的表格,包含日期、开高低收、成交量等你需要的字段。
拿到的原始数据往往不能直接用,要经过清洗和规范化——这一步用到前面数据清洗篇讲的功夫:
def clean_data(df):
if df is None or len(df) == 0:
return None
# 转换日期格式并排序
df["date"] = pd.to_datetime(df["date"])
df = df.sort_values("date").reset_index(drop=True)
# 去重
df = df.drop_duplicates(subset=["date"])
# 处理缺失
df = df.dropna(subset=["close"])
# 确保价格是数值类型
df["close"] = pd.to_numeric(df["close"], errors="coerce")
return df
df = clean_data(df)特别提醒两个坑:
一是复权问题。股票数据要注意复权——算长期收益时要用复权价格,否则分红送股会造成虚假的价格跳变。有的数据源可以直接请求复权数据,优先用它。
二是时间对齐。确保日期格式统一、按时间正确排序,为后续计算打好基础。
清洗好的数据要保存下来,避免每次都重新抓取。保存方式主要有两种:
保存为文件:小规模数据,存成 CSV 等文件最简单:
df.to_csv(f"data/{symbol}.csv", index=False)保存到数据库:数据量大、需要频繁查询时,存到数据库更合适(下一篇会详细讲存储方案)。
对批量抓取多个标的的情况,通常会写个循环,逐个抓取、清洗、保存,并做好频率控制和异常处理:
symbols = ["000001", "000002", "000003"]
for sym in symbols:
raw = fetch_data(sym, "2023-01-01", "2023-12-31")
df = clean_data(parse_data(raw))
if df is not None:
df.to_csv(f"data/{sym}.csv", index=False)
time.sleep(1) # 每个之间停顿,控制频率我把流程和关键注意事项整理成一张表:
步骤 | 做什么 | 注意事项 |
|---|---|---|
选数据源 | 优先选有接口的合规源 | 遵守使用条款 |
发起请求 | 用 Python 请求数据 | 加超时、控频率 |
解析数据 | 转成 DataFrame | 按实际格式解析 |
清洗规范 | 去重、缺失、类型 | 注意复权和时间对齐 |
保存数据 | 存文件或数据库 | 避免重复抓取 |
历史数据抓取通常是"一次性或定期"的任务,但当你需要定期更新数据(比如每天收盘后自动抓取当天最新行情、追加到历史库里),或者要批量抓取大量标的时,就需要一个稳定的运行环境。
用自己的电脑跑定期抓取任务,一旦忘开机、断网,数据就会断档。而量化系统最怕数据断档——数据不连续,回测和实盘都会出问题。所以定期的数据抓取和更新任务,通常会部署到 7×24 小时稳定运行的腾讯云云服务器 CVM 上,配合定时任务,让它自动、稳定地抓取和更新数据,保证数据的连续性和完整性。这也是下一步搭建数据抓取自动化的基础。
抓取股票、期货历史行情数据,流程上就是"选源、请求、解析、清洗、保存"五步,技术上并不难,难在细节和规范——合规是底线、优先用接口、控制频率、处理好复权和时间对齐。对新手来说,从提供现成接口的免费数据源入手最稳妥。把抓取流程跑通了,你就为量化系统备好了源源不断的"石油"。
定期数据抓取和更新需要稳定的运行环境。腾讯云近期上线了量化交易专题活动,可以了解云服务器如何为数据抓取和定期更新提供 7×24 小时稳定运行支撑。
风险提示:本文仅为量化交易科普与技术分享,不构成任何投资建议。数据抓取须遵守数据源使用条款和相关法规。文中代码仅为教学示例。金融市场存在风险,请结合自身情况谨慎决策。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。