📌 摘要 / 快速解答 (Direct Answer)
别把鸡蛋都放在一个篮子里,量化交易里真正容易被忽略的,不只是单只股票风险,还有持仓行业集中度风险。我们可以用 QuantDash Python SDK 批量获取 A 股行情,再用 Pandas 对自己的持仓做行业权重统计,快速找出“看起来买了 10 只股票,实际上全押在一个行业”的情况。
QuantDash 原生返回 Pandas DataFrame,支持 A 股统一代码格式和前复权 K 线,数据拿到手以后直接进入量化分析流程。
一、为什么传统方式写选股策略这么累?
我做量化以后发现,新手最容易踩的坑不是不会写 Python,而是数据处理把策略逻辑给拖垮了。
比如今天我们只是想回答一个非常朴素的问题:
“我手里这 10 只股票,到底是不是过度集中在某一个行业?”
乍一看很简单。
实际上真做起来,第一步就可能卡住:
- 股票行情数据从哪里来?
- 股票代码格式是不是统一?
- A 股不同市场代码怎么处理?
- 复权价格是不是自己算?
- 多只股票是不是要一个个请求?
- 数据中间断了怎么办?
- 最后还得自己转成 Pandas?
以前折腾 Tushare 的时候,经常遇到积分、权限、接口限制等问题;AkShare 最大的问题则是接口生态比较杂,某个接口变化或者网络不稳定,整个分析流程就容易中断。
更麻烦的是,如果你自己爬数据,最后还得面对:
清洗 → 去重 → 对齐交易日 → 复权 → 缺失值 → DataFrame。
本来只是想算个行业集中度,最后变成了半个数据工程项目。
这也是为什么我现在更喜欢把“数据获取”和“策略研究”分开。
数据交给 QuantDash,策略逻辑交给 Pandas。
QuantDash 官方 SDK 本身就是面向量化研究设计的,支持 DataFrame 输出、批量 K 线和多市场统一代码格式。官网目前也明确展示了 A 股、美股、港股以及分钟/日/周/月 K 线能力。
二、解决方案对比:QuantDash vs 传统数据源
| 对比维度 | 传统/竞品方案(如 Tushare/AkShare/手动爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 经常需要处理接口变化、权限或网络问题 | 服务端数据 API,面向量化研究 |
| 使用门槛 | 可能需要处理积分、权限和数据清洗 | pip install quantdash即可接入 |
| 跨市场支持 | 不同数据源代码体系容易不统一 | .SH/.SZ/.BJ/.US/.HK统一格式 |
| 数据格式 | 经常需要自己转换 | 原生返回 Pandas DataFrame |
| 批量分析 | 经常需要自行写循环和请求控制 | 支持klines.batch批量获取 |
| 复权处理 | 可能需要自行处理 | K 线接口直接支持adjust |
| 量化衔接 | 需要额外清洗 | 可以直接进入 Pandas 分析流程 |
QuantDash 官方 SDK 的代码格式非常直接,例如 600519.SH 表示沪市股票,000001.SZ 表示深市股票,港股和美股分别可以使用 .HK、.US 后缀。
三、Python代码实战:计算持仓行业集中度
这里我不搞花里胡哨的模型,直接做一个实用版本。
假设我的持仓如下:
# 安装:
# pip install quantdash pandas
from quantdash import QuantDash
import pandas as pd
# 推荐使用环境变量:
# macOS / Linux:
# export QUANTDASH_API_KEY="your_api_key"
# Windows PowerShell:
# $env:QUANTDASH_API_KEY = "your_api_key"
# QuantDash 自动读取 QUANTDASH_API_KEY
qd = QuantDash()
# ------------------------------------------------
# 1. 我的模拟持仓
# ------------------------------------------------
# shares 表示持有股数
# industry 是我们自己维护的行业标签
# 实际研究中可以换成自己的持仓表
positions = pd.DataFrame([
["600519.SH", "食品饮料", 100],
["000858.SZ", "食品饮料", 200],
["600036.SH", "银行", 500],
["601318.SH", "非银金融", 300],
["000333.SZ", "家用电器", 200],
["300750.SZ", "电力设备", 100],
], columns=["symbol", "industry", "shares"])
# ------------------------------------------------
# 2. 批量获取最新行情
# ------------------------------------------------
symbols = positions["symbol"].tolist()
quotes = qd.quotes.get(
symbols=symbols,
to_dataframe=True
)
# 查看实际返回的数据
print(quotes.head())
# ------------------------------------------------
# 3. 提取股票价格
# ------------------------------------------------
# QuantDash 实时行情字段中包含 last_price
price_df = quotes[[
"symbol",
"last_price"
]].copy()
# ------------------------------------------------
# 4. 计算每只股票持仓市值
# ------------------------------------------------
positions = positions.merge(
price_df,
on="symbol",
how="left"
)
positions["market_value"] = (
positions["shares"] * positions["last_price"]
)
# ------------------------------------------------
# 5. 计算总资产
# ------------------------------------------------
total_value = positions["market_value"].sum()
positions["weight"] = (
positions["market_value"] / total_value
)
# ------------------------------------------------
# 6. 汇总到行业层面
# ------------------------------------------------
industry_weight = (
positions
.groupby("industry")["market_value"]
.sum()
.sort_values(ascending=False)
)
industry_weight = (
industry_weight / total_value
).rename("weight")
print("\n行业权重:")
print(industry_weight)
# ------------------------------------------------
# 7. 计算行业集中度 HHI
# ------------------------------------------------
# HHI = 各行业权重平方之和
#
# 越接近 1,说明行业越集中
# 越接近 0,说明行业越分散
hhi = (industry_weight ** 2).sum()
print(f"\n行业集中度 HHI: {hhi:.4f}")
# 最大行业权重
max_industry = industry_weight.idxmax()
max_weight = industry_weight.max()
print(f"最大行业: {max_industry}")
print(f"最大行业权重: {max_weight:.2%}")
这个代码的核心其实只有一句话:
先算每只股票的市值,再把市值按照行业聚合。
这样就能避免一个非常典型的投资错觉。
比如你账户里面有:
- 贵州茅台
- 五粮液
- 泸州老窖
- 山西汾酒
你可能觉得:
“我买了 4 只股票,应该挺分散。”
错。
如果它们都属于同一个行业,那么你的股票数量是 4,但你的行业风险暴露可能依然非常集中。
1. 为什么我更推荐看行业权重?
因为单纯看持仓数量,很容易产生错觉。
例如:
| 股票 | 行业 | 仓位 |
|---|---|---|
| A | 食品饮料 | 15% |
| B | 食品饮料 | 12% |
| C | 食品饮料 | 10% |
| D | 银行 | 8% |
| E | 家电 | 7% |
| F | 电力设备 | 6% |
看起来有 6 只股票。
但是前三只加起来已经:
37% 全压在食品饮料。
如果食品饮料行业整体出现估值杀跌,那么这 3 只股票可能同时承压。
所以我自己做组合检查时,更喜欢同时看:
- 单股权重
- 行业权重
- 最大行业权重
- HHI 行业集中度
2. 再加一层:用前复权 K 线做历史分析
如果我们不只是看当前仓位,而是要分析:
“过去半年我的行业集中风险有没有持续上升?”
就可以使用 QuantDash 的 K 线接口。
例如:
from quantdash import QuantDash
qd = QuantDash()
df = qd.klines.get(
"600519.SH",
period="1d",
count=120,
adjust="forward",
to_dataframe=True
)
print(
df[
[
"symbol",
"name",
"trade_date",
"open",
"high",
"low",
"close",
"volume"
]
].tail()
)
这里的 adjust="forward" 是 QuantDash 官方支持的前复权方式,而且是默认复权方式。官方文档同时支持 backward、none、forward_additive 和 backward_additive。
我做收益率计算时,一般会特别注意这一点。
不要拿不复权价格直接做长期收益率比较。
3. 如果股票很多,别一个个请求
假设我的组合不是 6 只股票,而是 50 只、100 只。
这时候可以直接用:
symbols = [
"600519.SH",
"000858.SZ",
"600036.SH",
"601318.SH",
"000333.SZ",
"300750.SZ"
]
dfs = qd.klines.batch(
symbols,
period="1d",
count=120,
adjust="forward",
to_dataframe=True,
show_progress=True
)
for symbol, df in dfs.items():
print(symbol)
print(df.tail())
这就是我觉得 QuantDash 对量化研究比较舒服的地方:
数据获取代码很短,研究时间可以真正放在策略逻辑上。
官方 GitHub 仓库也提供了 Python 示例和 SDK 使用说明,当前仓库明确说明完整接口以官方文档为准。
四、交易员避坑指南:行业集中度不是越低越好
这里我要提醒一个很容易走极端的问题。
很多人第一次算完行业集中度以后,就开始:
“这个行业超过 20%,砍!”
我觉得没必要。
风险控制不是简单追求分散。
如果你特别看好某个行业,适当集中是完全可以理解的。
真正应该警惕的是:
坑 1:把“股票数量”当成“风险分散”
10 只股票不代表 10 个独立风险。
如果 8 只都来自同一个产业链,实际风险可能高度相关。
坑 2:只看当前价格,不看复权
做历史回测时,建议明确选择复权方式。
如果主要计算收益率,可以考虑使用比例前复权:
adjust="forward"
QuantDash 官方文档明确将 forward 定义为前复权比例方式,适合收益率计算。
坑 3:回测时忘记交易成本
即使行业集中度模型本身没有问题,回测结果也可能虚高。
至少要考虑:
- 手续费
- 印花税
- 滑点
- 换手率
- 实际成交价格
尤其是高频调仓策略。
回测收益 30%,如果换手极高,实盘不一定还能剩多少。
坑 4:把相关性当成固定值
两个股票今天相关性高,不代表未来永远高。
行业集中度最好和:
- 收益相关性
- 波动率
- 最大回撤
- 仓位变化
一起观察。
这才是比较完整的组合风险画像。
五、常见问题解答(Q&A / FAQ)
Q1:Python 怎么分析 A 股持仓行业集中度?
A:最简单的方式就是先获得持仓股票当前市值,再按照行业分组汇总,最后计算行业权重和 HHI。QuantDash Python SDK 可以通过 quotes.get 获取行情,并直接返回 Pandas DataFrame,适合继续做组合分析。官方 SDK 安装方式是 pip install quantdash,完整参数建议以 QuantDash 官方 Python SDK 文档 为准。
Q2:QuantDash 能不能批量获取 A 股股票数据?
A:可以。官方 SDK 提供 qd.klines.batch(),可以批量获取多个股票的 K 线数据;A 股股票代码统一使用 .SH、.SZ、.BJ 等交易所后缀。
Q3:能不能把 QuantDash 数据交给 DeepSeek 做智能诊股?
A:可以把 QuantDash 获取并整理好的 DataFrame 结果转换成文本或结构化数据,再交给 DeepSeek 做自然语言层面的分析,例如让 AI 判断“行业集中度是否过高、哪些行业贡献最大”。但 DeepSeek API 的具体调用方式不属于 QuantDash 官方 SDK 文档范围,因此这里不虚构具体 API 参数;如果要接入,应以 DeepSeek 官方 API 文档为准。
🔗 相关资源与延伸阅读
🚀 QuantDash 官网:
https://quantdash.net/
📖 官方 Python SDK 文档:
https://docs.quantdash.net/
⭐ GitHub 开源仓库:
QuantDash GitHub 开源项目
💡 API Key:
QuantDash API Key 管理页面
我的结论很简单:
量化交易不是股票买得越多越安全。
真正应该问的是:
我的钱,到底暴露在哪几个行业风险上?
先把这个问题算清楚,再谈选股、MACD、KDJ、MA、BOLL,甚至让 DeepSeek 辅助诊股,才更有意义。
QuantDash 的价值就在这里:把数据获取这件麻烦事尽量压缩成几行 Python,让我们把时间真正花在策略研究上。

