DEVELOPER GUIDE / FIXED ARCHIVE
ETF 数据研究接入文档
从浏览数据到可复现回测。固定版本 v2026-07-31-r2 · 数据截至 2026-07-31 · Asia/Shanghai。
01 / 开始使用
注册时阅读固定用户协议,完成邮件验证与 TOTP 绑定;登录门户后获取试用或已审核的 Open API Token。浏览公开归档不需要 Token,调用 Open API 使用 Authorization: Bearer。Portal/Admin Cookie 与 API Token 分开,量化脚本使用 Token。
设置 ETF_API_ORIGIN 为当前平台的完整地址,ETF_API_TOKEN 为你的密钥。示例不把密钥写入代码或浏览器存储。
curl --get "$ETF_API_ORIGIN/api/v2/open/etf/bars" \
--header "Authorization: Bearer $ETF_API_TOKEN" \
--data-urlencode 'tsCode=510300.SH' \
--data-urlencode 'interval=1d' \
--data-urlencode 'start=2025-01-01' \
--data-urlencode 'end=2025-12-31' \
--data-urlencode 'adjust=qfq' \
--data-urlencode 'limit=500'
02 / 数据集与字段
提供 1m、5m、15m、30m、60m、1d 六种周期。分钟线主要按年份分区,日线为独立文件。归档价格未复权,复权由 API 使用每行 adj_factor 动态计算。固定历史数据不代表实时覆盖,也不保证每只 ETF 全区间完整。
| 字段 | 含义与使用方式 |
|---|---|
| tsCode / tradeDate / tradeTime | API 使用 camelCase;Parquet 使用 ts_code / trade_date / trade_time。时间为上海本地时间,不带 UTC 偏移;日线 tradeTime 为空。 |
| open / high / low / close | OHLC。none 为原始价格,qfq/hfq 为计算结果;无效因子返回 null。 |
| adjFactor / rawClose / adjustmentStatus | 原始累积因子、复权前收盘价与逐行质量状态。rawClose 在 none 下为空。 |
| vol / amount | 原始成交量和成交额;不随价格复权,不做单位换算。归档未声明统一单位,不能据此直接计算换手率。 |
| preClose / change / pctChg | 日线原始昨收与涨跌字段;复权模式下返回 null,请基于同一复权口径的相邻 close 自行计算收益。 |
| nav / totalShare / totalSize | 日线原始净值、份额和规模,未做复权或单位推断。分钟线为空。 |
基础资料存在同代码多种日期表示;检索接口按代码归并,详情保留 variants。不得把当前名称/存续状态直接当作历史可投资股票池。缺失行、停牌、退市、时点可得性需要在研究侧明确处理。
03 / 接口目录
/api/v2/open/meta/pingToken 有效性探测 · Scope: etf:meta:read
/api/v2/open/dataset固定 r2 Manifest 摘要 · Scope: etf:meta:read
/api/v2/open/dataset/schema?interval=1d物理字段、类型与可空性 · Scope: etf:meta:read
/api/v2/open/etfs?q=510300&limit=20ETF 代码/名称检索 · Scope: etf:security:read
/api/v2/open/etfs/510300.SHETF 详情及原始表示变体 · Scope: etf:security:read
/api/v2/open/etf/bars单代码 K 线与复权 · Scope: etf:bars:read
/api/v2/open/etf/bars/queryJSON 参数 K 线查询 · Scope: etf:bars:read
/api/v2/open/etf/coverage各周期覆盖范围 · Scope: etf:quality:read
GET bars 参数:tsCode、interval、start、end 必填;limit 默认 500、最大 5000;cursor 可选;adjust 默认为 none。POST 使用同名 JSON 字段。日期按整天闭区间,日期时间支持 YYYY-MM-DDTHH:mm:ss;不接收任意 SQL、文件路径或数据版本。
04 / 前复权与后复权
P = 原始 OHLC,F(t) = 当前行 adj_factor
none: P(t)
hfq: P(t) × F(t)
qfq: P(t) × F(t) ÷ F(anchor)
anchor = 同代码、同周期、完整请求区间内,截止 end 的末条记录
例如原始价格为 10,当前因子为 1.2,基准因子为 1.5,前复权价格为 8,后复权价格为 12。后复权沿用源因子的尺度;不会再除以请求起点因子。
推荐大批量研究请求 adjust=none,在本地用 adjFactor 计算并缓存结果,减少服务端计算。none/hfq 不额外读取基准;qfq 首次查询需要额外扫描基准,进程内使用最多 256 项 LRU 缓存。相同目录快照、代码、周期、起止时间的后续页可命中;缓存逐出或进程重启后需重新查询,并发冷请求仍可能重复加载。
qfq 响应包含 adjustmentAnchorTime / adjustmentAnchorFactor。基准按完整查询区间确定,与 limit 和当前页无关;更改 end 会改变前复权结果。跨区间拼接时应使用一致的截止时间或使用 hfq 后自行归一化。分页必须保持原请求参数。
缺失或非正 adjFactor:adjustmentStatus=missing_factor;qfq 基准因子缺失或非正:missing_anchor;对应 OHLC 返回 null。成功为 adjusted,未复权为 raw。不会取未来日期因子、不会填 1 或跨缺失行自动补齐。源因子的发布时点不在归档中,复权价格本身不能保证回测没有未来信息。
公式参考 Tushare 复权计算说明;此平台用归档原始因子计算,不调用外部行情服务。
也可以下载 Python 客户端复权工具(仅标准库),在本地完成相同计算。输入必须为 adjust=none 的原始 API 行;直接读取 Parquet 时先将 adj_factor 映射为 adjFactor。选择基准应结合策略可得时点,不要把后续因子用于早期决策。
# 先下载本页提供的 adjust_prices.py(与脚本放在同一目录)
from adjust_prices import adjust_bar
# API 请求指定 adjust=none,按页保存原始行。
# 显式选择同代码同周期的基准日期,从那条原始记录取得 adjFactor。
# 例:基准因子 1.5;真实研究必须替换为已核验的实际因子。
anchor_factor = "1.5"
raw_bar = dict(open=10, high=12, low=9, close=10, adjFactor=1.2)
print(adjust_bar(raw_bar, "qfq", anchor_factor=anchor_factor)["close"]) # 8
print(adjust_bar(raw_bar, "hfq")["close"]) # 12
# 对所有分页/分块复用同一个 anchor_factor;不要用每页末行作基准。
# 返回价格为 Decimal,写 JSON 时可转字符串以保留计算精度。
05 / 游标与 Python
响应外壳为 code / message / data / requestId / ts。data.items 是本页数据,count 是本页条数,total 为 null。根据 hasMore 和 nextCursor 顺序翻页;游标绑定版本、代码、周期、起止时间、adjust 和算法版本,修改条件后从第一页开始。
import os
import requests
origin = os.environ["ETF_API_ORIGIN"].rstrip("/")
headers = {"Authorization": "Bearer " + os.environ["ETF_API_TOKEN"]}
params = dict(tsCode="510300.SH", interval="1d", start="2025-01-01",
end="2025-12-31", adjust="qfq", limit=500)
with requests.Session() as client:
while True:
response = client.get(origin + "/api/v2/open/etf/bars",
params=params, headers=headers, timeout=65)
response.raise_for_status()
envelope = response.json()
if envelope["code"] != 0:
raise RuntimeError(envelope)
page = envelope["data"]
for bar in page["items"]:
if bar["adjustmentStatus"] != "adjusted":
raise ValueError("复权因子缺失,请先处理数据质量: " + str(bar))
# 按页写文件或送入研究流程,避免无限累积内存
print(bar["tradeDate"], bar["close"])
if not page["hasMore"]:
break
params["cursor"] = page["nextCursor"]
不支持深度 offset 或随机页跳转;不要为统计总数循环下载整个归档。需要计数时先看 /open-data 的 Manifest 摘要。
06 / 在线浏览
进入 数据阅读器,选择本地文件、HTTP URL、R2 或默认清单。先读 Schema,选择显示字段、本地别名和格式,再查询数据。文件无需上传;本地操作不修改原始 Parquet。
阅读器展示原始数据。需要复权研究结果时使用 bars API。后台数据资产表可按文件进入阅读器,公开数据目录可按周期进入。CSV 支持当前页、已缓存页和最多 10,000 行筛选结果;导出字段名使用本地显示设置。
远程文件要求 CORS 与 HTTP Range;R2 放行实际平台 Origin、GET/HEAD、Range 请求头,暴露 Content-Range、Content-Length、ETag。Worker/WASM 来自主应用,Parquet 从 R2 直读。
07 / 错误、额度与查询限制
单次时间跨度上限:1m 31 天、5m 93 天、15m 366 天、30m 730 天、60m 1825 天、1d 7300 天。候选文件与扫描字节也有预算限制;查询超时应缩小区间。
非零 code 为业务失败,即便 HTTP 成功也应检查。HTTP 401/403 检查 Token、过期和 Scope;429 按服务端限流响应等待。CURSOR_INVALID 重新发起相同查询第一页;QUERY_TOO_BROAD / QUERY_SCAN_BUDGET_EXCEEDED 缩小区间;QUERY_BUSY / QUERY_TIMEOUT 降低并发并有限重试。业务 code 实际返回数字,以上是文档中的符号名称。
平台提供历史研究数据与计算工具。使用前阅读 用户协议,并自行核实数据授权范围、样本偏差和研究结果。公开可读不等于允许再次分发。
08 / 账号与身份验证
只浏览公开归档无需注册。需要 API、用量记录或 Token 管理时,先打开 注册页,按页面提示阅读固定用户协议、滚动到底并完成阅读等待,明确同意后进入注册表单。本平台使用“邮箱 + 动态验证码”,不是传统邮箱密码登录。
- 输入邮箱并发送验证码。服务端有邮箱域名白名单,以页面实际反馈为准。默认验证码有效期 5 分钟、重发冷却 60 秒,部署可能调整。
- 输入邮件中的 6 位验证码。验证成功后展示 TOTP 二维码/密钥。用认证器扫码,妥善离线备份;不要把二维码或密钥发给别人。
- 输入认证器当前的 6 位动态码,提交绑定;注册会记录此前明确同意的固定协议。绑定流程默认 10 分钟有效,过期后重新从页面开始。
- 完成注册进入门户。若平台启用注册试用,会显示一次性的试用 Token 明文;立即保存。没有发放时通过申请页申请,不要重复注册。
- 以后在 登录页 使用邮箱和 TOTP 登录。浏览器会话只管理账户,不能替代 Open API Bearer Token。
手机丢失或密钥不可用:打开 恢复页,通过邮件验证后重新绑定 TOTP。不要循环猜码;默认连续失败会触发短期锁定。动态码持续错误时检查手机自动校时、绑定的账号以及刚过期的验证码。
Cookie 用于登录会话与本地偏好。API Token、TOTP secret 不应写入共享文档、工单、日志或截图。退出登录后再次访问门户应要求重新登录。
09 / Token 申请、轮换与额度
在 Token 管理 查看状态、Scope、过期时间、请求和出站字节用量。默认试用配置为 24 小时有效、100 次请求、100 MiB 出站额度;这些值可以被部署配置覆盖,始终以门户实际显示为准。
需要更多额度时进入 申请页,填写名称、研究用途、权限、请求额度、字节额度与有效期。申请提交不等于立即授权,需要管理员审核;申请状态在门户申请记录中查看。
| 权限 | 用途 | 建议 |
|---|---|---|
| etf:meta:read | ping、数据目录、Schema | 仅目录发现使用 |
| etf:security:read | ETF 检索、基础资料详情 | 建立研究标的映射 |
| etf:bars:read | GET/POST 行情 | 价格与因子研究 |
| etf:quality:read | Manifest 覆盖事实 | 查看已归档范围 |
| etf:read | 上述 ETF 读取能力的汇总权限 | 常规只读量化接入 |
额度是滚动 24 小时窗口,不是每天零点统一清零;还存在单 Token 每 10 秒 30 次的突发限制。请求额度、字节额度和 Token 绝对过期时间互相独立。轮换/禁用再启用不应被当作清零额度的方法。请求失败也可能消耗已经预占的额度,请关注响应头与门户。
| 操作 | 效果 | 使用注意 |
|---|---|---|
| 禁用 / 启用 | 暂停 / 恢复已有 Token | 泄露时先禁用,再排查传播范围 |
| 重置(轮换) | 生成新明文,旧密钥失效 | 先安排脚本切换窗口,保存新明文;没有双密钥宽限承诺 |
| 删除 | 删除该 Token | 不能继续请求;不要误删仍被脚本使用的 Token |
| 忘记明文 | 列表不提供原密钥恢复 | 通过轮换取得新 Token |
查看 调用记录 与 用量分析。聚合计数/最近使用时间可能批量刷新,不是每一次请求都即时反映;定位失败优先使用 requestId。
10 / 查询参数与响应逐项说明
| 参数 | 规则 | 示例 / 注意 |
|---|---|---|
| tsCode | 必填,单只 ETF,带交易所后缀 | 510300.SH;不是逗号分隔的代码列表 |
| interval | 必填,固定 6 个值 | 1m / 5m / 15m / 30m / 60m / 1d |
| start / end | 必填,上海本地日期或日期时间 | 2026-07-01 或 2026-07-01T09:30:00;起止为闭区间 |
| limit | 默认 500,最大 5000,正整数 | 小页便于预览;不会返回精确 total |
| adjust | none(默认)/ qfq / hfq | 只变换 OHLC;同一分页链不可改变口径 |
| cursor | 服务端上页 nextCursor 原样传回 | 不要解码/修改;修改查询条件后删掉它 |
下面是结构示意,不是真实行情样本;items 为空表示该查询无记录。实际返回以实时接口为准,estimatedScanBytes 是候选分片大小之和,不等于实际磁盘读取量或网络出站量。
{
"code": 0,
"message": "success",
"data": {
"datasetVersion": "v2026-07-31-r2",
"tsCode": "510300.SH",
"interval": "1d",
"adjust": "none",
"adjustmentMethod": "factor-v1",
"adjustmentAnchorTime": null,
"adjustmentAnchorFactor": null,
"items": [],
"count": 0,
"total": null,
"totalRelation": "unknown",
"nextCursor": null,
"hasMore": false,
"scannedFiles": 1,
"estimatedScanBytes": 123456
},
"requestId": "example-request-id",
"ts": "2026-09-14T12:00:00"
}
count 是当前页条数;hasMore=true 时必须使用 nextCursor;total=null / totalRelation=unknown 表示没有做总数扫描。datasetVersion 固定;scannedFiles 是候选分片数量。qfq 的 adjustmentAnchorTime/Factor 标记当前查询基准,none/hfq 没有这个基准。
日线只用 tradeDate,tradeTime 为空;分钟线包含 tradeTime。价格允许 null,不应转换成零。所有频率保留原始 adjFactor;rawClose 仅在复权模式保留原始收盘价。NaN、空白显示和缺失行不是同一概念。
11 / 多语言调用与有限重试
先在本地终端设置 ETF_API_ORIGIN 和 ETF_API_TOKEN。API 域名使用当前站点,不要把 Parquet 文件域名当作 API 地址。下面的 POST 与 GET 查询规则完全一致。
curl --request POST "$ETF_API_ORIGIN/api/v2/open/etf/bars/query" \
--header "Authorization: Bearer $ETF_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"tsCode": "510300.SH",
"interval": "15m",
"start": "2026-07-01",
"end": "2026-07-31",
"limit": 500,
"adjust": "none"
}'
// Node.js 22;只在服务端/本地脚本使用,不把 Token 写入公开网页。
const origin = process.env.ETF_API_ORIGIN?.replace(/\/$/, "");
const token = process.env.ETF_API_TOKEN;
if (!origin || !token) throw new Error("请设置环境变量");
const params = new URLSearchParams({
tsCode: "510300.SH", interval: "15m",
start: "2026-07-01", end: "2026-07-31",
adjust: "none", limit: "500"
});
let lastCursor;
for (;;) {
const response = await fetch(origin + "/api/v2/open/etf/bars?" + params, {
headers: { Authorization: "Bearer " + token },
signal: AbortSignal.timeout(35000)
});
const body = await response.json();
if (!response.ok || body.code !== 0) {
throw new Error(JSON.stringify({
status: response.status, code: body.code, requestId: body.requestId
}));
}
// 替换成按页落盘;不要把全部页面保存在数组里。
console.log(body.data.items.length);
if (!body.data.hasMore) break;
const cursor = body.data.nextCursor;
if (!cursor || cursor === lastCursor) throw new Error("游标未推进");
params.set("cursor", cursor);
lastCursor = cursor;
}
Python 依赖安装:python -m pip install requests。上一节完整分页示例适合验证连通性;需要容错时可使用下面的有限重试函数替换读页动作。网络连接异常由调用方记录断点并决定恢复,不无限重试。
import random
import time
import requests
def read_page(client, url, params, headers):
"""最多 4 次;仅重试只读查询,不用于注册/Token 轮换。"""
for attempt in range(4):
response = client.get(url, params=params, headers=headers,
timeout=(5, 35))
try:
body = response.json()
except ValueError:
body = {}
if response.ok and body.get("code") == 0:
return body["data"]
code = body.get("code")
# 429 可能是 24h 配额耗尽;交给调用方查看额度头后决定何时恢复。
if response.status_code == 429:
raise RuntimeError("检查 X-RateLimit-* / X-ByteQuota-*,不要立即重试")
if code not in (50311, 50312) or attempt == 3:
raise RuntimeError({
"status": response.status_code,
"code": code, "requestId": body.get("requestId")
})
time.sleep(min(8, 2 ** attempt) + random.random())
raise RuntimeError("重试次数已耗尽")
HTTP 429 不一定是瞬间请求太快,可能是 24 小时额度不足;盲目每秒重试只会增加拒绝与日志。参数错误、权限错误、游标错误不会因为重试同一请求自行恢复。注册、审批、删除、Token 轮换等写操作不要套用只读重试逻辑。
12 / 推荐的批量研究工作流
- 先查目录和 Schema,确认版本、周期、字段和时间范围。覆盖范围是 Manifest 事实,不保证每只 ETF 每个时间点都有值。
- 小规模接入用单代码 bars API;大批量训练优先将公开 Parquet 下载到本地离线研究,不要用数千次预览请求搬运完整归档。
- 按代码与有限时间窗口串行游标读取。每页成功落盘后,再保存“版本、代码、周期、起止、adjust、nextCursor”断点。对超出跨度限制的任务拆分时间窗口,处理闭区间边界去重。
- 原始行情保留一份;本地复权结果单独保存并记录公式、基准日期/因子和工具版本。不要覆盖原始数据,不要将已复权价格再次乘因子。
- 处理缺失因子、缺失行情、同代码多种资料表示和存续期;再基于一致价格口径计算相邻收益率。单位未核验前不要计算换手率、成交量加权价或规模指标。
- 建立样本内/外划分与数据可得时点约束。固定数据版本有助于复现,但不能消除幸存者偏差和未来函数。
尤其注意:API 前复权使用完整请求区间的末条记录为基准。分别查询不同窗口得到的 qfq 结果不一定能直接拼接;跨窗口研究可取原始数据,在客户端用统一基准重算。若基准行因子缺失,不能悄悄改用更早日期而不记录口径。
API 与 Viewer 不是同一个排序契约:API 按代码内时间推进;Viewer 用文件/物理行位置浏览原始数据,不应把 Viewer 当前顺序视为研究时序。研究前自行按代码和时间排序并检查重复值。
13 / 阅读器详细操作
| 来源 | 操作步骤 | 网络 / 权限 |
|---|---|---|
| 本地 | 本地标签 → 选择或拖入 Parquet → 读取 Schema → 配置字段 → 保存并浏览 | 文件由浏览器本地读取,不上传;刷新后通常需重新选择文件 |
| URL | 粘贴单个 HTTP(S) Parquet 地址 → 读取 Schema → 确认字段 | 目标需允许跨域和 Range;不能使用需要自定义 Authorization 的私有对象接口 |
| R2 | 使用公开 R2 自定义域名对象 URL | R2 不是独立认证协议;不在浏览器输入 S3 secret/access key |
| 清单 | 读取清单与 Schema → 选择周期和年份分区 → 打开所选分区 | 清单阶段不预先下载所有 Parquet;缩小到所需年份 |
| 后台文件链接 | 数据资产页点击具体文件的浏览文件 | 预填该文件 URL,仍需确认字段 |
字段、筛选与分页
字段配置可选择显示列、修改显示名称、调整顺序/宽度和格式(自动、文本、数值、日期、日期时间、JSON)。改名只影响本地展示与 CSV 列头,不改变 Parquet,也不改变 API 字段名。至少保留一列;隐藏不需要的列可减少列式读取工作。
筛选器支持等于、不等于、比较、包含、前缀、为空/非空。多个条件按 AND 组合;字符串条件不是正则表达式。按“应用并查询”生效,修改条件后回到新查询的起点;参数通过 prepared parameters 绑定,而不是把用户输入直接拼进 SQL。
表格只渲染可见行。下一页是游标查询,不是深度 OFFSET;当前缓存最多 5 页、16 MiB,旧页会被逐出。缓存页不是整份数据,不能用当前行数推断文件总量。首次启动需加载 DuckDB Worker/WASM,大文件首次解析可能比后续页慢。
CSV 导出
支持当前页、已缓存页和最多 10,000 行筛选结果。缓存导出只覆盖当时仍在缓存中的页,不是所有曾经浏览过的数据。列顺序、列头和显示格式随本地设置;null 导出为空单元格,文件带 UTF-8 BOM,便于常见表格软件识别中文。
以 =、+、-、@ 开头的导出文本会添加单引号防止电子表格公式执行;负数字符串也可能因此成为文本。CSV 是展示结果导出,不是无损数值存档。需要严格类型/精度时使用原始 Parquet 或 API,不要从 CSV 反推原始浮点数。
偏好、隐私和资源占用
偏好按数据源保存在浏览器 localStorage;小型 Cookie 保存当前偏好,过大时只保存指针。它不是云端同步;清理站点数据或使用隐身窗口会失去配置。不要在 URL 中放长期私钥;带签名参数的临时链接可能暴露于地址栏、浏览器历史或本地偏好中。
“只读”表示不会修改源文件,不意味着任意查询都只下载少量字节。Range 可以避免整文件回退,但筛选/投影如果需要访问大量 Row Group,累计传输仍可能接近整文件。不要同时打开很多大文件标签页;长期高负载研究应转本地 DuckDB/API。
14 / 管理员使用指南
管理员身份由平台运营方授予,普通注册不自动变成管理员。使用管理员登录态进入后台;Open API etf:read 不授予后台写权限。
- 数据资产:查看固定 v2026-07-31-r2 的完成标记、文件数和 Schema;通过“浏览文件”只读核验。平台不提供用户切换训练版本功能。
- 申请审核:核对研究用途与最小 Scope,再设置额度、有效期和审批结果。不要为普通量化用户分配 admin:* 或系统运维 Token。
- Token/用户:处理异常用量、泄露、禁用与轮换。确认操作对象,记录 requestId/审计事件;禁止把明文 Token 发到公告或工单。
- 用量与审计:对照接口、状态码和时间范围识别大范围扫描、重复重试、额度不足;对公开业务给出明确限制,不通过无限放大资源掩盖慢查询。
- 通知:批量邮件会真实发送,正式调度前先确认发信域名、目标名单与退订规则;测试时只用指定测试邮箱或隔离收件器。
本地验收环境会模拟邮件供应商,但生产收件成功、HTTPS、域名 CORS、备份恢复和服务器容量需要独立验收。页面能打开并不等于可以直接上线。
15 / 常见问题与安全边界
| 现象 / 业务码 | 通常原因 | 建议操作 |
|---|---|---|
| 401 / 40101 | Token 缺失、会话过期、旧 Token 被轮换 | API 带 Bearer;门户重新登录;核对脚本密钥 |
| 403 / 40301 | Scope、账号角色或来源校验不通过 | 不要用 Cookie 当 API Token;通过门户申请最小权限 |
| 40010 / 40011 | 周期或时间格式/范围错误 | 使用六种周期和上海本地时间,核对 start ≤ end |
| 40012 / 40014 | 跨度、文件数或候选扫描字节超预算 | 缩小时间段;不能只减小 limit 来解决候选扫描过大 |
| 40013 | 游标被修改,或与当前查询条件不同 | 清除 cursor 从第一页开始;保持 adjust/代码/区间一致 |
| 429 / 42901 | 请求/字节额度耗尽或注册防滥用限制 | 看额度响应头与门户;等待恢复或申请提升,不循环重试 |
| 50310 | 本地归档缺文件/校验失败/尚未就绪 | 管理员检查 Manifest、完成标记、只读挂载和 readiness |
| 50311 / 50312 | 查询繁忙 / 超时 | 减小范围、降低并发,有限退避后重试 |
| HTTP/R2 无法打开 | CORS、Range 或临时链接失效 | 分别检查 Manifest/Schema/对象 URL;确保正确 Origin 被放行 |
| 复制代码失败 | 浏览器未授予剪贴板权限或非安全上下文 | localhost/HTTPS 下重试,或手动选择代码 |
| 前复权价格变化 | 查询截止日期或基准因子改变 | 保存并比较 adjustmentAnchorTime/Factor;跨窗口统一基准 |
反馈问题时提供:操作步骤、页面/接口路径、查询参数(去掉密钥)、发生时间、HTTP 状态、业务 code、requestId、周期和版本。不要发送 Authorization、Cookie、TOTP secret、完整验证码邮件或带签名参数的私有 URL。
R2 配置应放行实际站点 Origin(localhost 和 127.0.0.1 是不同 Origin),GET/HEAD 和 Range 请求头,并暴露 Content-Range、Content-Length、ETag。浏览器跨域配置与 API 的 Token 权限是两层独立机制。生产使用 HTTPS 和安全 Cookie,不把本地演示密钥带上线。
本手册依据当前实现,不保证数据授权可用于任意再分发或商业交易用途。阅读 用户协议 后使用;价格复权不是交易可执行价,也不构成投资建议。