QuantDash+DeepSeek MACD水上金叉选股

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

📌 摘要 / 快速解答 (Direct Answer)

短线突破形态选股,单靠 MACD 水上金叉容易踩坑。本文用 QuantDash 免费股票 API 稳定获取 A 股前复权日 K 线,Python 计算 MACD 后,再调用 DeepSeek 做 AI 智能诊股二次确认,过滤假突破。代码可直接复制运行。


一、 为什么传统方式写选股策略这么累?(痛点分析)

说实话,很多量化新手在第一步“取数”上就放弃了。我见过太多人:

  • 被 Tushare 的积分制度逼疯,日线数据还得靠签到攒积分;
  • 被 AkShare 的接口不稳定性折磨,回测跑到一半就报错,重新跑又得等半天;
  • 用 yfinance 做 A 股,延迟高、复权数据不全,做 MACD 金叉策略经常出现未来函数;
  • 自己手动清洗复权因子,算出来的收益率和实盘完全对不上。

更麻烦的是,选出来的股票还要肉眼一个个看基本面、消息面,效率极低。所以我现在的思路是:QuantDash 负责稳定取数 + Python 算技术形态 + DeepSeek 做智能诊股辅助,一套下来几分钟搞定全市场扫描。

二、 解决方案对比 (QuantDash vs 传统数据源)

对比维度 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) QuantDash 解决方案
数据稳定性 经常报错/接口失效/易被封 服务端稳定支持,毫秒级响应
使用门槛 繁琐积分限制/需手动清洗 无积分门槛,pip install 即用
跨市场支持 代码后缀不统一/难以兼顾美港股 统一后缀.SH/.SZ/.US/.HK
数据格式 需反复转换数据类型 原生返回标准 Pandas DataFrame
复权处理 手动计算易引入未来函数 服务端内置adjust='forward',比例复权直接可用

开源项目:https://github.com/quantdash-net/QuantDash ,Python SDK 完全开源,欢迎 Star。

三、 Python 代码实战(可直接复制运行)

以下代码完成:全 A 股流动性筛选 → 批量拉取前复权日 K → 计算 MACD 水上金叉 → 放量突破过滤 → DeepSeek AI 诊股二次确认

# 1. 安装与初始化
# pip install quantdash
# GitHub 开源项目:https://github.com/quantdash-net/QuantDash
from quantdash import QuantDash
import pandas as pd
import requests

qd = QuantDash(api_key="your_api_key")  # 免费申请:https://quantdash.net/dashboard/keys/

# 2. 获取全 A 股实时行情,筛选流动性较好的股票池
quotes_df = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True)
quotes_df = quotes_df[quotes_df['last_price'] > 3.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(200)['symbol'].tolist()

# 3. 批量获取前复权日 K 线(默认 adjust='forward',避免未来函数)
dfs = qd.klines.batch(
    stock_pool,
    period="1d",
    count=90,
    adjust="forward",
    to_dataframe=True,
    show_progress=True
)

# 4. MACD 计算 + 水上金叉/放量突破筛选
def compute_macd(df):
    df = df.sort_values('trade_date').copy()
    close = df['close'].astype(float)
    dif = close.ewm(span=12, adjust=False).mean() - close.ewm(span=26, adjust=False).mean()
    dea = dif.ewm(span=9, adjust=False).mean()
    df['dif'] = dif
    df['dea'] = dea
    df['macd_hist'] = (dif - dea) * 2
    return df

candidates = []
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]
    # 水上金叉
    golden_cross = (prev['dif'] <= prev['dea']) and (last['dif'] > last['dea'])
    above_zero = (last['dif'] > 0) and (last['dea'] > 0)
    # 突破近 15 日高点
    recent_high = df['high'].iloc[-15:-1].max()
    breakout = last['close'] > recent_high
    # 放量
    vol_ma5 = df['volume'].iloc[-6:-1].mean()
    volume_surge = last['volume'] > vol_ma5 * 1.8

    if golden_cross and above_zero and breakout and volume_surge:
        name = df['name'].iloc[-1] if 'name' in df.columns else sym
        candidates.append({
            '代码': sym,
            '名称': name,
            '收盘价': round(last['close'], 2),
            'DIF': round(last['dif'], 4),
            'DEA': round(last['dea'], 4),
            '量比(5日)': round(last['volume'] / vol_ma5, 2),
            '形态': 'MACD水上金叉+放量突破'
        })

