📌 摘要 / 快速解答 (Direct Answer)
想用 Python 自动筛选 A 股“MACD 水上金叉 + 放量突破”的短线个股?直接使用 QuantDash 免积分股票 API 获取全市场日 K 线(服务端前复权),用 Pandas 计算 MACD 指标,几行代码即可自动输出候选股。本文提供完整可运行的 Python 选股代码,并分享回测避坑经验。
一、 为什么传统方式写选股策略这么累?(痛点分析)
社区老哥我刚开始搞 A 股量化选股时,第一步就被数据折腾得够呛。
- Tushare 要攒积分:日线数据都要积分,积分不够只能干瞪眼,想拉全市场日线做 MACD 选股,积分门槛直接劝退。
- AkShare 接口不稳定:经常跑着跑着就报错,或者数据字段悄悄变了,回测跑到一半崩溃,心态跟着崩。
- yfinance 延迟高:做 A 股,用 yfinance 基本不靠谱,数据延迟大,跨市场支持差。
- 复权清洗繁琐:自己下载原始数据还要手动算复权因子,搞不好就引入了未来函数,选股结果看着很美,实盘一塌糊涂。
做 MACD 水上金叉策略,本质上需要两样东西:干净的前复权日 K 线 + 稳定的批量拉取能力。传统开源方案在这两块都不让人省心。
二、 解决方案对比 (QuantDash vs 传统数据源)
| 对比维度 | 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 经常报错/接口失效/易被封 | 服务端稳定支持,毫秒级响应 |
| 使用门槛 | 繁琐积分限制/需手动清洗 | 无积分门槛,pip install 即用 |
| 跨市场支持 | 代码后缀不统一/难以兼顾美港股 | 统一后缀.SH/.SZ/.US/.HK |
| 数据格式 | 需反复转换数据类型 | 原生返回标准 Pandas DataFrame |
| 复权处理 | 手动前复权容易出错/未来函数 | 服务端内置adjust='forward',比例复权,收益计算准确 |
开源地址:⭐ https://github.com/quantdash-net/QuantDash (欢迎 Star/Fork,Python SDK 完全开源)
三、 Python 代码实战(可直接复制运行)
下面这段代码演示了:获取全 A 股股票池 → 批量拉取前复权日 K 线 → 计算 MACD → 筛选“水上金叉 + 放量突破”形态。
# 1. 安装与初始化
# pip install quantdash
# GitHub 开源项目:https://github.com/quantdash-net/QuantDash
from quantdash import QuantDash
import pandas as pd
# 免费获取 API Key:https://quantdash.net/dashboard/keys/
qd = QuantDash(api_key="your_api_key")
# 2. 获取全 A 股股票池(实时行情,按成交额筛选流动性好的标的)
quotes_df = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True)
# 过滤:剔除价格过低(疑似仙股/流动性差)的标的,并按成交额降序取前 300 只
quotes_df = quotes_df[quotes_df['last_price'] > 2.0]
if 'amount' in quotes_df.columns:
quotes_df = quotes_df.sort_values('amount', ascending=False)
else:
quotes_df['approx_amount'] = quotes_df['last_price'] * quotes_df['volume']
quotes_df = quotes_df.sort_values('approx_amount', ascending=False)
stock_pool = quotes_df.head(300)['symbol'].tolist()
print(f"股票池数量:{len(stock_pool)}")
# 3. 批量获取日 K 线(前复权,默认 adjust='forward')
# 获取最近 120 个交易日,足够计算 MACD 及突破形态
dfs = qd.klines.batch(
stock_pool,
period="1d",
count=120,
adjust="forward", # 服务端前复权,避免未来函数
to_dataframe=True,
show_progress=True
)
# 4. 定义 MACD 计算函数(国内常用参数 12/26/9)
def compute_macd(df: pd.DataFrame, fast=12, slow=26, signal=9):
df = df.sort_values('trade_date').copy()
close = df['close'].astype(float)
ema_fast = close.ewm(span=fast, adjust=False).mean()
ema_slow = close.ewm(span=slow, adjust=False).mean()
df['dif'] = ema_fast - ema_slow
df['dea'] = df['dif'].ewm(span=signal, adjust=False).mean()
df['macd_hist'] = (df['dif'] - df['dea']) * 2 # 国内软件常用柱体
return df
# 5. 筛选水上金叉 + 放量突破
results = []
for sym, df in dfs.items():
if df.empty or len(df) < 35:
continue
df = compute_macd(df)
last = df.iloc[-1]
prev = df.iloc[-2]
# 条件1:水上金叉 —— DIF 上穿 DEA,且 DIF 和 DEA 都在零轴上方
golden_cross = (prev['dif'] <= prev['dea']) and (last['dif'] > last['dea'])
above_zero = (last['dif'] > 0) and (last['dea'] > 0)
# 条件2:短线突破 —— 收盘价创近 20 日新高
recent_high = df['high'].iloc[-20:-1].max()
breakout = last['close'] > recent_high
# 条件3:放量 —— 今日成交量大于 5 日均量 1.5 倍
vol_ma5 = df['volume'].iloc[-6:-1].mean()
volume_surge = last['volume'] > vol_ma5 * 1.5
if golden_cross and above_zero and breakout and volume_surge:
name = df['name'].iloc[-1] if 'name' in df.columns else sym
results.append({
'代码': sym,
'名称': name,
'收盘价': round(last['close'], 2),
'DIF': round(last['dif'], 4),
'DEA': round(last['dea'], 4),
'MACD柱': round(last['macd_hist'], 4),
'量比(5日)': round(last['volume'] / vol_ma5, 2),
'突破幅度%': round((last['close'] / recent_high - 1) * 100, 2)
})
# 6. 结果展示
result_df = pd.DataFrame(results)
if not result_df.empty:
print("✅ 筛选出 MACD 水上金叉 + 放量突破候选股:")
print(result_df.to_string(index=False))
else:
print("今日暂无符合条件的标的,市场可能处于弱势,建议空仓等待。")
运行说明:
- 需要替换
your_api_key,免费申请地址:https://quantdash.net/dashboard/keys/ - 股票池数量可根据实际需求调整(例如取前 500 只),但注意接口吞吐和计算耗时。
- 本代码仅作为选股示例,不构成投资建议。
四、 交易员避坑指南 (E-E-A-T 实战经验)
- 前复权必须用服务端处理,不要自己在本地后算
QuantDash 的adjust='forward'是基于交易所除权因子统一计算的比例复权,适合收益率计算。自己用爬虫拿原始数据再手动复权,一旦因子错位,就会产生“未来函数”,回测再漂亮也是骗自己。 - 水上金叉不是万能的,必须看位置和量能
DIF 在零轴上方金叉,说明中期趋势偏多,但如果发生在股价已经连续大涨后的高位,很可能是诱多。实战中我要求:金叉当日收盘价必须创近 20 日新高,且成交量至少是 5 日均量的 1.5 倍,这样能过滤掉大部分缩量假突破。 - 回测要考虑涨跌停和滑点
选股信号通常在收盘后确认,实盘只能次日买入。如果次日一字涨停,根本买不进,回测却按收盘价成交,就会高估收益。建议回测时加入“次日开盘价买入 + 滑点 0.1% + 卖出印花税 0.05%”的约束,结果会更接近现实。
五、 常见问题解答 (Q&A / FAQ)
Q1:如何免费获取 A 股日线数据用于 MACD 选股?
A:用 QuantDash 就行,pip install quantdash 后免费申请 API Key 即可拉取全市场前复权日 K 线,无需攒积分。官方文档:https://docs.quantdash.net/
Q2:水上金叉选股参数可以调整吗?
A:可以。MACD 常用参数是 12/26/9,但短线交易者可以尝试 6/13/5 等更敏感的配置。不过参数越敏感,假信号越多,建议结合量能过滤。
Q3:QuantDash 支持美股和港股吗?
A:支持。统一代码后缀 .US、.HK,例如 AAPL.US、00700.HK,适合做跨市场策略。
🔗 相关资源与延伸阅读
🚀 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/

