三因子量化选股:Python+AI智能诊股实战

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

📌 摘要 / 快速解答

本文手把手教你用 Python + QuantDash + DeepSeek API 搭建一套“低PE + 高ROE + 动量突破”的多因子选股系统。通过QuantDash批量获取前复权K线数据(pip install quantdash),结合Pandas计算因子打分,再将Top股票的结构化数据送入DeepSeek进行AI智能诊股,实现从“数据拉取 → 因子选股 → AI诊断”的全自动化流程。

一、为什么传统选股方式又累又低效?

老哥们,做量化选股这些年,我踩过的坑能写本书:

  • 数据源是最大的痛点:AkShare动不动报错、Tushare要攒积分、yfinance延迟高。搞了半天策略逻辑,结果数据拉不下来,全白干;
  • 人工复盘太费眼睛:算完因子选出股票,还得一个个翻K线图看形态、查基本面,一天复盘几十只股票眼睛都快瞎了;
  • AI诊股数据喂不进去:想用DeepSeek分析股票,还得手动整理数据格式,效率极低。

我的解决方案:用QuantDash搞定数据(稳定、免积分、自动复权),用Pandas搞定因子计算,用DeepSeek API搞定智能诊股——全自动,10分钟搞定以前一天的工作

二、解决方案对比

