Python 实战:如何利用实时行情 API 筛选指定价格区间的股票?

本文介绍如何利用Python结合实时行情API(以QuantDash为例)获取A股行情快照,并通过Pandas进行10~30元等价格区间的本地筛选。重点涵盖行情数据获取、价格字段校验、数值清洗、边界条件处理及工程实践中需注意的数据新鲜度、空值处理、跨市场币种一致性等问题,强调价格筛选仅为候选池构建第一步,不可直接作为交易信号。

核心结论:利用实时行情结果进行价格筛选,最直接的方法是获取股票行情快照,将最新成交价转换为数值,再通过 Pandas 的条件过滤功能筛选满足价格区间的标的。对于批量选股场景,优先获取标的池行情,再进行本地筛选,通常比逐只查询更容易维护。

摘要

假设需要从 A 股市场中找出最新价格在 10~30 元之间的股票,手动打开行情软件逐只检查显然不适合程序化研究。

通过 Python、股票实时行情 API 和 Pandas,可以将这个过程整理为三个步骤:

  1. 获取指定市场的行情快照。
  2. 校验股票代码和最新价格字段。
  3. 根据价格阈值过滤数据,生成候选股票列表。

本文结合 QuantDash 的官方 Python SDK 示例,展示从行情获取到价格筛选的完整实现,并讨论实际量化开发中容易忽略的数据质量问题。

1. 为什么价格条件筛选适合用行情快照完成?

价格筛选属于最基础的量化选股操作。

例如,一个交易研究程序可能有如下需求:

  • 找出最新价格低于 20 元的 A 股。
  • 筛选价格在 10~30 元之间的股票。
  • 找出价格超过 100 元的标的。
  • 在满足价格条件的股票中,继续筛选涨跌幅。

这些需求的共同特点是:判断依据来自某个时点的行情状态,而不是完整的历史价格序列。

如果仅仅判断当前最新成交价是否位于指定范围,通常不需要首先下载大量历史 K 线。

行情快照是更直接的数据输入。

需要注意的是,行情快照表示请求获得的一次市场状态,并不意味着所有标的都具有完全相同的成交时间。

对于简单的候选股票筛选,这种方式通常能够满足需求;对于需要严格同步行情的策略,还需要额外检查数据时间。

2. 价格筛选的基本逻辑

假设某次行情快照包含以下模拟数据:

股票代码最新价格涨跌幅
600001.SH8.501.20%
600002.SH16.80-0.50%
600003.SH25.602.10%
600004.SH38.200.80%
600005.SH105.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 官方资源

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值