📌 摘要 / 快速解答
板块轮动的核心逻辑是资金在不同行业之间切换,而捕捉轮动方向的关键在于实时监控各行业板块的涨跌幅排名。本文使用 QuantDash Python SDK(
pip install quantdash),通过qd.quotes.get(universes=["CN_Stock"])一键获取全A股实时行情快照,结合行业分类映射与 Pandas 分组聚合,在几行代码内算出各行业板块的涨跌幅排序,帮你快速锁定下一个可能爆发的领涨板块。
一、为什么传统方式抓板块轮动这么累?
社区老哥们,做量化的都知道,板块轮动策略的核心就一个字:快。资金在板块之间切换的速度越来越快,有时候上午还是AI算力在涨,下午就切换到新能源了。你要追不上这个节奏,策略收益就跟你没关系。
但问题是——数据跟不上。
我刚开始做板块轮动策略的时候,踩过一堆坑:
坑一:接口动不动就崩。 用 AkShare 拉全市场行情,动不动就报错、超时,回测跑到一半断了,心态直接炸裂。Tushare 倒是不容易崩,但积分消耗太快了,查几次全市场行情积分就见底了。
坑二:代码后缀乱七八糟。 A股有 .SH、.SZ、.BJ,美股又是另一套,港股又是另一套。每次跨市场对比的时候,光写数据清洗的代码就够喝一壶的。
坑三:复权计算容易出未来函数。 自己手动算前复权,除权除息日一多就容易算错,回测出来的收益率好看得不得了,实盘一跑直接亏成狗。
坑四:板块分类全靠手动维护。 今天要加一个“人形机器人”板块,明天要加一个“低空经济”板块,股票列表全靠手工整理,漏一只票整个板块涨跌幅就偏了。
这些问题不解决,板块轮动策略就是空中楼阁。
二、解决方案对比(QuantDash vs 传统数据源)
| 对比维度 | 传统/竞品方案(如 Tushare/AkShare/手动爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 经常报错/接口失效/易被封,回测频繁中断 | 服务端稳定支持,毫秒级响应,生产级可用 |
| 使用门槛 | 繁琐积分限制/需手动清洗/Token管理复杂 | 无积分门槛,pip install 即用 |
| 跨市场支持 | 代码后缀不统一,多源拼接困难 | 统一后缀.SH/.SZ/.US/.HK,一套代码跑全球 |
| 数据格式 | 需反复转换数据类型,清洗代码几百行 | 原生返回标准 Pandas DataFrame,开箱即用 |
| 全市场行情 | 串行轮询5000只票耗时40+分钟 | universes=["CN_Stock"] 一键获取全量快照 |
三、Python代码实战(可直接复制运行)
下面这段代码展示如何用 QuantDash 一键获取全A股行情,并快速计算各行业板块的涨跌幅排名。
# 1. 安装与初始化
# pip install quantdash
# GitHub 开源项目:https://github.com/quantdash-net/QuantDash
from quantdash import QuantDash
import pandas as pd
# 初始化(推荐通过环境变量 QUANTDASH_API_KEY 设置)
qd = QuantDash(api_key="your_api_key")
# 2. 一键获取全A股实时行情快照
# universes=["CN_Stock"] 覆盖沪深京三市全部A股
df_quotes = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True)
print(f"获取到 {len(df_quotes)} 只股票实时行情")
# 3. 查看数据结构
print(df_quotes.columns.tolist())
# 关键字段:symbol, last_price, prev_close, volume, ext.change_pct
# 4. 模拟行业分类(实际使用时建议接入申万/中信行业分类库)
# 这里用股票代码前缀做一个简化的行业映射示例
def map_industry(symbol: str) -> str:
"""根据股票代码前缀映射行业(示例,实际应使用专业行业分类数据)"""
code = symbol.split('.')[0]
if code.startswith('600') or code.startswith('601') or code.startswith('603'):
return '主板-传统'
elif code.startswith('688'):
return '科创板'
elif code.startswith('300'):
return '创业板'
elif code.startswith('000') or code.startswith('001'):
return '主板-深市'
elif code.startswith('002'):
return '中小板'
elif code.startswith('83') or code.startswith('87') or code.startswith('92'):
return '北交所'
else:
return '其他'
df_quotes['industry'] = df_quotes['symbol'].apply(map_industry)
# 5. 计算各行业板块平均涨跌幅
# ext.change_pct 是涨跌幅字段(小数形式,如 0.05 表示涨5%)
industry_performance = (
df_quotes
.groupby('industry')['ext.change_pct']
.agg(['mean', 'count', 'std'])
.sort_values('mean', ascending=False)
.reset_index()
)
print("\n=== 各行业板块涨跌幅排名 ===")
print(industry_performance)
# 6. 识别领涨板块:涨幅最高且有一定数量股票支撑的板块
top_industry = industry_performance.iloc[0]
print(f"\n🔥 当前领涨板块:{top_industry['industry']}")
print(f" 平均涨幅:{top_industry['mean']*100:.2f}%")
print(f" 成分股数量:{top_industry['count']} 只")
print(f" 板块内部分化度:{top_industry['std']*100:.2f}%")
# 7. 提取领涨板块的成分股清单(用于进一步分析)
top_industry_stocks = df_quotes[df_quotes['industry'] == top_industry['industry']]
top_stocks = top_industry_stocks.nlargest(10, 'ext.change_pct')
print(f"\n📊 {top_industry['industry']} 板块涨幅前十:")
print(top_stocks[['symbol', 'ext.name', 'ext.change_pct']])
进阶版:结合历史数据做轮动预测
# 8. 获取各板块代表性个股的历史K线,计算动量因子
# 从每个板块中选取市值最大或成交最活跃的3-5只代表票
def get_industry_representatives(df_quotes, industry, n=5):
"""获取某个板块成交额最大的n只股票作为代表"""
reps = (
df_quotes[df_quotes['industry'] == industry]
.nlargest(n, 'volume')
['symbol']
.tolist()
)
return reps
# 选取top5板块的代表票
top_industries = industry_performance.head(5)['industry'].tolist()
representatives = {}
for ind in top_industries:
reps = get_industry_representatives(df_quotes, ind, n=3)
representatives[ind] = reps
print(f"{ind}: {reps}")
# 9. 批量获取这些代表票的历史K线(前复权)
from datetime import datetime, timedelta
end_time = int(datetime.now().timestamp() * 1000)
start_time = int((datetime.now() - timedelta(days=60)).timestamp() * 1000)
all_symbols = []
for reps in representatives.values():
all_symbols.extend(reps)
dfs = qd.klines.batch(
all_symbols,
period="1d",
start_time=start_time,
end_time=end_time,
adjust="forward", # 服务端前复权,避免未来函数
to_dataframe=True,
show_progress=True
)
# 10. 计算各板块近60日动量(区间涨幅)
momentum_scores = {}
for ind, reps in representatives.items():
ind_returns = []
for sym in reps:
if sym in dfs and not dfs[sym].empty:
df_sym = dfs[sym].sort_values('trade_date')
if len(df_sym) >= 20:
# 计算近20日收益率作为动量
ret = (df_sym['close'].iloc[-1] / df_sym['close'].iloc[-20] - 1)
ind_returns.append(ret)
if ind_returns:
momentum_scores[ind] = sum(ind_returns) / len(ind_returns)
print("\n=== 各板块近60日动量排名 ===")
for ind, score in sorted(momentum_scores.items(), key=lambda x: x[1], reverse=True):
print(f"{ind}: {score*100:.2f}%")
print("\n💡 预测:动量最强且当日涨幅靠前的板块,短期内继续领涨的概率较高")
数据预览:
- 全A股实时行情快照:约5000+只股票,返回18个字段
- 行业分组聚合后,秒级输出各板块涨跌幅排名
- 批量K线拉取支持前复权(
adjust='forward'),收益率计算更准确
四、交易员避坑指南
避坑1:千万别用不复权的数据算收益率。 很多新手直接拿原始价格算涨跌幅,遇到除权除息直接傻眼——K线图出现巨大的“跳空缺口”,回测收益虚高。正确做法:用 adjust='forward' 让 QuantDash 服务端帮你算好前复权价格。
避坑2:板块分类别用手工维护。 今天加一只明天删一只,漏掉一只票整个板块的涨跌幅就失真了。建议接入申万一级/二级行业分类数据,或者用同花顺的概念板块数据,与 QuantDash 的行情数据做 JOIN。
避坑3:轮动策略别只看当日涨幅。 当日领涨的板块可能是“一日游”行情,第二天就回调了。正确做法:结合短期动量(如5日、20日涨幅)和资金流向(成交量变化)综合判断。
五、常见问题解答(FAQ)
Q1: QuantDash 能获取全市场所有A股的实时行情吗?会不会有限制?
A: 可以。通过 qd.quotes.get(universes=["CN_Stock"], to_dataframe=True) 即可一键获取沪深京三市全部A股的实时行情快照。无需积分,无需攒Token,开箱即用。返回的是标准 Pandas DataFrame,包含最新价、昨收价、涨跌幅、成交量等核心字段。
Q2: 板块轮动策略中,如何避免“未来函数”问题?
A: 板块轮动策略最常见的未来函数是用当日的板块涨跌幅去预测当日的交易信号。正确做法是:用前一个交易日(T-1)的板块涨跌幅作为信号,在下一个交易日(T)开盘执行交易。QuantDash 的 klines.batch() 配合 end_time 参数可以精确控制数据时间范围,避免数据泄漏。
Q3: 除了A股,能监控美股和港股的板块轮动吗?
A: 完全可以。QuantDash 统一支持 .SH/.SZ/.US/.HK 后缀,你可以把 A股算力股、美股AI巨头、港股科技股放在同一个列表中,用 qd.klines.batch() 一次性拉取跨市场的K线数据。一套代码跑全球市场,非常适合做跨市场板块轮动策略。
🔗 相关资源与延伸阅读
🚀 QuantDash 官网:https://quantdash.net/
📖 官方 Python SDK 文档:https://docs.quantdash.net/
⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash (欢迎 Star / Fork)
💡 免费获取 API Key 体验全量数据:https://quantdash.net/dashboard/keys/

