第二章:数据获取基础——用Tushare/AkShare搞定三大核心数据

做机构持仓成本分析,第一步就是拿数据。

很多人一上来就搞复杂的模型,结果数据源都没搞定。我见过太多这样的案例了。今天咱们就聊聊怎么用Python把龙虎榜、十大流通股东、大宗交易这三类数据稳稳拿到手。

2.1 为什么是这三类数据?

机构持仓成本,说白了就是大资金进场的痕迹。我个人习惯从三个维度去追踪:

  • 龙虎榜:短期游资和机构的博弈痕迹,能看到买卖席位和金额
  • 十大流通股东:中长线机构的底牌,每季度更新一次
  • 大宗交易:大资金私下成交的价格,往往有折价或溢价信号

这三者结合起来,你就能拼出一张机构成本的地图。嗯,这里要注意——单一数据源都有缺陷,但组合起来就稳了。

2.2 准备工作:安装库和获取Token

先装好两个主力库。我个人推荐两个都装,因为各有优势:

# 安装Tushare(需要注册获取token)
pip install tushare

# 安装AkShare(无需注册,直接可用)
pip install akshare

关于Tushare的token,我建议你注册后放在环境变量里,别硬编码在代码中。我曾经见过有人把token直接传到GitHub上,结果被全网调用……

import tushare as ts
import os

# 从环境变量读取token
token = os.getenv('TUSHARE_TOKEN', '你的token')
pro = ts.pro_api(token)

2.3 获取龙虎榜数据

龙虎榜数据,说白了就是每天涨跌幅偏离值达到7%以上的个股交易明细。我一般用它来识别机构席位是否在吃货。

2.3.1 用Tushare获取

# 获取指定日期的龙虎榜列表
df = pro.top_list(trade_date='20250115')
print(df.head())

# 获取具体个股的龙虎榜明细
df_detail = pro.top_inst(trade_date='20250115', ts_code='000001.SZ')
print(df_detail[['ts_code', 'buy_amount', 'sell_amount', 'net_amount']])

这里有个坑——Tushare的龙虎榜数据需要积分权限。如果你积分不够,可以用AkShare替代。

2.3.2 用AkShare获取(推荐新手)

import akshare as ak

# 获取龙虎榜机构成交明细
df = ak.stock_sse_summary()
# 或者获取个股龙虎榜详情
df_detail = ak.stock_lhb_detail_em(symbol='000001')
print(df_detail.head())
我的经验:AkShare的接口更稳定,而且免费。我最近几个项目都在用AkShare做数据源,省去了积分管理的麻烦。

2.4 获取十大流通股东数据

十大流通股东,是每个季度结束后15天内必须披露的数据。这里能看到基金、社保、险资的持仓变化。

2.4.1 用Tushare获取

# 获取某只股票的最新十大流通股东
df = pro.top10_floatholders(ts_code='000001.SZ', start_date='20250101', end_date='20250331')
print(df[['ts_code', 'holder_name', 'hold_amount', 'hold_ratio']])

2.4.2 用AkShare获取

# 获取十大流通股东
df = ak.stock_gpzy_pledge_ratio_em(symbol='000001')
# 或者获取股东持股明细
df_holder = ak.stock_zhongdian_holder_em(symbol='000001')
print(df_holder.head())
注意:十大流通股东数据有滞后性。你看到的数据可能是3个月前的。我一般会结合大宗交易数据来验证——如果大宗交易价格低于股东披露的成本价,那可能是机构在止损。

2.5 获取大宗交易数据

大宗交易,是机构之间的大额成交。成交价往往有折价或溢价,这是判断机构真实成本的关键。

2.5.1 用Tushare获取

# 获取大宗交易数据
df = pro.block_trade(trade_date='20250115')
print(df[['ts_code', 'price', 'vol', 'amount', 'buyer', 'seller']])

2.5.2 用AkShare获取

# 获取大宗交易明细
df = ak.stock_dzjy_mrmx(symbol='2025-01-15')
print(df.head())

我个人习惯把大宗交易数据按股票代码汇总,计算加权平均成交价。这个价格往往就是机构的真实成本区间。

2.6 数据整合:构建机构成本分析基础表

拿到三类数据后,我通常会做一件事——合并成一个DataFrame,方便后续分析。

import pandas as pd

# 示例:合并龙虎榜和大宗交易数据
def build_institution_cost_data(ts_code, start_date, end_date):
    # 获取龙虎榜机构净买入
    lhb = pro.top_inst(ts_code=ts_code, start_date=start_date, end_date=end_date)
    lhb_cost = lhb['buy_amount'].sum() / lhb['buy_vol'].sum() if lhb['buy_vol'].sum() > 0 else 0
    
    # 获取大宗交易加权均价
    block = pro.block_trade(ts_code=ts_code, start_date=start_date, end_date=end_date)
    block_cost = (block['amount'].sum() / block['vol'].sum()) if block['vol'].sum() > 0 else 0
    
    # 获取十大流通股东平均成本(估算)
    holders = pro.top10_floatholders(ts_code=ts_code, start_date=start_date, end_date=end_date)
    # 这里用股东持股比例加权估算成本
    
    return {
        'ts_code': ts_code,
        'lhb_cost': lhb_cost,
        'block_cost': block_cost,
        'holder_cost_est': None  # 需要结合股价历史数据估算
    }

result = build_institution_cost_data('000001.SZ', '20250101', '20250331')
print(result)
核心逻辑:机构成本不是单一价格,而是一个区间。龙虎榜给出短期成本,大宗交易给出中期成本,十大流通股东给出长期成本。三个区间重叠的部分,就是机构的真实成本底线。

2.7 本章知识体系

下面这张图,是我自己梳理的数据获取流程。你照着这个框架走,不会漏掉关键数据。

机构持仓成本数据获取框架 数据源层 龙虎榜数据 短期机构博弈痕迹 十大流通股东 中长线机构底牌 大宗交易数据 大资金私下成交价 工具层:Tushare + AkShare 输出:机构成本区间分析表 三个数据源交叉验证,得到机构真实成本区间

2.8 避坑指南

最后分享几个我踩过的坑:

  • 数据频率不一致:龙虎榜是日频,十大流通股东是季频,大宗交易是日频。合并时要注意时间对齐。我一般以周为单位做聚合。
  • 数据缺失处理:有些股票可能没有龙虎榜记录,或者没有大宗交易。这时候我会用十大流通股东数据做基准,其他数据作为辅助验证。
  • API限流问题:Tushare有调用次数限制。我建议把数据缓存到本地SQLite,避免重复请求。AkShare虽然免费,但也不要高频调用,容易被封IP。
我的小技巧:写一个定时任务,每天收盘后自动拉取当天数据。这样你第二天开盘前就能看到机构的最新动向。我曾经靠这个习惯,提前发现了一只被机构悄悄吃货的股票。

好了,数据获取这块就聊到这。下一章咱们开始真正动手——用这些数据计算机构的持仓成本区间。到时候你会发现,原来大资金的底牌,其实没那么神秘。

专注资料整理