Wanying API

Wanying API 文档

26 实体只读数据查询 + 完整性辅助,面向 wanying-quant DataEngine

1. 文档索引

2. 服务定位

Wanying API 是唯一服务于 wanying-quant skill DataEngine只读数据通道:把 26 个实体以「面板加载友好」的 REST API 暴露出来。

3. 快速开始

import requests

BASE = "https://api.wanying.iovp.com"
TOKEN = "tr_xxxxxxxxxxxxxxxxxxxxxxxxxxxx"

resp = requests.get(
    f"{BASE}/api/v1/entities/daily",
    params={"start_date": "20240101", "end_date": "20241231",
            "fields": "ts_code,trade_date,close", "limit": 100},
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=60,
)
data = resp.json()
print(data["entity"], data["count"], data["columns"], data["rows"][0])

4. 鉴权方式

所有 /api/v1/* 端点均需携带有效 token。有效 token 即可访问全部 26 实体,无套餐、无配额、无计量。

两种携带方式(任选其一):

  1. HTTP 请求头(推荐):Authorization: Bearer <token>
  2. 查询参数?token=<token>
# 方式一:请求头
requests.get(f"{BASE}/api/v1/meta", headers={"Authorization": f"Bearer {TOKEN}"})

# 方式二:查询参数
requests.get(f"{BASE}/api/v1/meta", params={"token": TOKEN})

token 无效、缺失或已禁用时,返回 401 invalid_token

5. 通用请求协议

所有实体共用同一资源化端点:

GET /api/v1/entities/{entity}

其中 {entity} 为 26 个实体名之一(见各实体页)。

5.1 通用参数

参数类型说明
start_date / end_dateYYYYMMDD时间区间过滤,作用于各实体的主日期列(见各实体页的「主日期列」)。可只传其一。
ts_code逗号分隔字符串单票或多票,如 000001.SZ,600000.SH;不传 = 全市场。指数类实体对应指数代码。
fields逗号分隔字符串列投影,只取需要的列;不传 = 该实体全部业务字段。
as_ofYYYYMMDDpoint-in-time 锚点(仅财务类、research_report、anns_d、index_member 有效):只返回 公告日 <= as_of 的行,防未来函数。
periodYYYYMMDD报告期筛选(仅财务类有效,作用于 end_date 列)。
limitint本次返回行数上限。默认:json 10000 / arrow·parquet 100000;硬上限:json 50000 / 二进制 500000。
cursorstring分页游标(上一响应 next_cursor 原样回传)。
formatenumjson(默认)/ arrow(Arrow Feather v2,zstd)/ parquet

5.2 JSON 响应结构

{
  "entity": "daily",
  "data_version": "2026-08-14T22:50:21+00:00",
  "columns": [
    {"name": "ts_code", "dtype": "string"},
    {"name": "trade_date", "dtype": "string"},
    {"name": "close", "dtype": "float64"}
  ],
  "rows": [
    ["000001.SZ", "20240102", 10.30],
    ["000002.SZ", "20240102", 8.12]
  ],
  "count": 2,
  "truncated": false,
  "next_cursor": null
}
字段类型说明
entitystring实体名。
data_versionstring数据版本(ISO-8601 时间戳),研究快照存此值可实现可复现。
columnsarray列元信息:name(列名)+ dtype(string / float64 / int64)。
rowsarray数据行,二维数组,列顺序与 columns 一致。
countint本页返回行数。
truncatedbool是否还有更多数据(true 表示需用 next_cursor 续取)。
next_cursorstring|null下一页游标;为 null 表示已到末尾。

5.3 二进制格式(arrow / parquet)

format=arrow 时响应体为 Feather v2(Arrow IPC file,zstd 压缩),可被 pandas.read_featherpolars.read_ipc 直接零拷贝加载;format=parquet 为 Parquet(zstd)。元信息经响应头传递:

响应头说明
X-Entity实体名。
X-Data-Version数据版本。
X-Truncatedtrue / false,是否有下一页。
X-Next-Cursor下一页游标(无则缺省)。
import io, pandas as pd, requests

resp = requests.get(f"{BASE}/api/v1/entities/daily",
                    params={"format": "arrow", "limit": 100000},
                    headers={"Authorization": f"Bearer {TOKEN}"})
df = pd.read_feather(io.BytesIO(resp.content))  # 零拷贝进 pandas
print(df.shape)

5.4 分页(游标)

服务端执行一律 LIMIT 上限+1,返回超界时 truncated:true + next_cursor。游标为 keyset 分页(按实体主键序,稳定高效),客户端循环续取直到 truncated=false

import io, pandas as pd, requests

def load_panel(entity, **params):
    """一次性面板加载:自动循环游标分页,返回合并后的 DataFrame。"""
    params.setdefault("format", "arrow")
    cursor, frames = None, []
    while True:
        p = dict(params)
        if cursor:
            p["cursor"] = cursor
        r = requests.get(f"{BASE}/api/v1/entities/{entity}",
                         params=p, headers={"Authorization": f"Bearer {TOKEN}"})
        r.raise_for_status()
        frames.append(pd.read_feather(io.BytesIO(r.content)))
        if r.headers.get("X-Truncated") == "true":
            cursor = r.headers["X-Next-Cursor"]
        else:
            break
    return pd.concat(frames, ignore_index=True)

df = load_panel("daily", start_date="20240101", end_date="20241231",
                fields="ts_code,trade_date,close")

6. 错误响应

统一 JSON 结构:

{"error": {"code": "invalid_params", "message": "参数格式错误", "details": {"start_date": "..."}}}
codeHTTP含义
invalid_token401token 缺失 / 无效 / 已禁用。
invalid_params400参数格式错误、未知参数。
entity_not_found404{entity} 不在 26 实体清单(含被移除的舆情/互动/分钟类)。
entity_unavailable404实体在基线内但数据尚未落库 / 回补未完成。
request_too_large413ts_code/fields 数量超限,或响应超过字节上限。
limit_exceeded400limit 超上限 / cursor 无效或过期。
query_timeout504单查询超时被终止。
rate_limited429触发并发 / 频率保护(每 token 30 req/s)。
internal_error500查询异常。
datastore_unavailable503数据服务暂不可用 / 被锁定。

原则:数据缺口显式报错并给范围,不静默返回空数据。

7. 字段类型与格式约定