Vibe-Trading 实战:基于 Tushare `sw_daily` 接口获取申万行业指数日行情数据
2026/9/11 5:02:04 网站建设 项目流程

Vibe-Trading 实战:基于 Tusharesw_daily接口获取申万行业指数日行情数据

【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading

本篇技术指南以 Vibe-Trading 项目内置的 Tushare 数据源技能文档(申万行业指数日行情)为核心,系统讲解申万行业日线行情接口sw_daily的权限要求、入参出参、调用方式与数据口径,并延伸到申万行业分类、行业成分与实时行情等配套接口,最后结合项目内的行业轮动分析技能给出落地用法。读完本文,你将能够在 Vibe-Trading 环境中独立完成申万行业指数历史行情与估值数据的批量拉取、缓存与行业轮动因子计算。

一、接口总览:sw_daily是什么

sw_daily是 Tushare 数据平台提供的申万行业日线行情接口,用于获取申万行业指数的每日行情数据。在 Vibe-Trading 的技能体系里,该接口被归入tushare数据源技能(见 tushare/SKILL.md),其完整文档记录在 申万行业指数日行情.md。

核心信息如下:

项目说明
接口名sw_daily
数据内容申万行业指数日线行情,默认返回申万 2021 版行情
单次限量最大 4000 行数据
积分要求5000 积分方可调取
取数策略可通过指数代码与日期参数组合、循环提取以覆盖全部历史

所谓"默认是申万 2021 版行情",指该接口返回的是申万宏源 2021 年发布的新版行业分类体系下的指数行情。与之对应,申万还维护着 2014 年版分类(28 个一级、104 个二级、227 个三级行业)与 2021 年版分类(31 个一级、134 个二级、346 个三级行业)两套体系,详情参见 申万行业分类.md 中index_classify接口的说明。

二、前置准备:token 配置与 pro 接口初始化

在调用sw_daily之前,需要先完成 Tushare 账号与 Python 环境的准备。根据 tushare/SKILL.md 的快速上手章节,推荐使用 Python 3.7+ 环境安装 tushare 依赖包:

pip install tushare -i https://pypi.tuna.tsinghua.edu.cn/simple

随后注册 Tushare 账号获取 token,并将其配置为环境变量:

export TUSHARE_TOKEN=your_token

Vibe-Trading 项目中还提供了一套统一的配置读取方式。在 scripts/stock_data_example.py 中可以看到,token 的获取顺序是"先读项目配置,再回退到本地记录的 token":

import os import tushare as ts from src.config.accessor import get_env_config # 读取环境变量中的 token, 或者读取本地记录的 token token = get_env_config().data.tushare_token or ts.get_token() # 初始化 pro 接口实例 pro = ts.pro_api(token)

初始化pro接口对象后,即可调用pro.sw_daily(...)。注意:sw_daily属于高积分接口,调用前请确认账号积分已达标(5000 积分),否则会收到权限不足的报错。

三、输入参数详解

sw_daily的输入参数较为精简,全部为可选参数,通过组合不同参数可以实现"按行业、按日期、按区间"三种取数视角。

名称类型必选描述
ts_codestrN行业指数代码,如801010.SI(农林牧渔)
trade_datestrN交易日期,格式 YYYYMMDD
start_datestrN开始日期,格式 YYYYMMDD
end_datestrN结束日期,格式 YYYYMMDD

参数组合的使用场景:

  • 按交易日取全市场截面:只传trade_date,一次性获取该交易日全部申万行业指数的行情与估值数据,常用于每日盘后更新行业面板。
  • 按行业取历史序列:只传ts_codestart_date/end_date,获取某个行业指数在一段时间内的日线序列,用于动量、波动率等因子计算。
  • 区间全量扫描:同时传start_dateend_date,配合 4000 行/次的限量做日期分片循环,可完整覆盖所有行业的全部历史。

日期格式统一为YYYYMMDD(如20230705),与 Tushare 全平台参数约定一致(见 tushare/SKILL.md 中"参数格式说明"一节)。

四、输出参数详解

sw_daily返回 14 个字段,既包含标准 OHLC 行情,也包含行业指数特有的估值(PE/PB)与市值数据,这是行业分析中非常关键的部分。

名称类型默认显示描述
ts_codestrY指数代码
trade_datestrY交易日期
namestrY指数名称
openfloatY开盘点位
lowfloatY最低点位
highfloatY最高点位
closefloatY收盘点位
changefloatY涨跌点位
pct_changefloatY涨跌幅
volfloatY成交量(万股)
amountfloatY成交额(万元)
pefloatY市盈率
pbfloatY市净率
float_mvfloatY流通市值(万元)
total_mvfloatY总市值(万元)

