用Tushare Pro和Python,5分钟搞定上证50成分股历史收益率分析(附完整代码)

用Tushare Pro和Python,5分钟搞定上证50成分股历史收益率分析(附完整代码)
用Tushare Pro和Python快速分析上证50成分股历史表现最近几年量化投资在国内逐渐兴起越来越多的个人投资者开始尝试用数据驱动的方式做投资决策。但对于刚入门的新手来说获取和处理金融数据往往是个令人头疼的问题。今天我们就来介绍一个简单高效的解决方案——使用Tushare Pro和Python快速分析上证50成分股的历史表现。上证50指数由上海证券交易所最具代表性的50只大盘股组成是观察中国A股市场的重要风向标。通过分析这些成分股的历史收益率我们可以快速了解市场整体表现为后续的投资策略开发打下基础。1. 准备工作Tushare Pro环境配置在开始分析之前我们需要先完成Tushare Pro的基础配置。Tushare Pro是一个功能强大的金融数据接口提供了丰富的A股市场数据包括股票行情、财务数据、指数成分等。1.1 注册Tushare Pro账号首先访问 Tushare Pro官网 完成注册。注册后系统会赠送200积分足够我们完成上证50成分股的基础分析。在个人中心页面你可以找到自己的API Token这是调用数据接口的凭证。1.2 安装必要的Python库我们需要安装以下Python库pip install tushare pandas matplotlibtushare: 用于获取金融数据pandas: 数据处理和分析matplotlib: 数据可视化安装完成后在Python中导入这些库import tushare as ts import pandas as pd import matplotlib.pyplot as plt1.3 初始化Tushare Pro接口使用你的API Token初始化Tushare Pro接口pro ts.pro_api(你的Token)2. 获取上证50成分股数据上证50指数的代码是000016.SH我们可以通过Tushare Pro的index_weight接口获取其成分股信息。2.1 查询最新成分股# 获取上证50成分股 sh50 pro.index_weight(index_code000016.SH, trade_date20231231) sh50_list sh50[con_code].tolist() print(f上证50成分股数量{len(sh50_list)})这段代码会返回指定交易日这里使用2023年底上证50指数的成分股列表。由于指数成分会定期调整建议使用最新的交易日数据。2.2 成分股行业分布分析了解成分股的行业分布有助于我们把握指数的结构特征# 获取成分股行业信息 stock_basic pro.stock_basic(list_statusL) sh50_info pd.merge(sh50, stock_basic, left_oncon_code, right_onts_code) # 统计行业分布 industry_dist sh50_info[industry].value_counts() print(industry_dist)3. 获取成分股历史收益率数据有了成分股列表后我们可以获取每只股票的历史收益率数据进行分析。3.1 批量获取月度收益率Tushare Pro的monthly接口可以获取股票的月度行情数据包括收益率涨跌幅# 初始化空DataFrame存储结果 sh50_returns pd.DataFrame() # 遍历成分股获取数据 for stock in sh50_list: try: data pro.monthly( ts_codestock, start_date20180101, end_date20231231, fieldsts_code,trade_date,pct_chg ) sh50_returns pd.concat([sh50_returns, data]) time.sleep(0.1) # 避免频繁调用触发限制 except Exception as e: print(f获取{stock}数据失败{e}) # 查看数据 print(sh50_returns.head())注意Tushare Pro对API调用频率有限制每分钟最多200次因此在循环中加入了time.sleep(0.1)避免触发限制。3.2 数据清洗与转换获取的原始数据需要进行一些处理才能用于分析# 转换日期格式 sh50_returns[trade_date] pd.to_datetime(sh50_returns[trade_date]) # 透视表行是日期列是股票代码值是收益率 returns_pivot sh50_returns.pivot(indextrade_date, columnsts_code, valuespct_chg) # 计算每月的平均收益率 returns_pivot[avg_return] returns_pivot.mean(axis1)4. 收益率分析与可视化有了清洗好的数据我们可以进行各种分析来了解上证50成分股的历史表现。4.1 描述性统计分析首先看一下收益率的整体分布情况# 描述性统计 desc_stats returns_pivot.describe() print(desc_stats.loc[[mean, std, min, max]])4.2 收益率时间序列分析观察平均收益率的时序变化plt.figure(figsize(12, 6)) returns_pivot[avg_return].plot() plt.title(上证50成分股月度平均收益率) plt.xlabel(日期) plt.ylabel(收益率(%)) plt.grid() plt.show()4.3 收益率分布直方图plt.figure(figsize(10, 6)) returns_pivot[avg_return].hist(bins30) plt.title(上证50成分股平均收益率分布) plt.xlabel(收益率(%)) plt.ylabel(频数) plt.show()4.4 各股票收益率对比我们可以计算每只股票在整个期间的总收益率并进行排序# 计算累计收益率 cumulative_returns (returns_pivot 1).prod() - 1 # 排序并可视化 top10 cumulative_returns.sort_values(ascendingFalse).head(10) plt.figure(figsize(10, 6)) top10.plot(kindbar) plt.title(上证50成分股中表现最好的10只股票(2018-2023)) plt.ylabel(累计收益率) plt.xticks(rotation45) plt.show()5. 高级分析相关性矩阵与风险收益特征除了基本的收益率分析我们还可以进行更深入的多维度分析。5.1 成分股收益率相关性分析了解成分股之间的相关性有助于构建分散化的投资组合# 计算相关性矩阵 corr_matrix returns_pivot.corr() # 可视化相关性矩阵 plt.figure(figsize(12, 10)) plt.imshow(corr_matrix, cmapcoolwarm, vmin-1, vmax1) plt.colorbar() plt.xticks(range(len(corr_matrix.columns)), corr_matrix.columns, rotation90) plt.yticks(range(len(corr_matrix.columns)), corr_matrix.columns) plt.title(上证50成分股收益率相关性矩阵) plt.show()5.2 风险-收益散点图将每只股票的平均收益率和波动率绘制在散点图上可以直观地看到它们的风险-收益特征# 计算每只股票的平均收益率和标准差 risk_return pd.DataFrame({ mean_return: returns_pivot.mean(), volatility: returns_pivot.std() }) # 绘制散点图 plt.figure(figsize(10, 8)) plt.scatter(risk_return[volatility], risk_return[mean_return]) plt.title(上证50成分股风险-收益特征) plt.xlabel(波动率(标准差)) plt.ylabel(平均收益率(%)) # 标注部分股票 for i, txt in enumerate(risk_return.index): if i % 5 0: # 避免标注太密集 plt.annotate(txt, (risk_return[volatility][i], risk_return[mean_return][i])) plt.grid() plt.show()6. 完整代码示例以下是本文分析的完整代码你可以直接复制到Jupyter Notebook中运行# 导入必要的库 import tushare as ts import pandas as pd import matplotlib.pyplot as plt import time # 初始化Tushare Pro pro ts.pro_api(你的Token) # 获取上证50成分股 sh50 pro.index_weight(index_code000016.SH, trade_date20231231) sh50_list sh50[con_code].tolist() # 获取成分股月度收益率 sh50_returns pd.DataFrame() for stock in sh50_list: try: data pro.monthly( ts_codestock, start_date20180101, end_date20231231, fieldsts_code,trade_date,pct_chg ) sh50_returns pd.concat([sh50_returns, data]) time.sleep(0.1) except Exception as e: print(f获取{stock}数据失败{e}) # 数据处理 sh50_returns[trade_date] pd.to_datetime(sh50_returns[trade_date]) returns_pivot sh50_returns.pivot(indextrade_date, columnsts_code, valuespct_chg) returns_pivot[avg_return] returns_pivot.mean(axis1) # 可视化平均收益率 plt.figure(figsize(12, 6)) returns_pivot[avg_return].plot() plt.title(上证50成分股月度平均收益率) plt.xlabel(日期) plt.ylabel(收益率(%)) plt.grid() plt.show()在实际使用中我发现设置适当的start_date和end_date非常重要。时间跨度太长可能导致数据量过大太短则可能无法反映完整的市场周期。通常3-5年的数据对于初步分析已经足够。