> Source: https://ashareapi.com/docs/endpoints/screen/  ·  Markdown version for LLMs / AI agents

付费端点 · 付费

# 因子选股（量化筛股） API
 按因子表达式筛选全市场股票。expr 是多因子交集，例如：intersect([PE_TTM > 0, PE_TTM < 20, ROETTM > 15])。preset 用官方 22 个预设名（大小写/下划线不敏感：low_pe 等价 LowPE）：LowPE/LowPB/HighDividend/ValuationPercentile/PEG/KDJOversold/RSIOversold/NineTurnGreen9/HighRating/TargetPriceUpside/HighROE/HighGrowth/LowDebt/PositiveCashFlow/MainInflow/SustainedInflow/HighShortRatio/HighDividendLowValuation/WhiteHorseGrowth/Turnaround/SmallCapValue/TechFundamentalCombo。常用因子：PE_TTM/PB/PS_TTM/TotalMV/DividendRatioTTM（估值）· ROE/ROETTM/ROIC/GrossIncomeRatioTTM/NetProfitRatioTTM（盈利）· OperatingRevenueGrowRate/NPParentCompanyYOY（成长）· CurrentRatio/DebtAssetsRatio/NAPS（负债）· NetOperateCashFlowTTM（现金流）。用户问『筛选股票/符合条件的股票/低估高ROE』时用这个。
 付费 `GET /v1/screen`
 接口签名
```
GET /v1/screen?expr=intersect(%5BPE_TTM%20%3E%200%2C%20PE_TTM%20%3C%2020%2C%20ROETTM%20%3E%2015%5D)
```
 一行可跑

```
curl "https://api.ashareapi.com/v1/screen?expr=intersect(%5BPE_TTM%20%3E%200%2C%20PE_TTM%20%3C%2020%2C%20ROETTM%20%3E%2015%5D)&key=YOUR_KEY"
```
 参数：`expr · preset · limit · orderby · desc · market` 带 * 为必填

## 快速开始
 把下面的代码里的 Key 换成你的（免费端点无需 Key，直接调）：
 curl

```
# 注：expr 的值已做 URL 编码（含 [ ] 空格 等）
# 推荐：Authorization 头（密钥不进日志）
curl -H "Authorization: Bearer YOUR_KEY" \
 "https://api.ashareapi.com/v1/screen?expr=intersect(%5BPE_TTM%20%3E%200%2C%20PE_TTM%20%3C%2020%2C%20ROETTM%20%3E%2015%5D)"

# 快速测试：直接浏览器打开（?key= 会留在日志/历史里，别用于生产）
curl "https://api.ashareapi.com/v1/screen?expr=intersect(%5BPE_TTM%20%3E%200%2C%20PE_TTM%20%3C%2020%2C%20ROETTM%20%3E%2015%5D)&key=YOUR_KEY"
```
 Python

```
import requests

r = requests.get(
 "https://api.ashareapi.com/v1/screen",
 headers={"Authorization": "Bearer YOUR_KEY"},
 params={},
 timeout=30,
)
print(r.json())
```
 JavaScript

```
const r = await fetch("https://api.ashareapi.com/v1/screen?expr=intersect(%5BPE_TTM%20%3E%200%2C%20PE_TTM%20%3C%2020%2C%20ROETTM%20%3E%2015%5D)", {
 headers: { Authorization: "Bearer YOUR_KEY" },
});
console.log(await r.json());
```

## 参数
 |
| | 参数 | 类型 | 必填 | 说明

| | expr | string | 否 | 因子表达式，如 intersect([PE_TTM > 0, PE_TTM < 20, ROETTM > 15])

| | preset | string | 否 | 预设名（与 expr 二选一）：LowPE/LowPB/HighDividend/PEG/HighROE 等 22 个

| | limit | integer | 否 | 返回条数，默认 20

| | orderby | string | 否 | 排序字段（如 ROETTM）

| | desc | boolean | 否 | True 降序 / False 升序

| | market | string | 否 | 市场：hs 沪深 / hk 港股 / us 美股（留空=沪深）

 `expr` string
 因子表达式，如 intersect([PE_TTM > 0, PE_TTM < 20, ROETTM > 15])

 `preset` string
 预设名（与 expr 二选一）：LowPE/LowPB/HighDividend/PEG/HighROE 等 22 个

 `limit` integer
 返回条数，默认 20

 `orderby` string
 排序字段（如 ROETTM）

 `desc` boolean
 True 降序 / False 升序

 `market` string
 市场：hs 沪深 / hk 港股 / us 美股（留空=沪深）

## 返回示例
 取样：`GET /v1/screen?expr=intersect([PE_TTM > 0, PE_TTM 15])&limit=3`（2026-09-26 线上真实返回，已截断）。⚠️ 注意 `data` 是 **Markdown 表格字符串**，不是数组 —— 机器读取请用 `structured` 或 `tables`。