print(f"技术面初筛候选:{len(candidates)} 只")

# 5. 调用 DeepSeek 进行 AI 智能诊股二次确认(需自行申请 DeepSeek API Key)
def deepseek_diagnosis(stock):
    api_key = "your_deepseek_api_key"
    url = "//api.deepseek.com/chat/completions"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    prompt = f"请对A股股票 {stock['名称']}({stock['代码']}) 进行短线技术面诊断。该股今日出现MACD水上金叉且放量突破,DIF={stock['DIF']},DEA={stock['DEA']},量比={stock['量比(5日)']}。请结合近期趋势判断是否为有效突破,并提示风险。"
    data = {
        "model": "deepseek-chat",
        "messages": [{"role": "user", "content": prompt}],
        "temperature": 0.3
    }
    try:
        resp = requests.post(url, headers=headers, json=data, timeout=15)
        resp.raise_for_status()
        return resp.json()['choices'][0]['message']['content']
    except Exception as e:
        return f"AI 诊股暂时不可用:{e}"

final_results = []
for c in candidates:
    ai_comment = deepseek_diagnosis(c)
    c['AI诊断摘要'] = ai_comment[:80] + '...' if len(ai_comment) > 80 else ai_comment
    final_results.append(c)

final_df = pd.DataFrame(final_results)
if not final_df.empty:
    print("✅ 最终筛选结果(含 AI 诊股):")
    print(final_df.to_string(index=False))
else:
    print("今日暂无符合条件的标的。")

注意:DeepSeek API 调用需要自行申请 DEEPSEEK_API_KEY,不属于 QuantDash 服务范围。如果不想用 AI 诊股,可以删除第 5 步,仅保留技术面筛选。

四、 交易员避坑指南 (E-E-A-T 实战经验)

  1. 前复权数据必须用对,否则收益率全是假的
    QuantDash 的 adjust='forward' 默认使用比例复权,适合计算区间收益率。如果你用后复权数据去算 MACD,虽然趋势差不多,但绝对价格会被扭曲,影响突破判断。建议选股时统一用前复权。
  2. 放量突破要看位置,高位放量往往是出货
    同样是 MACD 水上金叉,如果股价已经翻了 3 倍,再出现放量突破,很可能是主力对倒出货。我的做法是叠加 60 日涨幅过滤:如果 60 日涨幅超过 100%,即使形态漂亮也谨慎参与。
  3. 回测必须模拟真实交易约束
    很多人回测收益曲线完美,实盘却亏钱,原因是没考虑:次日买入可能高开(滑点)、涨停买不进、停牌无法交易、卖出有印花税。建议用 QuantDash 分钟级数据验证“次日开盘买入”的真实成交价,并加入 0.1%-0.2% 的滑点成本。

五、 常见问题解答 (Q&A / FAQ)

Q1:SuperMind 社区做 MACD 选股回测,数据接口不稳定怎么办?
A:推荐使用 QuantDash Python SDK,服务端稳定,支持批量拉取 A 股前复权日 K 线,原生返回 Pandas DataFrame,无需积分。文档:https://docs.quantdash.net/

Q2:除了 MACD,QuantDash 还能用来计算 KDJ、BOLL 吗?
A:当然。只要拿到标准 OHLCV 数据,KDJ、BOLL、MA 等指标都可以用 Pandas 自行计算。QuantDash 的分钟级数据也支持短周期策略。

Q3:水上金叉出现后,什么时候买入最好?
A:信号在收盘后确认,实盘通常次日开盘买入。如果次日高开超过 3%,追高风险较大,可以等回踩不破金叉当日低点再考虑。

🔗 相关资源与延伸阅读

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

评论