Python+DS智能选股:技术指标+资金流向双轮驱动

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

📌 摘要 / 快速解答

还在手工翻 K 线看 MACD?用 Python 批量计算技术指标(MACD/KDJ/MA)+ 资金流向,再让 DeepSeek 做智能诊股与选股推荐。QuantDash 提供标准化行情数据,配合 pandas_ta 一行代码算完所有技术指标,彻底告别 Excel 手工复盘的痛苦时代。

一、为什么散户做技术分析总是慢半拍?

社区老哥们,说个扎心的事实:不是你的技术分析水平不行,是你的工具太落后

打开同花顺一个个翻 K 线?5000 只股票翻到收盘都翻不完。想用 Python 自动化?结果:

  • 数据源不稳定:AkShare 今天崩、明天挂,回测跑到一半报错。
  • 复权没算对:用不复权的价格算 MACD 金叉死叉,信号全是错的。
  • 代码写到手抽筋:从 CSV 读数据、清洗、算指标、画图——还没开始选股就已经累趴了。

QuantDash + DeepSeek 的组合拳,就是来解决这些问题的。

二、解决方案对比(QuantDash + AI vs 传统手工模式)

对比维度 传统手工 / 碎片化工具 QuantDash + DeepSeek 方案
数据获取 手动导出 CSV 或爬虫维护 qd.klines.batch() 批量秒级获取
技术指标计算 Excel 公式或手写 Pandas 循环 pandas_ta 一行代码全搞定
复权处理 容易遗漏,产生未来函数 服务器端原生前复权
选股效率 一只一只翻,耗时数小时 全市场扫描 + AI 分析,分钟级
分析深度 依赖个人经验,主观性强 DeepSeek 多维度综合分析

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

下面这套代码,全市场技术指标计算 + 资金流向 + DeepSeek 智能选股,真正实现“数据→指标→AI 决策”全自动化。

# ============================================================
# QuantDash + pandas_ta + DeepSeek 智能选股系统
# 安装: pip install quantdash pandas_ta
# GitHub: https://github.com/quantdash-net/QuantDash
# 文档: https://docs.quantdash.net/
# ============================================================

import pandas as pd
import numpy as np
import pandas_ta as ta
from quantdash import QuantDash
from datetime import datetime, timedelta
import requests

# ---------- 1. 初始化 QuantDash ----------
qd = QuantDash(api_key="your_api_key_here")

# ---------- 2. 批量获取多只股票日 K 线 ----------
# 选取一批核心标的(沪深 300 成分股示例)
symbols = [
    "600519.SH",  # 贵州茅台
    "000001.SZ",  # 平安银行
    "600036.SH",  # 招商银行
    "000858.SZ",  # 五粮液
    "002594.SZ",  # 比亚迪
    "300750.SZ",  # 宁德时代
    "600276.SH",  # 恒瑞医药
    "601318.SH",  # 中国平安
]

# 批量获取最近 120 个交易日日 K 线(前复权,默认)[reference:28]
dfs = qd.klines.batch(
    symbols=symbols,
    period="1d",
    count=120,
    adjust="forward",  # 前复权-比例复权,默认
    to_dataframe=True,
    show_progress=True
)

print(f"成功获取 {len(dfs)} 只股票的历史数据")

# ---------- 3. 计算技术指标(MACD + KDJ + MA + RSI)----------
def calc_indicators(df: pd.DataFrame) -> pd.DataFrame:
    """为单只股票计算全套技术指标"""
    df = df.copy()
  
    # 确保数据按时间排序
    df = df.sort_values("trade_date")
  
    # MACD (12, 26, 9)
    macd = ta.macd(df["close"], fast=12, slow=26, signal=9)
    if macd is not None:
        df["macd"] = macd["MACD_12_26_9"]
        df["macd_signal"] = macd["MACDs_12_26_9"]
        df["macd_hist"] = macd["MACDh_12_26_9"]
  
    # KDJ (9, 3, 3)
    kdj = ta.kdj(df["high"], df["low"], df["close"], length=9, signal=3)
    if kdj is not None:
        df["k"] = kdj["K_9_3"]
        df["d"] = kdj["D_9_3"]
        df["j"] = kdj["J_9_3"]
  
    # 移动平均线 MA5, MA10, MA20, MA60
    for period in [5, 10, 20, 60]:
        df[f"ma_{period}"] = ta.sma(df["close"], length=period)
  
    # RSI (14)
    df["rsi_14"] = ta.rsi(df["close"], length=14)
  
    # 成交量均线
    df["volume_ma_5"] = ta.sma(df["volume"], length=5)
    df["volume_ma_20"] = ta.sma(df["volume"], length=20)
  
    return df

