📌 摘要 / 快速解答
还在手工翻 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

