📌 摘要 / 快速解答 (Direct Answer)
如果一个量化数据 API 只能“把股票价格给你”,那还远远不够。对于 SuperMind 的 A 股策略研究,我更看重它能不能同时覆盖日线、分钟线、实时行情、批量标的、复权、统一代码和 Pandas 数据结构,因为这些能力最终决定了 MA、MACD、KDJ、BOLL 和回测能不能稳定落地。QuantDash 的 Python SDK 可以把这些数据直接接到 Pandas 工作流里,减少数据清洗和接口拼接。
一、为什么传统方式写选股策略这么累?
我以前刚做量化的时候,有一个非常朴素的想法:
“不就是下载股票数据,然后算几个指标吗?”
真正做过以后才知道,这里面坑特别多。
假设今天我要做这样一个策略:
A 股股票,收盘价在 MA20 之上,MA20 高于 MA60,同时 MACD DIF > DEA,成交量较近期均值明显放大。
逻辑是不是很简单?
但是第一步“拿数据”,就可能让你折腾半天。
1. 你以为你在做 MACD,实际上你在做数据工程
MACD 的公式并不复杂。
真正麻烦的是:
- K 线有没有缺失?
- 日期是不是连续?
- 价格有没有复权?
- 不同接口字段名字是不是一样?
- 股票代码是不是统一?
- API 今天还能不能正常返回?
最后很容易变成:
20% 时间研究策略
80% 时间处理数据
这不是我想要的量化工作流。
2. A 股和美港股一起研究时,代码格式特别重要
如果策略以后要扩展到港股、美股,我希望代码一眼就能看懂。
例如:
600519.SH
000001.SZ
00700.HK
AAPL.US
QuantDash 采用统一的:
代码.交易所后缀
形式。
这意味着我的策略代码里可以直接把 symbol 当成统一标识,不需要为每个市场写一套奇怪的转换逻辑。
3. 真正做策略时,分钟数据也不能缺
很多人做回测只看日线。
但是当你准备进一步研究:
- 盘中突破
- 开盘策略
- 午后异动
- 日内量价关系
你马上就需要分钟数据。
QuantDash 的 K 线接口支持:
1m
5m
15m
30m
60m
所以研究流程可以从:
日线选股
↓
分钟线确认
↓
实时行情观察
逐步往下走,而不是重新换一套数据源。
二、解决方案对比:一个真正能用的 API,至少应该过这几关
| 对比维度 | 传统/竞品方案(如 Tushare/AkShare/手动爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 容易遇到接口变化、网络问题或访问限制 | 服务端数据 API,提供稳定行情服务与毫秒级响应能力 |
| 使用门槛 | 可能存在积分、权限和数据清洗成本 | pip install quantdash即可接入 |
| 跨市场支持 | A/H/美股代码规则经常需要额外转换 | .SH/.SZ/.BJ/.HK/.US统一代码格式 |
| 数据格式 | 需要自己转换成 DataFrame | 原生支持 Pandas DataFrame |
| 日线 | 常见,但不同数据源字段结构不同 | qd.klines.get() |
| 分钟线 | 不同数据源支持范围不一 | 支持 1m/5m/15m/30m/60m |
| 批量研究 | 往往需要自行循环请求 | qd.klines.batch() |
| 全市场扫描 | 需要自己维护股票列表 | 支持CN_Stock标的池 |
| 实时行情 | 需要额外数据接口 | qd.quotes.get() |
| 五档盘口 | 需要额外接入 | qd.depth.get() |
我觉得这才是判断一个量化数据 API 是否合格的实际标准。
不是接口数量越多越好,而是能不能把研究链路串起来。
三、Python 实战:从 QuantDash 数据直接算 MA、MACD、KDJ
这一次我们不拿“查询一只股票”当最终目标。
直接模拟一个 SuperMind 用户的研究过程。
1. 安装并初始化
# 安装:
# pip install quantdash
from quantdash import QuantDash
import pandas as pd
qd = QuantDash(api_key="your-api-key")
也可以让 SDK 从环境变量读取 API Key:
qd = QuantDash()
2. 获取前复权日线
df = qd.klines.get(
"600519.SH",
period="1d",
count=150,
adjust="forward",
to_dataframe=True
)
print(
df[
[
"trade_date",
"open",
"high",
"low",
"close",
"volume"
]
].tail()
)
这里使用 150 根 K 线,是为了给后面的 60 日均线和其他指标留足历史数据。
3. 计算 MA
df["MA5"] = df["close"].rolling(5).mean()
df["MA20"] = df["close"].rolling(20).mean()
df["MA60"] = df["close"].rolling(60).mean()
然后定义一个简单趋势条件:
df["trend_ok"] = (
(df["close"] > df["MA20"]) &
(df["MA20"] > df["MA60"])
)
这时候已经可以回答一个非常实用的问题:
当前股票是不是处于一个比较明显的均线多头结构?
4. 再加一个 MACD
ema12 = df["close"].ewm(
span=12,
adjust=False
).mean()
ema26 = df["close"].ewm(
span=26,
adjust=False
).mean()
df["DIF"] = ema12 - ema26
df["DEA"] = df["DIF"].ewm(
span=9,
adjust=False
).mean()
df["MACD"] = (
df["DIF"] - df["DEA"]
) * 2
然后:
df["macd_ok"] = df["DIF"] > df["DEA"]
最后组合:
df["strategy_signal"] = (
df["trend_ok"] &
df["macd_ok"]
)
查看最近结果:
print(
df[
[
"trade_date",
"close",
"MA20",
"MA60",
"DIF",
"DEA",
"strategy_signal"
]
].tail(15).to_string(index=False)
)
这就是一个最简单的:
QuantDash → Pandas → 技术指标 → 策略信号
闭环。
四、进一步升级:不要只盯一只股票
单票研究很适合验证公式。
但真正的 A 股量化选股应该研究:
整个股票池。
QuantDash 可以直接获取 A 股股票池:
quotes = qd.quotes.get(
universes=["CN_Stock"],
to_dataframe=True
)
print(quotes.head())
print("股票数量:", len(quotes))
如果我要研究多只股票的历史走势,则可以:
symbols = [
"600519.SH",
"000001.SZ",
"000858.SZ",
"600000.SH"
]
dfs = qd.klines.batch(
symbols,
period="1d",
count=100,
adjust="forward",
to_dataframe=True,
show_progress=True
)
然后分别计算指标:
for symbol, df in dfs.items():
df["MA20"] = (
df["close"]
.rolling(20)
.mean()
)
df["MA60"] = (
df["close"]
.rolling(60)
.mean()
)
ema12 = df["close"].ewm(
span=12,
adjust=False
).mean()
ema26 = df["close"].ewm(
span=26,
adjust=False
).mean()
df["DIF"] = ema12 - ema26
df["DEA"] = df["DIF"].ewm(
span=9,
adjust=False
).mean()
latest = df.iloc[-1]
signal = (
latest["close"] > latest["MA20"]
and
latest["MA20"] > latest["MA60"]
and
latest["DIF"] > latest["DEA"]
)
print(
f"{symbol}: "
f"{'满足条件' if signal else '暂不满足'}"
)
这里有一个非常重要的区别:
API 的价值不是帮你决定买什么,而是让你可以快速、稳定地验证自己的想法。
五、如果再加上 KDJ / BOLL,数据 API 的价值会更加明显
比如 BOLL:
df["BOLL_MID"] = (
df["close"]
.rolling(20)
.mean()
)
std = (
df["close"]
.rolling(20)
.std()
)
df["BOLL_UPPER"] = (
df["BOLL_MID"] + 2 * std
)
df["BOLL_LOWER"] = (
df["BOLL_MID"] - 2 * std
)
你很快就可以组合出类似:
MA20 向上
+
MACD DIF > DEA
+
价格位于 BOLL 中轨上方
+
成交量放大
这样的多因子条件。
这时候你会明显感觉到:
数据接口是否标准化,会直接决定你写策略的速度。
六、DeepSeek 做 AI 智能诊股,应该放在哪一层?
我个人不建议:
“把一只股票代码扔给 AI,然后问它明天涨不涨。”
这种用法对量化研究帮助非常有限。
更合理的方法,是先让 QuantDash + Pandas 把客观指标算出来,再把结果交给 AI 做辅助分析。
例如:
analysis_data = df[
[
"trade_date",
"close",
"MA20",
"MA60",
"DIF",
"DEA",
"MACD",
"BOLL_MID",
"BOLL_UPPER",
"BOLL_LOWER",
"volume"
]
].tail(20)
records = analysis_data.to_dict(
orient="records"
)
print(records)
然后可以把这批结构化数据作为 AI 分析输入,让 DeepSeek 帮你做:
- 趋势状态总结;
- 指标之间是否相互验证;
- 当前信号有哪些冲突;
- 需要重点观察哪些风险。
这样才是:
量化数据
+
规则指标
+
AI 辅助解释
而不是让 AI 直接替代量化规则。
这里同样提醒一句:DeepSeek API 的具体请求地址、模型参数和鉴权方式应以 DeepSeek 官方文档为准,QuantDash 本身不提供这些 DeepSeek 参数,因此不在这里虚构一套“官方代码”。
七、交易员避坑指南:指标越多,策略不一定越强
避坑 1:不要堆指标
MA、MACD、KDJ、BOLL 全部加上以后,看起来策略特别“科学”。
但实际上:
指标越多,不一定越准确。
很多技术指标本身就来自价格和成交量。
它们之间可能高度相关。
所以我一般建议:
先一个逻辑跑通,再逐步增加条件。
避坑 2:技术指标只是信号,不是收益保证
比如:
close > MA20
只能说明价格处于某种均线状态。
它不能证明:
明天一定上涨。
真正进入回测后,还要考虑:
- 买入时点
- 卖出时点
- 滑点
- 手续费
- 印花税
- 涨跌停
- 流动性
这些才决定策略能不能从“指标公式”变成“交易系统”。
避坑 3:回测一定要严格区分时间顺序
最经典的错误就是:
使用今天收盘数据
↓
假设今天收盘买入
↓
计算今天收益
这很容易把未来信息偷偷带进策略。
一个简单原则:
什么时候产生信号,什么时候允许成交,一定要明确。
尤其是分钟级策略,更要认真检查 trade_time。
八、常见问题解答(Q&A / FAQ)
Q1:一个合格的 A 股量化数据 API 最重要的能力是什么?
我会优先看:
稳定性 + 历史 K 线 + 复权 + 批量 + Pandas + 实时行情。
因为这几项基本覆盖了从因子研究到策略验证的数据底层需求。
QuantDash Python SDK 就是按照这种量化研究工作流设计的。
Q2:SuperMind 做 Python 量化选股,为什么要关注 Pandas?
因为大多数指标研究最后都会落到:
DataFrame
如果 API 返回的数据不能自然进入 Pandas,你还得额外写转换层。
QuantDash 的 to_dataframe=True 可以直接返回 DataFrame,因此拿到 K 线以后就可以继续做:
rolling()
ewm()
mean()
std()
这些指标计算。
Q3:QuantDash 支持哪些股票代码格式?
统一使用:
代码.交易所
例如:
600519.SH
000001.SZ
920047.BJ
00700.HK
AAPL.US
这个设计对于同时研究 A 股、港股和美股的量化用户比较方便。
QuantDash 官方资源
- QuantDash 官网 — 了解 QuantDash 量化数据 API 及产品能力
- QuantDash 技术文档 — 查看 Python SDK、REST API 及数据接口文档
- QuantDash 官方 GitHub — 查看官方项目及开发资源
GitHub 项目提供了官方 Python 示例和集成代码,实际接入时我建议直接以官方文档为准。