对比维度 传统人工方式 / 零散工具 QuantDash + DeepSeek 自动化方案
数据获取 手动导出Excel或爬虫易崩 qd.klines.batch()一键批量拉取
因子计算 Excel手工算,易出错 Pandas向量化计算,秒级完成
股票诊断 人工翻K线、读研报 DeepSeek API自动分析,秒出报告
复权处理 手动算除权因子,易踩坑 服务端自动前复权(adjust='forward'
全流程耗时 1天+ 10分钟

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

# ============================================================
# 三因子量化选股 + DeepSeek AI智能诊股
# 依赖安装:pip install quantdash pandas numpy openai
# GitHub开源:https://github.com/quantdash-net/QuantDash
# ============================================================

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

# ---------- 1. 初始化 ----------
# QuantDash初始化(免费获取API Key:https://quantdash.net/dashboard/keys/)
qd = QuantDash(api_key="your_quantdash_api_key")

# DeepSeek初始化(官网获取API Key)
deepseek_client = OpenAI(
    api_key="your_deepseek_api_key",
    base_url="//api.deepseek.com"
)

# ---------- 2. 定义股票池 ----------
STOCK_POOL = [
    "600519.SH", "000858.SZ", "601318.SH", "600036.SH",
    "000333.SZ", "002594.SZ", "600900.SH", "601166.SH",
]

# ---------- 3. 批量获取前复权日K线 ----------
print("⏳ 正在批量拉取前复权日K线数据...")
dfs = qd.klines.batch(
    symbols=STOCK_POOL,
    period="1d",
    count=60,
    adjust="forward",      # 服务器端前复权,避免未来函数[reference:37]
    to_dataframe=True,
    show_progress=True
)

# ---------- 4. 多因子评分函数 ----------
def multi_factor_scoring(df_dict):
    """计算每只股票的因子得分"""
    results = []
    for symbol, df in df_dict.items():
        if df.empty or len(df) < 60:
            continue
        df = df.sort_values('trade_date')
        close = df['close'].values
    
        # 20日动量
        momentum = (close[-1] / close[-21] - 1) if len(close) >= 21 else 0
        # 20日波动率(取负值)
        returns = np.diff(close) / close[:-1]
        volatility = -np.std(returns[-20:]) if len(returns) >= 20 else 0
        # 60日均线偏离度
        ma_60 = np.mean(close[-60:])
        price_ratio = close[-1] / ma_60 - 1
    
        # 综合得分(低PE+高ROE用模拟值,实际可接入财务接口)
        score = 0.30 * 0.18 + 0.25 * momentum + 0.15 * volatility + 0.10 * price_ratio
    
        results.append({
            'symbol': symbol,
            'name': df['name'].iloc[0] if 'name' in df.columns else symbol,
            'close': close[-1],
            'momentum': momentum,
            'volatility': -volatility,
            'price_ratio': price_ratio,
            'score': score
        })
    return pd.DataFrame(results)

# ---------- 5. 执行选股 ----------
factor_df = multi_factor_scoring(dfs)
factor_df = factor_df.sort_values('score', ascending=False).reset_index(drop=True)

print("\n📊 多因子选股排名(Top 5):")
print(factor_df[['symbol', 'name', 'close', 'momentum', 'score']].head(5).to_string(index=False, float_format='%.4f'))

# ---------- 6. DeepSeek AI智能诊股 ----------
def ai_stock_diagnosis(symbol, name, df, deepseek_client):
    """
    将股票K线数据送入DeepSeek进行智能诊断
    参考:用DeepSeek诊断MACD底背离[reference:38]
    """
    # 准备最近20天的数据摘要
    df_sorted = df.sort_values('trade_date')
    recent = df_sorted.tail(20)
  
    price_trend = recent['close'].tolist()
    high = recent['high'].max()
    low = recent['low'].min()
    avg_volume = recent['volume'].mean()
  
    # 计算简单技术指标
    ma5 = recent['close'].rolling(5).mean().iloc[-1]
    ma20 = recent['close'].rolling(20).mean().iloc[-1]
  
    prompt = f"""
你是一位资深A股量化交易分析师。请对以下股票进行专业诊断:

【股票信息】
- 代码:{symbol}
- 名称:{name}
- 当前价格:{recent['close'].iloc[-1]:.2f}
- 近20日最高价:{high:.2f},最低价:{low:.2f}
- 近20日均成交量:{avg_volume:.0f}
- MA5:{ma5:.2f},MA20:{ma20:.2f}
- 价格相对MA20位置:{"站上均线" if recent['close'].iloc[-1] > ma20 else "跌破均线"}

请从以下维度给出诊断结论(200字以内):
1. 短期趋势判断
2. 技术面信号(结合量价关系)
3. 操作建议(买入/观望/回避)
4. 风险提示
"""
  
    try:
        response = deepseek_client.chat.completions.create(
            model="deepseek-chat",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.7,
            max_tokens=500
        )
        return response.choices[0].message.content
    except Exception as e:
        return f"AI诊断失败:{e}"

# ---------- 7. 对Top3进行AI诊股 ----------
print("\n" + "="*60)
print("🤖 DeepSeek AI 智能诊股报告(Top 3)")
print("="*60)

top3 = factor_df.head(3)
for idx, row in top3.iterrows():
    symbol = row['symbol']
    name = row['name']
    df = dfs.get(symbol)
  
    if df is not None and not df.empty:
        print(f"\n{'─'*50}")
        print(f"📈 【{idx+1}】{name}({symbol})")
        print(f"{'─'*50}")
    
        diagnosis = ai_stock_diagnosis(symbol, name, df, deepseek_client)
        print(diagnosis)
        print()

print("\n" + "="*60)
print("✅ 选股+AI诊股全流程完成!")
print("📌 提示:以上分析仅供参考,不构成投资建议")
print("="*60)

四、交易员避坑指南

坑1:AI诊股的数据质量决定诊断质量
“垃圾进,垃圾出”——如果喂给DeepSeek的是不复权的杂乱数据,AI给出的诊断毫无价值。解决方案:务必使用QuantDash的adjust='forward'获取服务端前复权数据,确保价格序列连续、准确。

坑2:因子计算时注意数据对齐
不同股票的交易日期可能不完全一致(停牌、节假日等),直接合并计算会导致错位。解决方案:用Pandas的reindexmerge时指定how='inner',只取共同交易日的数据。

坑3:别把API Key硬编码在代码里
把API Key写在代码里提交到GitHub,分分钟被爬虫扫到盗刷。解决方案:用环境变量os.getenv('QUANTDASH_API_KEY')读取,或使用.env文件管理。

五、常见问题解答

Q1:DeepSeek API怎么接入?需要付费吗?

A:DeepSeek官网注册即可获取API Key,有免费额度可用。本文使用OpenAI兼容接口(base_url="//api.deepseek.com"),调用方式和OpenAI完全一致。

Q2:QuantDash支持港股和美股吗?

A:支持!统一代码后缀格式:A股用.SH/.SZ,港股用.HK,美股用.US。一套代码跑遍三大市场。

Q3:选股池能动态获取全市场股票吗?

A:可以!qd.quotes.get(universes=["CN_Stock"])可获取全市场A股实时行情列表,再配合批量K线接口实现全市场扫描。

🔗 相关资源与延伸阅读

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

评论