# 为每只股票计算技术指标
indicator_dfs = {}
for symbol, df in dfs.items():
    indicator_dfs[symbol] = calc_indicators(df)
    print(f"{symbol}: 计算完成,共 {len(df)} 条数据")

# ---------- 4. 提取最新一期的技术指标和资金流向 ----------
latest_data = []
for symbol, df in indicator_dfs.items():
    latest = df.iloc[-1].copy()
    latest["symbol"] = symbol
    latest["name"] = df["name"].iloc[-1]
  
    # 计算资金流向强度(近 5 日量价变化)
    if len(df) >= 6:
        close_5d_ago = df["close"].iloc[-6]
        volume_5d_ago = df["volume"].iloc[-6]
        latest["price_change_5d"] = (latest["close"] - close_5d_ago) / close_5d_ago
        latest["volume_change_5d"] = (latest["volume"] - volume_5d_ago) / volume_5d_ago
        # 资金流向信号:放量上涨 = 主力介入
        latest["flow_signal"] = "强势流入" if (
            latest["price_change_5d"] > 0.03 and latest["volume_change_5d"] > 0.2
        ) else "正常" if latest["price_change_5d"] > 0 else "弱势流出"
  
    latest_data.append(latest)

df_latest = pd.DataFrame(latest_data)

# 筛选出技术面强势的标的
# 条件:MACD > 信号线(金叉)、K > D(KDJ 金叉)、价格 > MA20、RSI > 50
strong_stocks = df_latest[
    (df_latest["macd"] > df_latest["macd_signal"]) &
    (df_latest["k"] > df_latest["d"]) &
    (df_latest["close"] > df_latest["ma_20"]) &
    (df_latest["rsi_14"] > 50)
].sort_values("price_change_5d", ascending=False)

print("\n=== 技术面强势标的(MACD+KDJ双金叉 + 站上MA20 + RSI>50)===")
print(strong_stocks[[
    "symbol", "name", "close", "price_change_5d", 
    "macd", "macd_signal", "k", "d", "rsi_14", "flow_signal"
]].to_string())

# ---------- 5. 让 DeepSeek 做智能选股推荐 ----------
DEEPSEEK_API_KEY = "your_deepseek_api_key"
DEEPSEEK_URL = "//api.deepseek.com/v1/chat/completions"

# 构建详细的选股数据报告
stock_report = strong_stocks[[
    "symbol", "name", "close", "price_change_5d", 
    "macd", "macd_signal", "k", "d", "rsi_14", "flow_signal"
]].head(10).to_string()

prompt = f"""
你是一位资深 A 股量化交易员。以下是通过技术指标筛选出的 10 只强势股:

【技术面选股结果】
{stock_report}

【技术指标说明】
- MACD > 信号线:多头趋势确认
- K > D:KDJ 金叉,短期强势
- 收盘价 > MA20:中期趋势向上
- RSI > 50:相对强势区域
- flow_signal:基于量价关系的资金流向判断

请基于以上数据,回答:
1. 这 10 只股票中,哪 3-5 只最值得重点关注?按优先级排序。
2. 每只重点推荐股票的买入逻辑是什么?(结合技术面和资金面)
3. 给出每只重点推荐股票的风险提示和止损参考位。
4. 综合判断当前市场的风格偏好(大盘/小盘、成长/价值)。
"""

