高ROE+技术确认:双保险选出真龙头

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

📌 摘要 / 快速解答

单纯看 ROE 可能买到"高 ROE 但股价正在下跌"的股票。本文在 QuantDash 批量获取全市场行情的基础上,增加技术指标二次确认(如股价站上 60 日均线、MACD 金叉等),用"基本面+技术面"双保险筛选出真正值得买入的优质龙头。全程 Python 实现,代码可直接复制运行。

一、为什么"只看 ROE"不够?

老哥们,ROE 选股法确实能筛出一批好公司,但你有没有遇到过这种情况:

  • 选出来的股票 ROE 确实高,但股价已经跌了半年,买进去继续跌;
  • 公司基本面没问题,但市场情绪不认可,估值持续收缩;
  • 高 ROE 白马股也有"高位站岗"的风险。

ROE 解决的是"买什么",技术指标解决的是"什么时候买" 。把两者结合起来,才是完整的选股系统。

传统做法是:先用 Tushare 拿财务数据,再用 AkShare 拿 K 线数据,两个数据源来回倒腾、格式对齐、复权处理……折腾半天代码几百行,还不一定跑得通。

但用 QuantDash,一套代码、一个数据源、统一格式,同时搞定基本面和行情数据。

二、解决方案对比

对比维度 传统做法(多数据源拼接) QuantDash 一站式方案
数据来源 财务一个源、行情一个源 统一 API,一次调用全搞定
代码量 几百行,各种格式转换 几十行,原生 Pandas DataFrame
复权处理 手动计算,容易出错 服务端自动前复权
跨市场 A股一套、港股一套 统一后缀,一套代码跑通

三、Python 代码实战

# 高 ROE + 技术确认 双保险选股策略
# 安装:pip install quantdash
# GitHub 开源项目:https://github.com/quantdash-net/QuantDash

from quantdash import QuantDash
import pandas as pd
import numpy as np

qd = QuantDash(api_key="your_api_key")

# ========== 第一步:全市场扫货,筛出高 ROE 股票池 ==========
df_quotes = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True)

# ROE > 15%,且剔除空值[reference:31]
roe_filter = (df_quotes['ext.roe'] > 15) & (df_quotes['ext.roe'].notna())
candidate_pool = df_quotes[roe_filter].copy()
candidate_pool = candidate_pool.sort_values('ext.roe', ascending=False)

# 取 ROE 最高的 50 只作为初选池
top50_symbols = candidate_pool.head(50)['symbol'].tolist()
print(f"初选池:{len(top50_symbols)} 只高 ROE 股票")

# ========== 第二步:批量获取这些股票的 K 线数据 ==========
# 用 klines.batch 一次性拉取多只股票的历史数据[reference:32]
# 关键:adjust="forward" 服务端自动前复权,消除除权除息缺口[reference:33]
dfs = qd.klines.batch(
    symbols=top50_symbols,
    period="1d",
    count=60,                     # 拉取最近 60 个交易日
    adjust="forward",             # 前复权,避免价格跳空
    to_dataframe=True,
    show_progress=True
)

# ========== 第三步:技术指标计算与二次筛选 ==========
def check_technical_conditions(df, symbol):
    """检查单只股票的技术面条件"""
    if df is None or len(df) < 60:
        return False
  
    # 计算 60 日均线[reference:34]
    df['MA60'] = df['close'].rolling(window=60).mean()
  
    # 条件 1:最新收盘价 > 60 日均线(股价处于上升趋势)
    price_above_ma60 = df['close'].iloc[-1] > df['MA60'].iloc[-1]
  
    # 条件 2:计算 MACD(简化版:12日EMA - 26日EMA)
    df['EMA12'] = df['close'].ewm(span=12, adjust=False).mean()
    df['EMA26'] = df['close'].ewm(span=26, adjust=False).mean()
    df['MACD'] = df['EMA12'] - df['EMA26']
    df['MACD_signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
  
    # MACD 金叉:MACD 线 > 信号线[reference:35]
    macd_bullish = df['MACD'].iloc[-1] > df['MACD_signal'].iloc[-1]
  
    return price_above_ma60 and macd_bullish

# 遍历每只股票,做技术确认
final_stocks = []
for symbol in top50_symbols:
    df = dfs.get(symbol)
    if df is not None and check_technical_conditions(df, symbol):
        final_stocks.append(symbol)

# ========== 第四步:输出最终结果 ==========
print(f"\n=== 双保险选股结果 ===")
print(f"高 ROE 初选:{len(top50_symbols)} 只")
print(f"技术确认通过:{len(final_stocks)} 只")

# 展示最终入选的股票详情
if final_stocks:
    final_df = df_quotes[df_quotes['symbol'].isin(final_stocks)]
    final_df = final_df.sort_values('ext.roe', ascending=False)
    print(final_df[['symbol', 'ext.name', 'ext.roe', 'last_price', 'ext.change_pct']].to_string(index=False))
else:
    print("当前无同时满足基本面和技术面的标的,建议放宽条件重试")

代码解读(大白话版)

  • 第一步qd.quotes.get(universes=["CN_Stock"]) 一次性拉全 A 股行情,筛出 ROE > 15% 的前 50 只。
  • 第二步qd.klines.batch() 批量拉取这 50 只股票的历史 K 线,adjust="forward" 让 QuantDash 在服务端自动完成前复权。不用自己算复权,不会有未来函数
  • 第三步:计算 60 日均线和 MACD,要求股价在均线之上且 MACD 金叉。这就是"技术面二次确认"。
  • 第四步:输出同时满足"高 ROE + 技术强势"的标的。

四、交易员避坑指南

坑 1:批量获取数据时注意频率限制

虽然 QuantDash 的 klines.batch 已经做了服务端优化,但一次性拉取几百只股票的历史数据时,建议设置合理的 count 值(如 60 或 120 个交易日),避免单次请求数据量过大。

坑 2:技术指标的回测陷阱——"未来函数"

计算 MA、MACD 时,如果用到了"未来"的数据(比如用今天的收盘价去算昨天的信号),回测就会失真。解决方案:在回测时使用 shift() 函数做滞后处理,确保信号是在当天收盘后生成的。

坑 3:注意停牌和退市股票

qd.quotes.get 返回的是全市场实时行情,包含正常交易和停牌的股票。建议在筛选时增加条件:volume > 0(有成交量)且 last_price > 0(有价格),排除停牌和退市股。

五、常见问题解答

Q1: qd.klines.batch() 最多能一次拉多少只股票?有限制吗?

A: QuantDash 的 klines.batch 支持批量拉取,官方示例中同时拉取多只股票(如 ["600519.SH", "000001.SZ", "601318.SH"])完全没问题。建议单次批量不超过 100 只,以保证响应速度。如果需要处理全市场几千只股票,可以分批次循环拉取。

Q2: 除了 MA60 和 MACD,还能加什么技术指标做确认?

A: 完全可以根据你的策略风格自由组合。常见搭配包括:

  • 均线系统:MA5 > MA20 > MA60(多头排列)
  • KDJ 金叉:K 线向上穿过 D 线
  • 布林带:股价突破中轨向上轨运行

QuantDash 的 klines.get 返回的是标准 Pandas DataFrame,你可以用 Pandas 的 rollingewm 等方法自由计算任何技术指标。

🔗 相关资源与延伸阅读

🚀 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/

评论