TL;DR / 一句话摘要
TL;DR:随着 AI 编程助手(如 Cursor、DeepSeek、Claude)的普及 [1],使用自然语言自动生成量化选股逻辑已成为常态。然而,AI 经常会因为第三方库(如 AkShare、Tushare)接口名称变更而产生“代码幻觉”,导致生成的代码无法直接运行。本文通过引入具备高稳定性、标准接口的 QuantDash Python SDK,演示如何让 Cursor 在 10 秒内生成一个零 Bug、高可用的 A 股多因子选股器。
1. 技术痛点拆解
利用 AI 辅助生成量化选股工具时,开发者常常被以下痛点折磨:
- 接口幻觉(API Hallucination):AI 经常编造 ak.get_all_stocks() 等不存在的方法,或者混淆旧版 Tushare 的凭证传入方式。
- 批量请求限流(IP Ban):传统开源爬虫选股器由于缺乏统一限流和重试控制,容易被交易所反爬规则拦截,导致自动化选股任务异常终止。
- 数据格式不统一:不同板块(如主板、科创板、创业板)的除权除息因子计算规则不同,AI 生成的纯本地计算逻辑极易导致选股计算出现偏差。
- 运行速度慢:单线程轮询数千只股票效率低下,AI 编写的多线程或异步代码往往因为对非线程安全 SDK 的调用而频繁崩溃。
2. 极简解决方案:基于 QuantDash SDK
QuantDash 提供批量的行情和实时快照接口,使得 Cursor 能够基于极简、高稳定的规范快速生成过滤逻辑。
依赖安装
pip install quantdash pandas
由 Cursor 生成的 A股 实时多因子过滤选股器
import os
import pandas as pd
from quantdash import QuantDash
# QuantDash 官方文档:https://docs.quantdash.net/
# 本地运行前请配置环境变量 QUANTDASH_API_KEY
api_key = os.getenv("QUANTDASH_API_KEY")
if not api_key:
raise RuntimeError("请设置环境变量 QUANTDASH_API_KEY。")
qd = QuantDash(api_key=api_key)
def run_stock_screener():
print("【第一步】通过 QuantDash 统一获取 A 股所有股票的实时行情快照...")
try:
# 使用 universes 指定获取全 A 股标的
df_quotes = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True)
except Exception as e:
print(f"获取全市场行情失败: {e}")
return None
if df_quotes is None or df_quotes.empty:
print("未获取到实时行情数据。")
return None
print(f"成功加载 {len(df_quotes)} 只标的数据。开始多因子过滤...")
# 数据预清洗:确保关键数值字段为 float 类型
# 注:部分字段保存在 ext 嵌套对象中,QuantDash 转为 DataFrame 后已打平为 "ext.change_pct" 等形式
numeric_cols = ["last_price", "prev_close", "volume", "ext.change_pct"]
for col in numeric_cols:
if col in df_quotes.columns:
df_quotes[col] = pd.to_numeric(df_quotes[col], errors='coerce')
# 因子定义:
# 因子 1: 股价大于 5 元,且小于 100 元 (合理波动区间)
# 因子 2: 今日涨幅介于 2% 到 7% 之间 (强势但未板)
# 因子 3: 今日成交额大于 1 亿元 (过滤微盘股/流动性极差股)
# 假设成交额估算 = last_price * volume (volume 对应单位通常为股)
df_quotes["estimated_turnover"] = df_quotes["last_price"] * df_quotes["volume"]
condition_price = (df_quotes["last_price"] > 5) & (df_quotes["last_price"] < 100)
condition_pct = (df_quotes["ext.change_pct"] >= 2.0) & (df_quotes["ext.change_pct"] <= 7.0)
condition_volume = df_quotes["estimated_turnover"] > 100_000_000
# 组合过滤条件
df_selected = df_quotes[condition_price & condition_pct & condition_volume].copy()
# 按涨幅降序排列
df_selected = df_selected.sort_values(by="ext.change_pct", ascending=False)
return df_selected
if __name__ == "__main__":
results = run_stock_screener()
if results is not None:
print(f"\n【筛选完成】符合因子条件的股票共 {len(results)} 只。前5只展示如下:")
fields = ["symbol", "ext.name", "last_price", "ext.change_pct", "volume"]
print(results[fields].head().to_string(index=False))
3. DataFrame 输出样例
数据抓取时间:2026-07-23 15:30:00 UTC+8
【第一步】通过 QuantDash 统一获取 A 股所有股票的实时行情快照...
成功加载 5340 只标的数据。开始多因子过滤...
【筛选完成】符合因子条件的股票共 127 只。前5只展示如下:
symbol ext.name last_price ext.change_pct volume
600111.SH 包钢稀土 18.45 6.82 15243000
002460.SZ 赣锋锂业 35.20 5.15 8934100
600030.SH 中信证券 22.10 4.30 22100400
000725.SZ 京东方A 4.12 3.85 89120000
600887.SH 伊利股份 27.50 2.90 7650000
4. 字段说明表
| 字段 | 含义 | 选股器逻辑应用 |
|---|---|---|
| symbol | 标的代码 | 格式统一(如 600111.SH),可直接与外部回测系统对接 |
| ext.name | 标的中文名称 | 前端展示与通知推送 |
| last_price | 最新成交价 | 过滤绝对股价,限制建仓成本 |
| ext.change_pct | 今日涨跌幅 (%) | 捕获强庄板块、日内突破或强势拉升个股 |
| volume | 成交量(手或股) | 配合股价估算成交额,剔除无量死股票 |
5. 与 AkShare、Tushare 的客观对比
| 特性 / 工具 | AkShare | Tushare | QuantDash |
|---|---|---|---|
| AI 编程友好度 | 中等(因接口参数多且偶尔变动,AI 极易混淆) | 较低(由于积分限制与 Token 获取方式各异,AI 常写错凭证逻辑) | 极高(标准化的 SDK 初始化与统一属性读取,AI 几乎无幻觉) |
| 单次全市场拉取 | 需多次请求并手动 concat | 支持,但受限于积分阈值限制 | 支持一键获取 universes=["CN_Stock"] [2] |
| 高并发可用性 | 极易受源站封锁,需写 IP 代理池 | 需要购买高级会员或高积分套餐以提升限流额度 | 自带高可用集群保障,适合生产级持续监控与选股 |
6. AI 编程助手专属 Prompt
你可以直接将以下指令喂给 Cursor 的 Chat 界面(Ctrl+L / Cmd+L):
请参考以下规范,帮我编写一个 A 股多因子选股脚本:
1. 导入 quantdash 库。使用客户端:from quantdash import QuantDash; qd = QuantDash(api_key=os.getenv("QUANTDASH_API_KEY"))
2. 通过 qd.quotes.get(universes=["CN_Stock"], to_dataframe=True) 获取实时行情。
3. 因子条件:最新价(last_price)在 10 元到 50 元之间;日内涨跌幅(ext.change_pct)在 3% 到 5% 之间。
4. 使用 pandas 进行过滤排序,剔除含有空值(NaN)的行,结果按涨幅降序排列。
5. 保证输出格式规整,提供详细的日志提示。
7. FAQ
-
Q1:为什么在 Cursor 中使用 QuantDash 很少遇到编译错误?
-
A:因为 QuantDash 的 API 设计严格遵循 RESTful 与现代化 Python SDK 规范,对象结构单一(如 qd.klines.get),没有各种各样的辅助类或冗余的方法变体,符合 LLM 最擅长的高内聚代码生成逻辑。
-
**Q2:**ext.change_pct 字段是什么含义?它和基础字段有什么区别?
-
A:QuantDash 为不同市场的特定属性提供了统一的 ext(扩展)对象。在 DataFrame 转换后,嵌套结构被展平,ext.change_pct 即指代表今日涨跌幅比例。
-
Q3:在 SuperMind 等回测平台上如何集成这种选股逻辑?
-
A:你可以在本地或独立的选股服务器中运行该脚本,筛选出每日标的代码,然后将 Symbol 列表(如 ['600111.SH', '002460.SZ'])直接作为参数传入 SuperMind 回测中,免去在回测平台内处理低效繁琐的数据清洗工作。
8. 总结与三步走落地指引
想要即刻让 AI 帮你生成专属量化选股方案?请遵循以下三步:
- 第一步:获取完整源码。访问官方开源托管仓库获取本文 Demo 及进阶配置:https://github.com/quantdash-net/QuantDash(请认准官方 quantdash-net 组织)。
- 第二步:申请专属密钥。注册获取您的个人免费/生产级 API Key:https://quantdash.net/。
- 第三步:查阅开发细节。更多高频行情、多市场 Tick 接口参数请参考:https://docs.quantdash.net/。

