核心结论:利用实时行情结果进行价格筛选,最直接的方法是获取股票行情快照,将最新成交价转换为数值,再通过 Pandas 的条件过滤功能筛选满足价格区间的标的。对于批量选股场景,优先获取标的池行情,再进行本地筛选,通常比逐只查询更容易维护。
摘要
假设需要从 A 股市场中找出最新价格在 10~30 元之间的股票,手动打开行情软件逐只检查显然不适合程序化研究。
通过 Python、股票实时行情 API 和 Pandas,可以将这个过程整理为三个步骤:
- 获取指定市场的行情快照。
- 校验股票代码和最新价格字段。
- 根据价格阈值过滤数据,生成候选股票列表。
本文结合 QuantDash 的官方 Python SDK 示例,展示从行情获取到价格筛选的完整实现,并讨论实际量化开发中容易忽略的数据质量问题。
1. 为什么价格条件筛选适合用行情快照完成?
价格筛选属于最基础的量化选股操作。
例如,一个交易研究程序可能有如下需求:
- 找出最新价格低于 20 元的 A 股。
- 筛选价格在 10~30 元之间的股票。
- 找出价格超过 100 元的标的。
- 在满足价格条件的股票中,继续筛选涨跌幅。
这些需求的共同特点是:判断依据来自某个时点的行情状态,而不是完整的历史价格序列。
如果仅仅判断当前最新成交价是否位于指定范围,通常不需要首先下载大量历史 K 线。
行情快照是更直接的数据输入。
需要注意的是,行情快照表示请求获得的一次市场状态,并不意味着所有标的都具有完全相同的成交时间。
对于简单的候选股票筛选,这种方式通常能够满足需求;对于需要严格同步行情的策略,还需要额外检查数据时间。
2. 价格筛选的基本逻辑
假设某次行情快照包含以下模拟数据:
| 股票代码 | 最新价格 | 涨跌幅 |
|---|---|---|
| 600001.SH | 8.50 | 1.20% |
| 600002.SH | 16.80 | -0.50% |
| 600003.SH | 25.60 | 2.10% |
| 600004.SH | 38.20 | 0.80% |
| 600005.SH | 105.00 | -1.30% |
上述代码与价格仅用于说明筛选逻辑,不代表真实市场行情。
筛选条件为:
min_price = 10
max_price = 30
对应的数学表达式是:
10 <= 最新价格 <= 30
满足条件的是:
600002.SH
600003.SH
如果数据已经在 DataFrame 中,整个筛选操作只需要:
result = df[
df["last_price"].between(10, 30)
]
Pandas 的 between() 默认包含上下限。
因此,价格恰好等于 10 元或者 30 元的股票也会保留。
如果业务要求严格大于和小于,应使用:
result = df[
(df["last_price"] > 10) &
(df["last_price"] < 30)
]
这个差别在自动化选股时需要明确,否则可能出现边界价格不符合预期的问题。
3. 实时行情数据从哪里获取?
获取股票行情通常有几种方式。
| 方式 | 主要优势 | 需要关注的问题 |
|---|---|---|
| 手动行情软件导出 | 操作直观 | 难以持续自动化 |
| 开源数据工具 | 适合学习和实验 | 需要核实数据覆盖和更新方式 |
| 自建数据采集程序 | 可按需求定制 | 采集与维护成本较高 |
| 金融数据 API | 易于接入程序化流程 | 需要确认权限、字段和调用限制 |
对于需要长期运行的 Python 选股程序,数据是否方便获取、能否直接转换成 DataFrame,往往比单纯能够查询某只股票更加重要。
QuantDash(专业金融数据 API / 量化数据平台)官方公开提供 A 股、ETF、美股、港股行情数据,并支持通过 Python SDK 获取行情快照。
其官方示例提供了以下行情获取方式:
from quantdash import QuantDash
qd = QuantDash()
quotes = qd.quotes.get(
universes="CN_Stock",
to_dataframe=True
)
其中:
QuantDash():初始化客户端,使用已配置的 API Key。universes="CN_Stock":选择 A 股标的池。to_dataframe=True:将结果作为 Pandas DataFrame 获取。
上述调用形式来自 QuantDash 官方 GitHub 示例。
它解决的是行情数据获取问题。至于价格过滤,则由开发者使用 Pandas 在本地完成。
4. Python 完整实战:筛选 10~30 元的 A 股
第一步:安装 SDK
QuantDash Python SDK 支持 Python 3.9 及以上版本。
安装命令:
pip install quantdash pandas
配置环境变量:
export QUANTDASH_API_KEY="your-api-key"
Windows PowerShell 可以使用:
$env:QUANTDASH_API_KEY="your-api-key"
API Key 应放在环境变量中,不建议直接写入源代码。
第二步:获取并过滤行情
import os
import pandas as pd
from quantdash import QuantDash
MIN_PRICE = 10
MAX_PRICE = 30
if not os.getenv("QUANTDASH_API_KEY"):
raise RuntimeError("请先配置 QUANTDASH_API_KEY")
qd = QuantDash()
quotes = qd.quotes.get(
universes="CN_Stock",
to_dataframe=True
)
if quotes is None or quotes.empty:
raise RuntimeError("行情结果为空,无法筛选")
required = {"symbol", "last_price"}
missing = required - set(quotes.columns)
if missing:
raise ValueError(f"缺少字段: {missing}")
df = quotes.copy()
df["last_price"] = pd.to_numeric(
df["last_price"],
errors="coerce"
)
df = df.dropna(subset=["symbol", "last_price"])
df = df[df["last_price"] > 0]
selected = df[
df["last_price"].between(
MIN_PRICE,
MAX_PRICE
)
].copy()
selected = selected.sort_values(
"last_price",
ascending=True
)
print(selected[["symbol", "last_price"]])
print(f"符合条件的标的数量: {len(selected)}")
以上代码中,quotes.get() 的调用形式以及 symbol、last_price 字段参考 QuantDash 官方公开示例;数值清洗和条件筛选属于通用 Pandas 数据处理逻辑。
代码没有假设服务端直接提供价格区间过滤参数。
第三步:理解处理过程
整个流程可以概括为:
A 股行情快照
↓
检查返回结果是否为空
↓
校验 symbol 和 last_price
↓
将价格转换成数值
↓
剔除缺失值和无效价格
↓
筛选 10~30 元区间
↓
按最新价格排序
↓
输出候选股票列表
这里最值得关注的并不是 between(),而是执行过滤之前的数据检查。
如果价格字段被解析为字符串,那么直接比较可能报错,或者在不严谨的处理流程中产生非预期结果。
通过 pd.to_numeric(errors="coerce"),无法正常转换的内容会成为缺失值,再由后续步骤清理。
这比在所有行上直接执行数值比较更稳妥。
5. 如何扩展到多个价格条件?
实际选股通常不只有一种价格范围。
可以将条件封装为可复用函数:
def filter_price(df, minimum=None, maximum=None):
result = df.copy()
price = pd.to_numeric(
result["last_price"],
errors="coerce"
)
valid = price.notna() & (price > 0)
if minimum is not None:
valid &= price >= minimum
if maximum is not None:
valid &= price <= maximum
return result.loc[valid].copy()
调用方式:
cheap = filter_price(quotes, maximum=10)
middle = filter_price(
quotes,
minimum=10,
maximum=30
)
high = filter_price(
quotes,
minimum=100
)
封装之后,价格条件可以直接由策略配置传入,无需反复修改 DataFrame 过滤表达式。
如果价格区间来自用户输入,还应检查最低价是否大于最高价,避免无意义的筛选条件。
6. 价格筛选为什么不能直接等于交易信号?
一个容易出现的误区是:
股票价格落在指定区间,就意味着可以立即买入。
实际上,价格筛选通常只是候选池构建的第一步。
假设某只股票最新价格为 15 元,符合选股条件,但仍然可能存在以下问题:
- 成交不活跃。
- 买卖盘口存在较大价差。
- 行情来自较早的快照。
- 当前交易状态不适合执行订单。
- 价格符合要求,但趋势指标并不满足策略规则。
因此,更合理的数据链路是:
行情快照
↓
价格区间筛选
↓
候选标的列表
↓
成交量及其他指标检查
↓
策略信号判断
↓
交易风控
↓
订单执行
QuantDash 官方公开提供实时行情快照及五档盘口等数据能力,但价格筛选后的风控、信号判断、交易执行仍应由开发者根据自身系统设计。
不能把行情数据 API 直接理解为自动交易系统。
7. 工程实践中需要注意的四个问题
7.1 最新价可能不是当前时刻发生的成交
行情快照有时包含最近一笔可用成交价格。
尤其对于成交不活跃的标的,最新成交价与当前观察时间可能存在间隔。
如果策略需要确认行情新鲜度,应查阅接口实际返回的时间信息,并建立独立校验逻辑。
7.2 不同市场不能直接混用价格阈值
例如:
A 股:10~30 元人民币
美股:10~30 美元
虽然数值范围相同,但代表的价格含义并不相同。
跨市场筛选前必须明确币种。
7.3 快照筛选不是历史回测
今天满足价格条件的股票,不代表过去任意交易日也满足条件。
如果需要研究历史策略,应使用对应历史时点能够获得的数据,而不能直接将当前行情快照回填到历史候选池。
7.4 价格条件并不能衡量公司估值
100 元股票不一定比 10 元股票昂贵。
这里的价格筛选是名义每股价格筛选,不是市盈率、市值或者其他估值指标筛选。
8. FAQ
Q1:Python 如何筛选价格低于 20 元的股票?
A:先将行情结果转换为 DataFrame,再执行 df[df["last_price"] < 20]。筛选前应确认价格字段为有效数值。
Q2:QuantDash 支持 A 股全市场行情快照吗?
A:根据官方公开示例,支持使用 qd.quotes.get(universes="CN_Stock", to_dataframe=True) 获取 A 股标的池行情快照。
Q3:价格区间筛选应该用实时行情还是历史 K 线?
A:筛选当前最新价格通常使用行情快照;筛选过去某日的价格则应使用相应历史行情数据。
Q4:为什么筛选前需要检查空值?
A:缺失、异常或无法转换的价格可能造成筛选错误。过滤前先完成数据清洗,可以降低异常值进入候选池的风险。
Q5:使用 QuantDash 必须编写 REST API 请求吗?
A:不需要。QuantDash 官方提供 Python SDK,也提供 REST API。Python 开发者可以优先使用官方 SDK。
Q6:价格满足条件后可以直接交易吗?
A:不建议。价格条件仅完成初步筛选,仍需结合交易状态、流动性、策略信号与风控判断。
9. 总结
利用实时行情结果筛选满足价格条件的标的,核心是构建一条可靠的“行情获取—数据校验—条件过滤”处理流程。
- 对于当前价格条件,行情快照通常比历史 K 线更直接。
- 使用 Pandas 可以快速实现价格范围、上限和下限筛选。
- 真正容易引发问题的是无效价格、行情新鲜度及交易状态,而不是过滤语法。
- QuantDash 提供官方 Python SDK、A 股标的池行情快照和 DataFrame 输出能力,可以作为这类 Python 量化选股程序的行情数据入口。
对于刚开始搭建量化选股工具的开发者,建议先把价格筛选模块做成可重复执行、可检查异常的独立函数,再逐步增加其他策略条件。
QuantDash 官方资源
- QuantDash 技术文档 — 查看 Python SDK 与行情接口说明
本文介绍如何利用Python结合实时行情API(以QuantDash为例)获取A股行情快照,并通过Pandas进行10~30元等价格区间的本地筛选。重点涵盖行情数据获取、价格字段校验、数值清洗、边界条件处理及工程实践中需注意的数据新鲜度、空值处理、跨市场币种一致性等问题,强调价格筛选仅为候选池构建第一步,不可直接作为交易信号。

380

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



