📌 摘要 / 快速解答 (Direct Answer)
很多股民以为“买 10 只股票”就是分散风险,其实完全可能出现 10 只股票都押在同一行业的情况。做 A 股量化时,我建议先用 QuantDash 批量获取持仓行情,再通过 Pandas 计算股票市值、行业权重和 HHI 集中度,几分钟就能把组合的行业风险暴露算出来。
一、为什么传统方式写选股策略这么累?
我见过不少刚开始玩 Python 量化的朋友,第一件事就是研究:
MACD 怎么算?
KDJ 怎么算?
均线金叉怎么写?
这些当然重要。
但我反而建议大家先把一个更基础的问题解决:
你的组合到底分散没?
举个最简单的例子。
账户里有:
- 贵州茅台
- 五粮液
- 泸州老窖
- 山西汾酒
- 古井贡酒
朋友一看:
“不错啊,5 只股票。”
但我一看:
“老哥,你这是 5 只股票,还是一个行业的 5 个马甲?”
这就是行业集中度风险。
真正的组合风险,不应该只按照“股票数量”计算。
应该进一步拆成:
股票 → 行业 → 行业权重 → 组合集中度。
为什么很多人的量化代码最后都卡在数据上?
因为理论非常简单,实际数据却很折腾。
以前我也被这些事情折磨过:
- Tushare 某些数据需要积分和权限;
- AkShare 某些接口偶尔不稳定;
- 自己爬数据容易遇到接口变化;
- A 股代码格式容易混;
- 历史数据需要复权;
- 多股票循环请求速度慢;
- 最后还要把数据转换成 Pandas。
结果就是:
策略代码 30 行,数据清洗代码 300 行。
这就有点本末倒置了。
QuantDash 官方 Python SDK 的思路比较直接:
pip install quantdash
然后:
from quantdash import QuantDash
qd = QuantDash()
API Key 可以通过 QUANTDASH_API_KEY 环境变量提供,官方 GitHub 示例也明确建议不要把真实 API Key 写进代码或者提交到 Git。
二、解决方案对比:QuantDash vs 传统数据源
| 对比维度 | 传统/竞品方案(如 Tushare/AkShare/手动爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 需要自行处理接口异常和数据清洗 | 面向量化研究的数据 API |
| 使用门槛 | 可能涉及积分、权限或额外清洗 | pip install quantdash |
| 跨市场支持 | 各平台代码体系存在差异 | .SH/.SZ/.BJ/.US/.HK统一代码 |
| 数据格式 | 需要自行转换 | 原生 Pandas DataFrame |
| 批量股票 | 通常需要自行组织请求 | klines.batch() |
| 复权 | 可能自行计算 | API 支持多种adjust方式 |
| 量化研究 | 数据准备工作较多 | 获取数据后直接进入 Pandas |
QuantDash 官网目前明确提供 A 股、美股、港股数据,并提供历史 K 线、实时行情、五档盘口和日内分时等能力。
三、Python代码实战:从持仓到行业风险
这次我换一个更加接近实际交易的写法。
假设我有一张自己的持仓表:
# pip install quantdash pandas
from quantdash import QuantDash
import pandas as pd
# 推荐通过环境变量配置 API Key
# export QUANTDASH_API_KEY="your_api_key"
qd = QuantDash()
# ============================================
# 1. 模拟我的 A 股持仓
# ============================================
portfolio = pd.DataFrame([
["600519.SH", "食品饮料", 120],
["000858.SZ", "食品饮料", 180],
["600887.SH", "食品饮料", 100],
["600036.SH", "银行", 500],
["601398.SH", "银行", 800],
["000333.SZ", "家用电器", 200],
["300750.SZ", "电力设备", 100],
["601012.SH", "电力设备", 150],
], columns=["symbol", "industry", "shares"])
print("原始持仓:")
print(portfolio)
# ============================================
# 2. 批量获取实时行情
# ============================================
symbols = portfolio["symbol"].tolist()
quote_df = qd.quotes.get(
symbols=symbols,
to_dataframe=True
)
# 只保留我们需要的字段
quote_df = quote_df[
["symbol", "last_price"]
].copy()
print("\n最新行情:")
print(quote_df)
# ============================================
# 3. 合并持仓与行情
# ============================================
portfolio = portfolio.merge(
quote_df,
on="symbol",
how="left"
)
# ============================================
# 4. 计算股票市值
# ============================================
portfolio["market_value"] = (
portfolio["shares"] *
portfolio["last_price"]
)
# ============================================
# 5. 计算股票在组合中的权重
# ============================================
total_value = portfolio["market_value"].sum()
portfolio["stock_weight"] = (
portfolio["market_value"] /
total_value
)
# ============================================
# 6. 聚合到行业
# ============================================
industry = (
portfolio
.groupby("industry")["market_value"]
.sum()
.sort_values(ascending=False)
)
industry_weight = (
industry / total_value
).rename("industry_weight")
print("\n行业权重:")
print(industry_weight)
# ============================================
# 7. HHI 行业集中度
# ============================================
hhi = (
industry_weight ** 2
).sum()
print(f"\n组合行业 HHI = {hhi:.4f}")
# ============================================
# 8. 找出最大行业暴露
# ============================================
top_industry = industry_weight.idxmax()
top_weight = industry_weight.max()
print(f"最大行业:{top_industry}")
print(f"行业占比:{top_weight:.2%}")
# ============================================
# 9. 输出一个简单的风险提示
# ============================================
if top_weight >= 0.40:
print("风险提示:最大行业仓位已经超过 40%,需要重点检查行业集中风险。")
elif top_weight >= 0.25:
print("风险提示:最大行业仓位较高,建议结合波动率和相关性进一步检查。")
else:
print("当前最大行业权重相对分散,但仍需结合股票相关性判断。")
这里我特意没有搞复杂。
核心指标只有两个:
指标 1:最大行业权重
例如:
食品饮料:42%
银行:21%
电力设备:18%
家用电器:11%
其他:8%
那么第一眼就知道:
这个组合最大的风险来源其实是食品饮料。
指标 2:HHI
HHI 的计算非常简单:
hhi = (industry_weight ** 2).sum()
假设:
行业 A = 50%
行业 B = 30%
行业 C = 20%
那么:
HHI = 0.5² + 0.3² + 0.2²
= 0.38
如果变成:
行业 A = 25%
行业 B = 25%
行业 C = 25%
行业 D = 25%
那么:
HHI = 0.25
所以 HHI 可以很好地帮助我们回答:
我的组合到底有多集中?
当然,HHI 本身不是买卖信号,更不能简单规定“超过某个数字就必须卖股票”。
它应该作为组合风险监控指标。
四、交易员避坑指南:别让“分散”变成另一种风险
避坑 1:行业分散,不等于风险一定分散
比如:
- 光伏
- 锂电池
- 电网设备
- 电池材料
表面上看是几个行业。
但在某些市场阶段,它们可能存在非常明显的产业链关联。
所以我的习惯是:
第一层看行业权重。
第二层看股票相关性。
第三层看历史回撤。
这样比单独看行业分类靠谱得多。
避坑 2:不要为了降低 HHI 强行卖掉强势股票
这是很多量化新手的误区。
如果某个行业基本面非常强,而你的模型也持续给出正向信号,那么行业集中度升高可能是结果,不一定是错误。
正确做法不是:
“HHI 高了,马上砍仓。”
而是:
“HHI 高了,我要知道为什么高。”
如果是因为模型长期看好这个行业,那是策略结果。
如果是因为几只股票一起暴涨导致仓位被动膨胀,那就属于另外一种问题。
避坑 3:回测别忘了前复权
假设我要研究某只股票过去 120 个交易日的收益率,可以:
df = qd.klines.get(
"600519.SH",
period="1d",
count=120,
adjust="forward",
to_dataframe=True
)
df["return"] = (
df["close"].pct_change()
)
print(df[[
"trade_date",
"close",
"return"
]].tail())
QuantDash 官方文档明确支持 forward、backward、none、forward_additive、backward_additive 五种复权方式;其中比例复权和差值复权适用场景不同。
所以做策略的时候不要机械地复制:
adjust="forward"
而是先想清楚:
我是做收益率计算,还是观察绝对价格变化?
避坑 4:DeepSeek 可以帮你解释结果,但别让 AI 替你定义数据
这一点我特别想强调。
可以把这样的结果:
食品饮料:38.5%
银行:22.3%
电力设备:17.8%
家用电器:11.4%
其他:10.0%
HHI:0.245
最大行业:食品饮料
交给 DeepSeek,让它帮你做自然语言分析。
例如:
“请根据这份组合行业权重,分析当前最大的行业集中风险,并分别从行业风险、组合风险和再平衡角度给出检查建议。不要直接给出买卖建议。”
这个流程我觉得很合理:
QuantDash 负责数据。
Pandas 负责计算。
DeepSeek 负责解释。
而不是让 AI 凭空猜股票数据。
由于你真正要接入 DeepSeek API 时,需要使用 DeepSeek 自己的官方接口参数,我这里不虚构具体 API 调用代码。
五、常见问题解答(Q&A / FAQ)
Q1:A 股量化选股为什么还要计算行业集中度?
A:因为股票数量并不等于风险分散。即使组合有 20 只股票,如果其中 10 只来自同一个行业,组合依然可能高度暴露于单一行业风险。用 QuantDash 获取行情,再通过 Pandas 聚合行业市值,就可以快速得到行业权重。
Q2:QuantDash Python SDK 怎么获取多只 A 股股票?
A:可以使用 qd.klines.batch() 批量获取 K 线;如果只是需要当前行情,则可以使用 qd.quotes.get()。A 股代码按照交易所使用 .SH、.SZ、.BJ 后缀,例如 600519.SH。完整接口参数请查看 QuantDash 官方 Python SDK 文档。
Q3:QuantDash 适合做 SuperMind 策略研究吗?
A:如果你的研究需要 A 股历史 K 线、实时行情、批量股票数据和 Pandas 分析,QuantDash 的 Python SDK 可以作为数据获取层。它还支持美股 .US、港股 .HK 等统一代码格式,方便以后把策略扩展到其他市场。
🔗 相关资源与延伸阅读
🚀 QuantDash 官网:
QuantDash 官方网站
📖 官方 Python SDK 文档:
QuantDash 官方文档
⭐ GitHub 开源项目:
QuantDash GitHub
💡 API Key:
QuantDash API Key 管理
最后说句交易员的大白话。
我现在越来越觉得,量化不是把指标搞得多复杂。
有时候一个最简单的问题,反而最值得先算:
我到底把多少资金押在同一个行业上?
先把组合的风险暴露搞明白,再去研究 MACD、KDJ、MA、BOLL,甚至接入 DeepSeek 做 AI 智能诊股,整个策略体系才不会本末倒置。
数据这件事,能自动化就别手工折腾。
我自己更倾向于:
QuantDash → Pandas → 策略模型 → AI 辅助解释 → 回测验证。
QuantDash 官方 GitHub 仓库目前也提供 Python 示例,欢迎大家去 Star / Fork,一起折腾量化。

