企业微信

为什么需要批量获取股票收盘价

做投资分析或者量化策略回测,第一步永远是拿到可靠的历史数据。收盘价作为每天最重要的价格信号,包含了市场所有参与者的博弈结果。手动从行情软件里一个个复制粘贴,费时费力还容易出错。批量获取收盘价,就是把重复劳动交给程序,让投资者能把精力放在逻辑验证和决策上。

散户常犯的一个错误是只盯着当天涨跌,忽略了收盘价序列背后的统计规律。批量拿到多只股票、多个交易日的收盘价,才能计算收益率分布、相关性、波动率这些关键指标。期货市场也是同样的道理,主力合约的收盘价序列是构建趋势策略的基石。

股票收盘价数据批量获取有哪些实用方法

用Python生态批量抓取股票收盘价

Python是目前最顺手的工具。免费且活跃的库不少,yfinance就是典型代表。它直接对接雅虎财经的公开接口,输入股票代码列表,几行代码就能把收盘价拉到本地。


import yfinance as yf

import pandas as pd

tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN']

data = yf.download(tickers, start='2024-01-01', end='2024-12-31')

close_prices = data['Close']

print(close_prices.head())

这段代码返回一个DataFrame,列是股票代码,行是日期,值就是收盘价。yfinance的好处是免费、无需注册,缺点是数据质量偶尔有缺失,不适合对精度要求极高的生产环境。

另一个选择是pandas_datareader,它支持多个数据源,包括Stooq和IEX。IEX需要API key,但数据更干净。对于A股市场,tushare是一个老牌选择,需要注册获取token,免费版有频率限制,但覆盖了沪深两市绝大多数股票。


import tushare as ts

ts.set_token('你的token')

pro = ts.pro_api()

df = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20241231')

close = df[['trade_date', 'close']]

tushare的daily接口返回的是未复权价格,做回测时需要自己处理复权因子。这一点新手容易踩坑,不复权的收盘价在除权除息日会出现跳空,直接影响策略收益计算。

期货收盘价批量获取的特殊之处

期货和股票不一样。股票有统一的交易所,期货分散在四大交易所,合约还有到期换月的问题。批量获取期货收盘价,首先要确定是拿主力连续合约还是单个合约。

国内期货数据可以通过天勤量化TqSdk获取,它提供了免费的实时行情和历史数据接口。安装tqsdk后,订阅多个合约,用wait_update等待数据更新,就能拿到收盘价。不过天勤的免费版对订阅数量有限制,适合个人研究。


from tqsdk import TqApi, TqAuth

api = TqApi(auth=TqAuth('用户名', '密码'))

klines = api.get_kline_serial(['SHFE.rb2405', 'DCE.i2405'], 86400)

close = klines['close']

api.close()

对于外盘期货,yfinance也能用,代码是"CL=F"代表原油连续,"GC=F"代表黄金连续。批量拉取时注意不同品种的交易时间不同,日线收盘价对应的是各自交易所的收盘时间。

期货收盘价的批量处理还要考虑换月跳空。主力合约切换时,新旧合约价格不连续,直接拼接会制造虚假的跳空缺口。专业做法是使用复权后的连续合约数据,或者自己按持仓量规则拼接。

用API直接连接券商或数据商

如果资金量稍大或者对数据时效性要求高,直接使用券商提供的API是更稳妥的方案。国内券商如华泰、国金都提供量化交易接口,开通后可以批量拉取历史收盘价。这类接口通常有流量限制,但数据质量和稳定性远好于爬虫。

盈透证券的TWS API支持全球股票和期货,用Python的ib_insync库可以简洁地批量请求历史K线。


from ib_insync import *

ib = IB()

ib.connect('127.0.0.1', 7497, clientId=1)

contract = Stock('AAPL', 'SMART', 'USD')

bars = ib.reqHistoricalData(contract, endDateTime='', durationStr='1 Y', barSizeSetting='1 day', whatToShow='TRADES')

close = [bar.close for bar in bars]

ib.disconnect()

这种方式的门槛在于需要开设境外券商账户,适合有海外资产配置需求的投资者。

爬虫方案作为补充手段

当没有现成API可用时,爬虫是最后的备选。新浪财经、东方财富的行情页面都有结构化的HTML表格,用requests加BeautifulSoup可以解析出收盘价。网易财经的历史数据接口曾经很流行,返回CSV格式,直接下载即可。

爬虫的缺点很明显:网站改版就会失效,高频请求可能被封IP。适合偶尔批量拉取一次,不适合每日自动运行。用爬虫拿数据,务必设置合理的请求间隔,遵守robots协议。

批量获取后的数据清洗要点

拿到收盘价只是第一步。批量数据里常见的问题包括:停牌日缺失、除权除息未调整、不同股票代码格式不统一。用pandas做清洗时,先检查缺失值比例,对停牌股票做前向填充或者直接剔除。复权处理可以用后复权价格,保证收益率计算不受分红送股干扰。

期货数据还要检查换月标记,把主力合约切换日的收盘价单独标注,回测时避免在跳空日产生虚假信号。

给普通投资者的建议

如果只是做简单的估值参考或者定投记录,用tushare免费版加上Excel手工整理完全够用。想跑量化回测,优先考虑yfinance加tushare的组合,覆盖A股和美股。期货交易者直接上天勤量化,省去自己拼接合约的麻烦。

批量获取收盘价的核心不是工具多花哨,而是数据链条稳定。选一个自己能维护的方案,每天定时跑一次,把数据存到本地数据库,日积月累就是一笔宝贵的资产。