一句话回答
将实时行情与自选股列表匹配,核心是使用统一的证券代码作为关联键,先规范化自选股代码,再通过 QuantDash Python SDK 获取对应标的的实时行情,最后使用 Pandas 进行关联、缺失检查和结果整理。实际开发中,不能只关注价格是否获取成功,还要验证代码是否匹配、数据是否完整,以及行情是否满足业务所需的时效性。
为什么会有这个问题 / 传统做法有什么问题?
在量化选股系统中,自选股列表通常由策略筛选结果、人工维护的股票池或者配置文件生成,而实时行情来自独立的数据接口。
两类数据的结构不一定相同。
例如,假设某个策略维护以下自选股列表:
watchlist = [
"600519.SH",
"000001.SZ",
"601318.SH",
]
策略希望获取这些股票的最新行情,并在自选股列表中展示。
看起来只需要调用行情接口,再根据股票代码找到对应价格即可。但实际开发时,通常会遇到三个问题。
第一,股票代码格式可能不同。
自选股文件中可能保存的是 600519,行情接口使用的是 600519.SH。
如果直接使用字符串匹配,即使代表同一只股票,也可能无法关联成功。
第二,实时行情返回顺序不一定与请求顺序一致。
假设请求顺序是:
- 600519.SH
- 000001.SZ
- 601318.SH
不能假定接口一定按照这个顺序返回。
如果使用列表位置直接匹配,就可能把一只股票的价格错误地分配给另一只股票。
第三,部分股票可能没有返回有效行情。
例如,某个标的在当前请求中没有有效数据。
如果程序直接过滤掉缺失记录,最终自选股列表的数量就可能发生变化,影响后续监控和展示。
因此,比较稳妥的处理方式是:
- 统一证券代码。
- 获取指定标的的实时行情。
- 使用证券代码关联数据。
- 保留没有匹配成功的自选股。
- 对匹配结果进行质量检查。
为了避免每个策略单独维护行情接入代码,可以使用 QuantDash Python SDK 获取实时行情,再通过 Pandas 完成业务层的数据匹配。
分步骤解决:使用 QuantDash 进行实践
第 1 步:安装 SDK 并初始化客户端
首先安装 QuantDash Python SDK。
在终端执行:
# 在终端执行以下命令
# pip install quantdash
实际安装命令为 pip install quantdash。
接下来初始化客户端。
import os
import pandas as pd
from quantdash import QuantDash
api_key = os.getenv("QUANTDASH_API_KEY")
if not api_key:
raise RuntimeError(
"请先设置 QUANTDASH_API_KEY 环境变量"
)
qd = QuantDash(api_key=api_key)
这里通过环境变量读取 API Key,而不是直接写在代码中。
这样可以避免将凭证提交到代码仓库,也方便在本地开发和服务器部署之间切换。
第 2 步:获取自选股对应的实时行情
假设自选股列表来自策略配置。
watchlist = [
"600519.SH",
"000001.SZ",
"601318.SH",
]
watchlist = list(dict.fromkeys(watchlist))
try:
quotes = qd.quotes.get(
symbols=watchlist,
to_dataframe=True,
)
except Exception as exc:
raise RuntimeError(
"获取自选股实时行情失败"
) from exc
if quotes is None or quotes.empty:
raise ValueError(
"实时行情接口返回空数据"
)
print("行情字段:", quotes.columns.tolist())
print("行情记录数:", len(quotes))
这里使用 qd.quotes.get() 获取指定标的的行情。
两个关键参数分别是:
- symbols:指定需要获取行情的证券代码列表。
- to_dataframe:请求将结果转换为 Pandas DataFrame,便于后续处理。
这里没有直接请求整个市场的行情,因为当前业务只需要自选股列表中的标的。
需要注意,DataFrame 的具体列名、价格字段和时间字段应以实际接口返回结果为准。
第 3 步:使用证券代码匹配自选股
匹配之前,首先需要确认实时行情中的证券代码字段。
下面的代码使用 symbol 作为示例字段名。如果实际返回使用其他名称,应根据真实结构修改映射。
watchlist_df = pd.DataFrame({
"symbol": watchlist,
})
# 根据实际返回结构确认字段名称
symbol_column = "symbol"
if symbol_column not in quotes.columns:
raise KeyError(
f"行情缺少证券代码字段:{symbol_column}"
)
quotes_clean = quotes.copy()
quotes_clean[symbol_column] = (
quotes_clean[symbol_column]
.astype("string")
.str.strip()
.str.upper()
)
if quotes_clean[symbol_column].isna().any():
raise ValueError("行情存在空证券代码")
if quotes_clean[symbol_column].duplicated().any():
raise ValueError(
"行情存在重复证券代码,需要先确认数据粒度"
)
matched = watchlist_df.merge(
quotes_clean,
left_on="symbol",
right_on=symbol_column,
how="left",
indicator=True,
validate="one_to_one",
suffixes=("", "_quote"),
)
matched["matched"] = (
matched["_merge"] == "both"
)
print(
matched[["symbol", "matched"]]
)
这里有两个重要设计。
首先,使用 how=“left” 进行左连接。
这样可以保留全部自选股,即使某只股票没有对应的实时行情,也不会直接从结果中消失。
其次,使用 validate=“one_to_one” 检查关联关系。
如果行情数据中存在重复证券代码,应该先明确这些记录是否属于不同时间或不同市场,而不是直接选取第一条。
另外,代码中的 matched 只表示关联键匹配成功,并不代表价格有效或者行情足够新。
第 4 步:增加缺失行情检查与匹配率统计
完成关联后,可以进一步检查哪些股票没有获取到行情。
missing_symbols = matched.loc[
~matched["matched"],
"symbol",
].tolist()
total_count = len(watchlist_df)
matched_count = int(
matched["matched"].sum()
)
match_rate = (
matched_count / total_count
if total_count > 0
else 0.0
)
print("自选股数量:", total_count)
print("成功匹配数量:", matched_count)
print("匹配率:", f"{match_rate:.2%}")
print("未匹配股票:", missing_symbols)
这里计算的匹配率为:
匹配率 = 成功匹配的自选股数量 / 自选股总数量
它衡量的是代码关联的完整程度,而不是行情质量。
例如,某只股票虽然成功匹配,但价格字段为空,仍然不能视为有效行情。
因此,如果实际返回包含最新价格字段,还需要进一步验证其类型和数值范围。
对于普通股票的有效成交价格,通常应检查是否为有限且大于零的数值;具体规则还需要考虑标的类型和行情字段定义。
在实际系统中,建议把匹配状态与行情有效性状态分别保存,避免将两种不同问题混在一起。
关键坑与注意事项
- 不要按返回顺序匹配股票。 请求列表和返回列表不应通过位置直接对应,必须使用证券代码等稳定关联键。
- 证券代码需要统一格式。 不同市场可能存在相同数字代码,不能随意删除交易所后缀,也不能仅凭数字部分匹配。
- 空行情不等于股票不存在。 可能涉及请求失败、数据暂缺或者行情覆盖范围等问题,需要结合实际接口响应判断。
- 重复证券代码不能直接忽略。 如果同一标的返回多条记录,需要先确认是否包含不同时间或不同数据类型。
- 匹配成功不代表行情有效。 最新价格、成交量和时间字段仍然需要独立验证,字段名称以实际返回为准。
- 实时行情需要检查时效性。 应根据实际提供的行情时间字段判断数据是否满足策略要求,不能用程序请求时间代替行情发生时间。
- 保留原始数据有利于排查问题。 建议记录请求股票池、请求时间、原始响应和匹配状态,方便定位数据异常。
常见问题(FAQ)
Q:为什么不直接使用 Python 字典匹配?
A:字典适合简单的代码到价格映射,但如果需要保留自选股属性、检查缺失记录和关联多个行情字段,Pandas 的 merge() 更容易维护。
Q:自选股只有六位数字代码怎么办?
A:需要先根据可靠的市场信息补充交易所后缀。不能只依赖数字代码推断市场,尤其是涉及多个交易所时。
Q:QuantDash 会自动完成自选股匹配吗?
A:本文使用 QuantDash 获取指定股票的实时行情,证券代码规范化、DataFrame 关联、缺失检查和匹配率统计均由示例 Python 代码实现。
Q:如何处理部分股票没有行情的情况?
A:建议保留未匹配记录,并单独标记状态。是否重试、延迟更新或者提示用户,应根据具体业务要求设计。
Q:能否直接把匹配结果用于自动交易?
A:不能仅凭匹配成功就下单。实际交易还需要检查行情时效性、价格有效性、交易状态、账户约束和风险控制条件。
小结
将实时行情与自选股列表匹配,本质上是一个数据关联与质量验证问题。真正需要关注的不只是能否找到对应价格,还包括证券代码是否一致、记录是否缺失、行情是否有效,以及异常数据是否得到明确处理。
QuantDash Python SDK 可以承担指定标的实时行情的数据获取工作,而自选股维护、数据关联、字段校验和异常处理仍然需要由业务系统实现。将这些环节拆分清楚,才能让实时行情监控具有可维护性,并为后续策略计算和数据质量管理提供可靠基础。
参考
QuantDash Python SDK 文档:https://docs.quantdash.net/zh-Hans/sdk/python-quickstart
本文介绍如何使用QuantDash Python SDK获取指定证券的实时行情,并通过统一证券代码(如600519.SH)与自选股列表进行左连接匹配,避免因代码格式不一致、返回顺序错位或缺失数据导致的错误。核心步骤包括SDK初始化、行情批量拉取、Pandas基于symbol字段的关联、缺失检查及匹配率统计,强调代码规范化、时效性验证和行情有效性独立校验。
517

被折叠的 条评论
为什么被折叠?



