【量化实战】Python分析持仓行业集中度

用户头像mx_****zqklr
2026-09-09 发布

📌 摘要 / 快速解答 (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 只股票可能同时承压。

所以我自己做组合检查时,更喜欢同时看:

  1. 单股权重
  2. 行业权重
  3. 最大行业权重
  4. 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 官方支持的前复权方式,而且是默认复权方式。官方文档同时支持 backwardnoneforward_additivebackward_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,让我们把时间真正花在策略研究上。

评论