企业微信

tushare批量获取股票收盘价

金融数据分析离不开高质量的历史价格数据。对于个人研究者与量化爱好者而言,tushare是一个功能强大且相对易用的免费数据接口。当需要同时跟踪多只股票的表现时,逐一获取数据效率低下。实现十家公司股票收盘价的批量下载,能够显著提升数据准备阶段的效率,为后续的统计分析、策略回测奠定基础。

核心思路与准备工作

批量下载的核心在于循环与数据合并。我们需要明确目标:获取十只股票在一段特定历史时期内的每日收盘价数据。在使用tushare前,必须完成两项准备工作:注册tushare账号以获取token,以及安装必要的Python库。

tushare下载十家公司股票收盘价的实用方法

访问tushare官网完成注册,在个人中心获取API凭证,即一个token字符串。这个token是调用所有数据接口的钥匙。

在Python环境中,使用pip命令安装tushare库,同时为了后续数据处理,pandas库通常也是必需的。


pip install tushare pandas

准备工作完成后,可以在代码中导入库并设置token


import tushare as ts

import pandas as pd

# 设置token,将'your_token_here'替换为你的实际token

ts.set_token('your_token_here')

# 初始化pro接口

pro = ts.pro_api()

需要注意的是,部分高级数据需要一定积分才能访问,但基础的日线行情数据通常可以满足一般需求。

实现批量下载的步骤

确定股票列表与时间范围

第一步是明确需要下载哪些公司的股票数据。这里需要提供一个包含股票代码的列表。A股市场的股票代码,在tushare的日线行情接口中通常需要加上交易所后缀,例如‘000001.SZ’代表深交所的平安银行,‘600000.SH’代表上交所的浦发银行。准备一个包含十个此类代码的列表。


stock_list = ['000001.SZ', '600000.SH', '000002.SZ', '600036.SH', '000858.SZ',

              '600519.SH', '000333.SZ', '601318.SH', '000651.SZ', '600887.SH']

需要设定一个时间范围,比如获取从2023年1月1日到2023年12月31日的数据。


start_date = '20230101'

end_date = '20231231'

循环获取与数据合并

有了股票列表和时间范围,就可以通过循环调用pro.daily()接口来获取每只股票的日线行情。该接口返回一个DataFrame,包含日期、开盘价、最高价、最低价、收盘价、成交量等字段。我们只需关心trade_dateclose字段。

在循环中,每次获取一只股票的数据,并从中选取日期和收盘价两列。为了便于后续识别,可以将收盘价列重命名为对应的股票代码。一个关键点是,需要将所有股票的数据按照日期对齐合并到一个大的DataFrame中,日期作为索引将大大方便这一操作。

以下是一个完整的实现示例:


# 初始化一个空的DataFrame,用于存储合并后的数据,以日期为索引

all_data = pd.DataFrame()

for stock_code in stock_list:

    try:

        # 获取单只股票的日线行情

        df = pro.daily(ts_code=stock_code, start_date=start_date, end_date=end_date)

        # 选取所需字段并设置日期为索引

        df = df[['trade_date', 'close']].copy()

        df['trade_date'] = pd.to_datetime(df['trade_date']) # 转换日期格式

        df.set_index('trade_date', inplace=True)

        # 将收盘价列重命名为股票代码,并合并到总数据中

        df.rename(columns={'close': stock_code}, inplace=True)

        if all_data.empty:

            all_data = df

        else:

            all_data = all_data.join(df, how='outer') # 使用外连接确保所有日期都保留

        print(f"已下载 {stock_code} 数据,形状:{df.shape}")

    except Exception as e:

        print(f"下载 {stock_code} 数据时出错:{e}")

# 对合并后的数据按日期索引进行排序

all_data.sort_index(inplace=True)

print("所有数据下载合并完成。")

print(all_data.head()) # 查看前几行数据

这段代码遍历股票列表,为每只股票获取数据,处理后将收盘价作为新的一列加入到all_data中。使用join方法并以日期为索引,可以自动对齐不同股票的交易日期。how='outer'参数确保了即使某只股票在某些日期停牌(无数据),其他股票的数据行也会保留,缺失值会用NaN填充,这在金融时间序列分析中是常见情况。

数据清洗与填充

合并后的数据框可能存在缺失值,这可能是由于股票停牌、上市日期不同或网络请求偶尔失败造成。根据分析需求,可能需要对其进行处理。常见的处理方法包括前向填充、后向填充或直接删除缺失行。例如,使用前向填充可以假设停牌期间的价格保持不变。


# 使用前一个有效值填充缺失值

all_data_filled = all_data.fillna(method='ffill')

# 如果前向填充后仍有缺失(如开头部分),可以进行后向填充

all_data_filled = all_data_filled.fillna(method='bfill')

处理后的数据框all_data_filled就是一个干净的、列名为各股票代码、索引为交易日的收盘价面板数据。

数据存储与后续应用

获得整理好的数据后,将其保存到本地文件是标准做法,可以避免每次分析都重新下载。pandas支持多种格式存储。


# 保存为CSV文件

all_data_filled.to_csv('ten_stocks_close.csv')

# 保存为Excel文件

all_data_filled.to_excel('ten_stocks_close.xlsx')

# 保存为HDF5格式,适合大数据且读写速度快

all_data_filled.to_hdf('ten_stocks_close.h5', key='close_price')

保存为CSV或Excel文件便于查看和分享,而HDF5格式在处理大规模面板数据时性能更优。

这份数据可以立即投入多种应用场景。例如,计算十只股票之间的收益率相关性矩阵,评估投资组合的风险分散效果;计算每只股票的滚动波动率,观察其风险变化;构建一个等权重的投资组合,回测其历史表现。这些分析都依赖于一个整齐、完整的多资产价格时间序列。

性能优化与注意事项

上述循环方法在股票数量不多时运行很快。如果需要处理的股票数量极大(成百上千),则可以考虑使用多线程或异步IO来并发请求,以缩短下载时间。但需要注意tushare接口有调用频率限制,过于频繁的请求可能导致IP被暂时封锁。对于大规模数据获取,最好遵循官方建议,使用积分提升权限或购买专业版。

另一个重要事项是数据复权。pro.daily()接口默认提供未复权的价格。对于长期分析,特别是涉及分红送股的收益率计算,必须使用复权数据。tushare提供了pro.adj_factor()接口获取复权因子,可以将未复权价格与复权因子结合计算得到前复权或后复权价格。

确保股票代码格式正确至关重要。错误的代码格式会导致接口返回空数据。熟悉不同市场(A股、港股、美股)在tushare中的代码表示规则是有效使用该库的前提。

通过以上方法,可以高效、准确地构建一个包含多只股票收盘价的数据集。这个过程体现了金融数据处理的基本流程:获取、清洗、整理、存储。掌握这一技能是进行任何严肃的跨资产比较、相关性研究或投资组合构建的第一步。将数据准备过程自动化,能让分析者将更多精力聚焦于模型与策略本身,从而在量化研究道路上走得更远。