摘要: 利用Python的requests库和akshare接口,快速提取股票十大股东,涵盖数据获取、清洗与格式化,提供完整代码示例。

快速提取股票十大股东的方法

要使用Python快速提取股票的十大股东名单,最直接的方式是调用金融数据接口库,如akshare。该库封装了多个公开数据源,能够高效获取股东信息。以下内容将指导你完成整个提取过程,并提供可直接运行的代码。

安装必要的库

首先需要安装aksharepandas库。建议使用pip命令进行安装:


pip install akshare pandas

确保安装成功,然后导入所需模块。

如何用Python快速获取股票十大股东名单

获取股票代码

股票代码需符合格式要求,例如上海证券交易所的股票代码为'600000',深圳交易所为'000001'。在使用akshare时,需要将代码转换为交易所前缀,例如'600000'对应'sh600000','000001'对应'sz000001'。

调用接口获取股东数据

akshare提供了stock_gdfx_free_holding_detail_em函数,可获取个股的十大股东明细。该函数需要两个参数:股票代码和日期。日期格式为'YYYYMMDD',需指定报告期,如'20231231'。

以下是一个完整的示例代码:


import akshare as ak

import pandas as pd

def get_top10_shareholders(stock_code, date):

    # 转换代码格式

    if stock_code.startswith('6'):

        symbol = 'sh' + stock_code

    else:

        symbol = 'sz' + stock_code



    # 获取数据

    df = ak.stock_gdfx_free_holding_detail_em(symbol=symbol, date=date)



    # 筛选十大股东

    top10 = df[df['股东类型'] == '十大股东'].head(10)

    return top10

# 示例:获取平安银行(000001)的2023年年报十大股东

stock_code = '000001'

date = '20231231'

top10_df = get_top10_shareholders(stock_code, date)

print(top10_df)

数据清洗与格式化

返回的DataFrame中可能包含多个字段,如股东名称、持股数量、持股比例等。你可以根据需求选择保留字段,并处理缺失值。例如,筛选指定列并重命名:


# 选择需要的列

columns = ['股东名称', '持股数量', '持股比例']

result = top10_df[columns].rename(columns={'股东名称': '股东', '持股数量': '数量(股)', '持股比例': '比例(%)'})

print(result)

批量提取多只股票

若要一次性获取多只股票的十大股东,可以使用循环遍历股票代码列表。注意控制请求频率,避免被封IP。


stock_list = ['000001', '600000', '000002']

date = '20231231'

for code in stock_list:

    try:

        print(f"提取 {code} 的十大股东")

        df = get_top10_shareholders(code, date)

        print(df.head(5))  # 打印前5行预览

    except Exception as e:

        print(f"错误: {e}")

保存数据

提取的数据可以保存为CSV或Excel文件,便于后续分析。


result.to_csv('top10_shareholders.csv', index=False, encoding='utf-8-sig')

result.to_excel('top10_shareholders.xlsx', index=False)

处理日期更新

上市公司的定期报告发布日期不固定,如果指定日期无数据,可以尝试获取最近报告期。akshare还提供了stock_gdfx_free_holding_analyse_em函数,用来获取报告期列表。或者使用stock_zcfz_em获取最新报告期。


# 获取最新报告期

report_dates = ak.stock_gdfx_free_holding_analyse_em(symbol='sz000001')

latest_date = report_dates['报告期'].max()

print(f"最新报告期: {latest_date}")

注意问题

  • 网络请求可能失败,需添加重试机制。

  • 部分股票可能没有数据,需异常处理。

  • 股东名单可能有多批次,确保筛选正确。

完整实战案例

下面提供一个完整的函数,包含多股票循环和结果合并:


import time

def get_multiple_top10(stock_list, date):

    all_data = []

    for code in stock_list:

        try:

            df = get_top10_shareholders(code, date)

            df['股票代码'] = code

            all_data.append(df)

            time.sleep(1)  # 暂停1秒,避免请求过快

        except:

            print(f"无法获取 {code} 的数据")

    return pd.concat(all_data, ignore_index=True)

# 使用示例

stock_codes = ['000001', '600000', '000002']

top10_all = get_multiple_top10(stock_codes, '20231231')

top10_all.to_csv('top10_all.csv', index=False)

数据可视化展示

提取的股东数据可快速生成图表,例如使用matplotlib绘制持股比例饼图。


import matplotlib.pyplot as plt

# 设定中文显示

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

# 取前五名股东数据

plot_data = result.head(5)

plt.pie(plot_data['比例(%)'], labels=plot_data['股东'], autopct='%1.1f%%')

plt.title('前五大股东持股比例')

plt.show()

掌握上述方法,你便能快速、批量地获取股票十大股东信息。akshare库持续更新,建议查阅官方文档获取更多接口。实际应用中,可根据研究需求灵活调整字段和输出格式。