几个需要特别留意的口径细节:

  • 点位而非价格:申万行业指数以"点位"计量(如农林牧渔801010.SI收盘 2946.60),不是个股的元/股价格,因此做收益计算时应基于close点位而非个股价格。
  • 单位约定vol单位为万股,amount单位为万元,float_mv/total_mv单位同样为万元。若要换算成元或亿元,需要自行做量纲换算,避免在资金流因子计算中出现 10000 倍的量级错误。
  • 估值字段pepb为行业指数整体口径的市盈率与市净率,可用于跨行业估值横向比较,也可与 sector-rotation 技能 中"PE 历史分位"打分逻辑结合使用。
  • 可用fields裁剪列fields参数可以指定返回字段子集,减小传输体积,例如只取行情列或只取估值列。

五、接口调用示例

原文档给出了一个典型的按交易日取数示例:获取 20230705 当日所有申万行业指数的ts_code,name,open,close,vol,pe,pb数据。

pro = ts.pro_api('your token') # 获取20230705当日所有申万行业指数的ts_code,name,open,close,vol,pe,pb数据 df = pro.sw_daily(trade_date='20230705', fields='ts_code,name,open,close,vol,pe,pb')

在此基础上,我们可以进一步扩展出三个高频实战写法。

示例一:按行业取历史日线序列

pro = ts.pro_api('your token') # 获取农林牧渔(801010.SI) 2023年全年日线行情 df = pro.sw_daily( ts_code='801010.SI', start_date='20230101', end_date='20231231', fields='ts_code,trade_date,name,open,high,low,close,change,pct_change,vol,amount' )

示例二:按日期循环覆盖全行业全历史(突破 4000 行限量)

import pandas as pd pro = ts.pro_api('your token') # 行业代码列表可先通过 index_classify 获取,或从行情数据中去重获得 frames = [] # 示例:按区间分片循环,每片一个自然月(通常一个月内全部行业行数远小于4000行) for ym in ['202307', '202308', '202309']: start = ym + '01' end = ym + '31' df = pro.sw_daily(start_date=start, end_date=end) frames.append(df) result = pd.concat(frames, ignore_index=True)

示例三:字段裁剪以优化传输

# 只要估值数据:市盈率、市净率、流通市值、总市值 df = pro.sw_daily(trade_date='20230705', fields='ts_code,trade_date,name,pe,pb,float_mv,total_mv')

六、返回数据解读:一个交易日的行业截面

原文档附带了一份 20230705 的真实数据样例(截取),可以帮助理解字段的实际取值量级:

ts_code name open close vol pe pb 0 801001.SI 申万50 2972.86 2946.53 275984.00 13.99 1.91 1 801002.SI 申万中小 6963.37 6896.69 1540720.00 21.19 2.47 2 801003.SI 申万A指 3793.91 3769.63 6294567.00 16.56 1.78 3 801005.SI 申万创业 2841.32 2815.48 1220719.00 35.90 3.72 4 801010.SI 农林牧渔 2986.75 2946.60 83532.00 28.32 2.66 .. ... ... ... ... ... ... ... 434 859811.SI 生活用纸 1438.09 1418.16 2542.00 23.25 2.32 435 859821.SI 化妆品制造及其他 2674.85 2674.57 2069.00 40.63 2.33 436 859822.SI 品牌化妆品 12094.45 11877.03 2809.00 44.55 5.52 437 859852.SI 培训教育 780.30 770.10 20889.00 106.12 5.73 438 859951.SI 电视广播Ⅲ 1121.00 1122.06 24413.00 51.46 1.05

从这份样例可以读出以下信息:

  • 代码规则:一级/二级行业指数以801xxx.SI开头,三级行业指数以85xxxx.SI/859xxx.SI开头(如859852.SI培训教育、859951.SI电视广播Ⅲ),SI后缀表示申万指数体系。
  • 覆盖范围:单日全量返回约 439 行,涵盖宽基类(申万50、申万中小、申万A指、申万创业)与全部分级行业指数,远小于 4000 行上限,因此按日取数不需要分片。
  • 估值分布:不同行业 PE 差异巨大(农林牧渔 28 倍、培训教育 106 倍),在做跨行业比较时必须结合行业属性判断,不能一概而论,这与 sector-rotation 技能 中"周期股 PE 失真、需配合 PB"的警示一致。
  • 成分数量约束:根据 申万行业分类.md 中的说明,指数成分股少于 5 条时该指数行情不发布,因此行情表中只包含is_pub=1的行业指数。

七、配套接口:行业分类、成分与实时行情

sw_daily提供的是行情数据,要构建完整的行业分析流水线,通常还需要以下三个配套接口(均在 Vibe-Trading 的 tushare 技能目录下有对应文档)。

7.1 行业分类字典:index_classify

文档见 申万行业分类.md。用于获取申万行业分类体系(2014 版 / 2021 版),入参为index_codelevel(L1/L2/L3)、parent_codesrc(SW2014/SW2021)。

# 获取申万2021版一级行业列表 df = pro.index_classify(level='L1', src='SW2021')