```
{
 "ok": true,
 "endpoint": "screen",
 "tier": "unlimited",
 "elapsed_ms": 2430,
 "source": "multi",
 "data": "| code | name | PE_TTM | ROETTM | ClosePrice | ChangePCT |\n| --- | --- | --- | --- | --- | --- |\n| sz000656 | 金科股份 | 0.35 | 883.0546 | 1.23 | -2.38 |\n| … |",
 "structured": [
 { "code": "sz000656", "name": "金科股份", "PE_TTM": "0.35",
 "ROETTM": "883.0546", "ClosePrice": "1.23", "ChangePCT": "-2.38" },
 { "code": "sh600841", "name": "动力新科", "PE_TTM": "2.40",
 "ROETTM": "50.3702", "ClosePrice": "5.63", "ChangePCT": "-1.57" }
 ],
 "tables": [ [ /* 与 structured 同内容的表格数组 */ ] ]
}
```
 返回
 统一返回信封： `{ ok, endpoint, tier, elapsed_ms, source, data }`
 数据在 `data` 字段；上游为空时 `ok:false` 且**不扣次数**。

 限流与额度
 免费端点无需 Key（匿名 5 次/分，解一次 PoW 可到 60 次/分；每次最多 250 根 K 线、每天最多 10 万条）。付费端点按档位限流：体验 30 · 标准 120 · 专业 300 · 不限量 600 次/分；买断档按总量计（不用完不过期）。
[看错误码对照表 →](/docs/errors)

## 常见问题
 为什么 `data` 是一个 Markdown 表格字符串？
 为了让你**直接把结果贴给 LLM**，`data` 是 Markdown 表格文本；机器读取请用同级的 `structured`（对象数组）或 `tables`（表格数组），三者内容完全一致。

 选股表达式怎么写？
 用 `intersect([...])` 组合条件，例如 `intersect([PE_TTM > 0, PE_TTM 15])`。也可以用 `preset` 预设（如 `LowPE`）。`limit` 默认 20。返回列由你写在 `expr` 里的因子决定。

 `/v1/screen` 免费吗？有免费的替代吗？
 **不免费**（付费端点）。无 Key 调用返回 `{"error":"需要 API Key（此端点属付费层）"}`。免费替代：`/v1/changedist`（涨跌分布）、`/v1/hot`（热搜榜）、`/v1/market-overview`（市场总览）。

 返回里有哪些字段？
 **由你的表达式决定** —— 写在 `expr` 里的因子会直接成为返回列。示例表达式的返回列：`code` / `name` / `PE_TTM` / `ROETTM` / `ClosePrice` / `ChangePCT`。

### 通用问题（所有端点通用）
 这些端点需要 API Key 吗？
 **免费端点不需要**：health、challenge、quote、kline、hot、market-overview、changedist 匿名即可调用。**付费端点需要**：在请求头带 `Authorization: Bearer `。⚠️ 匿名额度**按调用者类型分级**：浏览器（真人）**5 次/分**；脚本 / SDK / AI Agent（curl、requests、axios、openai 等 UA）**2 次/分** —— 自动化流量更易被滥用。解一次 PoW 挑战（`GET /v1/challenge`，再带 `X-PoW` 头）可提到 **60 次/分**，与类型无关。⚠️ 另外，匿名调用**单次最多取 250 根 K 线、每天最多 10 万条** —— 要一次拿满 1212 根或不限日量，请用 API Key。

 返回为空或上游报错时，会扣我的调用次数吗？
 **不会**。上游失败或空结果时返回 `ok:false`，并**自动退回**本次计费（total_calls / usage_log / ep_log 三处同时回滚）。只有真正取到数据的请求才计入用量。

 数据多久更新一次？
 行情类（quote / kline / orderbook / changedist）为**实时或当日**；财务、股东、分红、事件等为**上游披露后 T+1 内**。响应里的 `source` 字段标明本次实际命中的数据通道。

 一次请求能批量拿多只股票吗？
 **不能**。`code` 是单值参数，一次一只；批量请并发调用（注意各自档位的每分钟限流）。

 怎么在 Claude / Cursor / ChatGPT 里直接调用？
 配一次 MCP 即可，之后直接问 AI「查一下……」它会自己调。MCP 暴露 24 个工具，覆盖行情 / 财务 / 选股 / 板块 / 宏观。

## 相关端点
 [财务报表](/docs/endpoints/finance)[个股资金+龙虎榜+大宗+两融（综合）](/docs/endpoints/fund)[技术指标](/docs/endpoints/technical)[股东研究](/docs/endpoints/shareholder)[筹码分布/成本](/docs/endpoints/chip)[五档盘口（order book · 买五卖五）](/docs/endpoints/orderbook)[全字段行情画像（估值/市值/股本/涨停价）](/docs/endpoints/snapshot)[个股事件标签（42 类）](/docs/endpoints/events)

### 上下游端点
 [涨跌分布（市场广度）](/docs/endpoints/changedist)[热搜榜](/docs/endpoints/hot)[市场总览（大盘画像）](/docs/endpoints/market-overview)

 要把它接进 AI Agent？
 配一次 MCP，之后问 AI「查一下……」它自己调。

 [MCP 接入说明](/mcp)[查看定价](/pricing)

 [← 返回完整端点清单](/endpoints)