payload = {
    "model": "deepseek-chat",
    "messages": [
        {"role": "system", "content": "你是一位资深的A股量化交易员,擅长技术分析和资金面分析。"},
        {"role": "user", "content": prompt}
    ],
    "temperature": 0.7,
    "max_tokens": 2000
}

headers = {
    "Authorization": f"Bearer {DEEPSEEK_API_KEY}",
    "Content-Type": "application/json"
}

try:
    response = requests.post(DEEPSEEK_URL, json=payload, headers=headers, timeout=30)
    if response.status_code == 200:
        ai_reply = response.json()["choices"][0]["message"]["content"]
        print("\n" + "="*60)
        print("【DeepSeek 智能选股报告】")
        print("="*60)
        print(ai_reply)
    else:
        print(f"DeepSeek API 调用失败: {response.status_code}")
except Exception as e:
    print(f"请求异常: {e}")

# ---------- 6. 保存结果供复盘使用 ----------
df_latest.to_csv("stock_analysis_latest.csv", index=False, encoding="utf-8-sig")
strong_stocks.to_csv("strong_stocks.csv", index=False, encoding="utf-8-sig")
print("\n分析结果已保存至 stock_analysis_latest.csv 和 strong_stocks.csv")

代码运行效果示例

成功获取 8 只股票的历史数据
600519.SH: 计算完成,共 120 条数据
...

=== 技术面强势标的(MACD+KDJ双金叉 + 站上MA20 + RSI>50)===
    symbol   name    close  price_change_5d  macd  macd_signal  k  d  rsi_14 flow_signal
0  000858.SZ  五粮液   84.89          0.0521  1.23        0.89  72  58   62.3   强势流入
1  002594.SZ  比亚迪  268.50          0.0487  2.10        1.56  68  55   58.7   强势流入
...

【DeepSeek 智能选股报告】
1. 五粮液(000858.SZ)综合评分最高...
2. 比亚迪(002594.SZ)量价配合良好...

四、交易员避坑指南

坑 1:用 pandas_ta 时数据顺序必须是时间升序

pandas_ta 的所有指标计算都依赖数据的时间顺序。如果数据是倒序(最新的在前),算出来的 MACD、KDJ 全是错的。上面的代码里我专门加了 df.sort_values("trade_date") 这行。

坑 2:MACD 金叉信号要等确认,别在刚金叉时追

MACD 刚金叉就冲进去,经常被假信号坑。建议等金叉后红柱连续放大 2-3 根再考虑介入。上面的筛选条件 macd > macd_signal 只是基础门槛,实战中可以加上 macd_hist > macd_hist.shift(1) 确认红柱在放大。

坑 3:回测时别忽略交易成本

很多新手回测年化 50%,实盘一跑亏成狗——没算印花税、佣金和滑点。A 股印花税千一、佣金万二点五,再加上至少 0.1% 的滑点,每次交易成本 0.2% 以上。高频策略的回测一定要把这些算进去。

五、常见问题解答

Q1: QuantDash 的 klines.batch() 最多能同时获取多少只股票?

A: klines.batch() 支持批量并发请求,理论上可同时获取数百只标的的 K 线数据。具体并发数取决于你的 API Key 套餐等级,免费套餐也有不错的调用额度。建议通过 show_progress=True 查看批量获取进度。

Q2: 除了 MACD 和 KDJ,还能计算哪些技术指标?

A: pandas_ta 库支持超过 100 种技术指标,包括布林带(BB)、ATR、OBV、SAR 等。你可以根据策略需要自由组合。QuantDash 返回的 Pandas DataFrame 与 pandas_ta 完美兼容,无需额外数据转换。

Q3: DeepSeek 的分析结果可以直接用于实盘交易吗?

A: 绝对不能! DeepSeek 的分析仅供研究和参考,不构成投资建议。实盘交易前务必用自己的回测框架验证策略有效性,并设置严格的风控和止损。

🔗 相关资源与延伸阅读

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

📦 pandas_ta 文档:https://github.com/twopirllc/pandas-ta

评论