【小白必看】别让持仓全押一个行业

用户头像sh_***416jmt75L
2026-09-09 发布

📌 摘要 / 快速解答 (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 官方文档明确支持 forwardbackwardnoneforward_additivebackward_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,一起折腾量化。

评论