借助分类字典,可以给sw_daily返回的每一条行情打上"一级/二级/三级行业"标签,便于向上聚合或按大行业做轮动分组。以 2021 版为例,一级行业共 31 个,包括农林牧渔、基础化工、钢铁、有色金属、电子、汽车、医药生物、银行、非银金融等。

7.2 行业成分:index_member_all

文档见 申万行业成分(分级).md.md)。用于获取某个申万行业分类下的成分股清单(按三级分类),也可以反向输入股票代码查询其所属行业:

# 获取黄金分类(850531.SI)的成份股 df = pro.index_member_all(l3_code='850531.SI') # 获取000001.SZ所属行业 df = pro.index_member_all(ts_code='000001.SZ')

成分数据与sw_daily行情组合使用,可以构建"行业指数行情 + 行业内个股集合"的完整分析视图,例如用行业内个股的财务数据交叉验证行业景气度(sector-rotation 技能 中景气度评分框架里的"盈利增速/盈利趋势"维度即可借此落地)。

7.3 实时截面:rt_sw_k

文档见 申万实时行情.md。sw_daily是盘后日线数据,如果需要在盘中获取申万行业指数的最新截面数据(现价、涨跌幅、成交量、成交额),应使用rt_sw_k接口:

# 一次性提取全部申万指数实时数据 df = pro.rt_sw_k() # 按ts_code提取行情数据,例如801053.SI(贵金属) 实时行情 df = pro.rt_sw_k(ts_code='801053.SI')

sw_daily(历史日线)与rt_sw_k(盘中实时)形成互补:前者用于回测与因子研究,后者用于盘中监控与盘中信号触发。

八、在 Vibe-Trading 中的落地场景:行业轮动分析

Vibe-Trading 仓库内置了 sector-rotation 技能(行业轮动分析),它基于 A 股申万行业分类体系,从景气度评分、行业动量排名、估值比较、资金流向四个维度输出行业超配/低配建议。sw_daily返回的数据可以在该框架中直接扮演关键角色:

  • 动量排名:用sw_dailyclose点位序列计算行业日收益率,再按技能中给出的sector_momentum方法(lookback=60, skip=5,即回看 60 个交易日、跳过最近 5 天避免短期反转)滚动计算累积收益并排名。
  • 估值比较:直接用返回的pe/pb字段计算各行业估值的历史分位,对应评分维度中"估值安全(PE 历史分位 <30% 得满分)"的打分规则;同时注意技能提醒的"周期股低 PE 可能是盈利顶点,用 PB 更安全"。
  • 行业分组:将sw_daily行情按 2021 版一级行业(31 个)聚合,映射到技能中"上游周期 / 中游制造 / 下游消费 / TMT / 金融地产 / 公用事业"六大类,进而跟踪产业链传导(如锂电链、半导体链、地产链)。

技能文档也给出了一条可复制的落地路径:综合得分 = 0.4 × 价格动量排名 + 0.3 × 盈利动量排名 + 0.3 × 资金流排名,取 Top 5 行业超配、Bottom 5 行业低配。其中价格动量排名的数据底座正是sw_daily提供的行业日线序列。

九、注意事项与最佳实践

  1. 积分门槛sw_daily需要 5000 积分,低于该门槛会无法调用;正式使用前先在 Tushare 账户中心确认积分状态。
  2. 4000 行限量:单次最多返回 4000 行。按日取数天然安全(单日约数百行);按行业/区间取数时建议按自然月分片循环,避免返回被截断导致数据缺失。
  3. 默认 2021 版:接口默认返回申万 2021 版行情,如需与 2014 版分类对齐的历史研究,需要自行确认版本口径一致性,避免新旧版行业代码混用造成归类错误(两版分类的差异可对照index_classifysrc参数)。
  4. 单位换算vol(万股)、amount(万元)、float_mv/total_mv(万元)均非标准单位,写入因子库前建议统一量纲,防止跨字段运算时出错。
  5. 成分数限制:成分股少于 5 条的行业指数不发布行情,做行业全覆盖统计时应对缺失行做容错处理。
  6. 组合使用:历史用sw_daily、实时用rt_sw_k、分类用index_classify、成分用index_member_all,四接口配合可构建完整的"分类 → 成分 → 历史行情 → 实时行情"申万行业数据流水线。

十、延伸阅读

  • tushare 技能总览:安装、token 配置、全接口列表(含sw_dailyID=327)
  • 申万行业分类:2014 版与 2021 版分类体系、index_classify接口
  • 申万行业成分(分级).md):index_member_all接口与成分数据样例
  • 申万实时行情:rt_sw_k盘中实时接口
  • 行业轮动分析技能:基于申万分类的景气度、动量、估值、资金流多维分析框架
  • 股票数据获取示例:Vibe-Trading 环境中 token 读取与 pro 接口初始化的参考实现

【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询