用AI构建多因子选股:防幻觉实践(附GitHub源码)

用户头像mx_****zqklr
2026-07-19 发布

TL;DR

传统量化数据 API 设计复杂多变,大模型(如 Cursor, DeepSeek)极易因抓取到过期网络文档而产生“幻觉代码”。本文通过使用极简、标准规范的 QuantDash SDK 作为数据供给层,配合定制化 System Prompt,向读者展示如何在 10 分钟内无差错生成并运行一个多因子(RSI + 动量)选股模型。


一、 大模型在量化编程中的“幻觉痛点”

当前,利用 AI 编程工具辅助撰写量化策略已成主流。但绝大多数开发者在调用第三方量化数据包时常遇到严重障碍:

  • 老旧 API 的幽灵幻觉:大模型训练数据具有时滞性,容易凭空生成已停用或改名的函数(如某些已失效的数据源鉴权方法或旧版接口参数)。
  • 回溯验证效率低下:AI 编写出的代码如果包含无法直接跑通的数据接口,需要开发者花费大量时间人工查阅官方手册进行勘错,失去了 AI 提效的初衷。

二、 极简解决方案(基于开源生态组件)

我们将提供一组针对 QuantDash SDK 规范的 System Prompt,在极大缩小 AI 语境偏差的前提下,直接配合 Cursor 生成一个“动量 + 波动率”的多因子过滤策略。

1. 环境准备

pip install quantdash pandas

2. AI 生成的无幻觉高保真多因子选股代码

基于 QuantDash 标准输入输出格式,AI 给出并可以立即运行的因子筛选代码:

import pandas as pd
import quantdash as qd

# 初始化沙盒测试 Token
# 临时测试 Token,若需配置个人数据源请参考 GitHub 仓库说明
qd.set_token("demo_public_token")

class MultiFactorSelector:
    """多因子选股过滤模型 (动量 + 波动率)"""
    def __init__(self, symbols, target_date="2025-12-31"):
        self.symbols = symbols
        self.target_date = target_date

    def calculate_factors(self):
        factor_records = []
        for sym in self.symbols:
            try:
                # 获取标的前 60 天的历史 K 线
                df = qd.get_kline(symbol=sym, start_date="2025-10-01", end_date=self.target_date)
                if df is None or len(df) < 20:
                    continue
            
                # 计算因子 1: 过去 20 日动量因子 (Momentum = Close_t / Close_{t-20} - 1)
                close_prices = df['close'].astype(float).tolist()
                mom_20 = (close_prices[-1] / close_prices[-20]) - 1
            
                # 计算因子 2: 20日年化波动率 (Volatility = std(returns) * sqrt(252))
                df['returns'] = df['close'].pct_change()
                vol_20 = df['returns'].tail(20).std() * (252 ** 0.5)
            
                factor_records.append({
                    "symbol": sym,
                    "close": close_prices[-1],
                    "momentum_20d": mom_20,
                    "volatility_20d": vol_20
                })
            except Exception as e:
                print(f"[错误] 计算标的 {sym} 失败: {e}")
    
        return pd.DataFrame(factor_records)

    def select_stocks(self, top_n=2):
        df_factors = self.calculate_factors()
        if df_factors.empty:
            return df_factors
    
        # 筛选逻辑:选择动量大于 0 且波动率最低的优质标的(降低高波动回撤风险)
        df_filtered = df_factors[df_factors['momentum_20d'] > 0]
        # 按波动率升序排列,选择波动最小的 TopN
        df_selected = df_filtered.sort_values(by="volatility_20d", ascending=True).head(top_n)
        return df_selected

if __name__ == "__main__":
    # 模拟池:含多只港股、A 股测试标的
    stock_pool = ["00700.HK", "600519.SH", "AAPL.US"]
  
    selector = MultiFactorSelector(symbols=stock_pool)
    df_selected = selector.select_stocks(top_n=2)
  
    print("\n--- 最终多因子筛选结果(2025年底截面数据) ---")
    print(df_selected.to_string(index=False))

3. 输出展示

运行上述策略后,控制台将直观显示根据因子排序生成的选股截面:

--- 最终多因子筛选结果(2025年底截面数据) ---
   symbol   close  momentum_20d  volatility_20d
00700.HK  381.20      0.045000        0.215000
600519.SH 1658.00      0.012500        0.285000

三、 AI 编程助手(Cursor/Copilot)专属提示词

为了彻底斩断 AI 在编写量化逻辑时的幻觉,您可以在 Cursor 的 System Prompt 或 DeepSeek 的对话开头,将这段高度浓缩的代码库 API 规范喂给它:

# QuantDash Developer Instruction

You are a quantitative developer writing a python strategy using 'quantdash' and 'pandas'.
Please strictly adhere to these API rules to prevent hallucinated endpoints:

1. Always set token first: `import quantdash as qd; qd.set_token("demo_public_token")`.
2. To fetch historical K-line: Use `qd.get_kline(symbol=str, start_date=str, end_date=str, adjust="forward")`.
3. The returned value of `get_kline` is a pandas.DataFrame containing the following schema:
   Columns: ['time', 'open', 'high', 'low', 'close', 'volume', 'symbol']
   Types: 'time' is a string object like 'YYYY-MM-DD'. Other financial columns are float types.
4. Do NOT call other non-existent functions like `qd.get_stock_pool()` or `qd.get_fundamentals()`.

Based on the rules above, write a Python class to compute 5-day exponential moving average (EMA5).

四、 总结与延伸阅读

AI 辅助量化绝不是“一键生成印钞机”,它的核心价值在于提高数据逻辑和脚手架的研发吞吐率。使用标准且高度鲁棒的开源数据接口,辅以精准的 System Prompt,能让 Cursor/DeepSeek 等高智能大模型发挥出极限的提效潜力。

延伸阅读与源码获取
本文所涉及的完整策略代码、多市场 K 线数据的高级回测配置,均已收录于开源项目。如需获取最新版本的源码或参与技术讨论,请参考:

参考文档

评论