外观
数据接口 API
用户端 HTTP 接口说明:使用请求头
x-api-key鉴权,覆盖基金行情与自动交易相关端点;
| 属性 | 说明 |
|---|---|
| 适用范围 | 本地开发ETF策略,对接第三方平台等,仅限VIP会员用户使用 |
| 典型场景 | ETF,LOF基金行情拉取、获取策略信息、获取策略最新交易信号 |
| 文档版本 | V1.0 |
1. 概述
本文档包含 19 个 HTTP 接口,分为「基金行情」「自动化交易」「策略回测」「策略管理」四类。
2. 环境与基础 URL
基础URL: https://www.cifangquant.com/api
请求约定
- 传输编码:UTF-8
- 日期 Query:
YYYY-MM-DD - JSON Body:
Content-Type: application/json
3. 认证
3.1 API Key
| 项 | 规范 |
|---|---|
| 请求头 | x-api-key: <平台发放的 API Key>(必填) |
3.2 获取 API Key
- 登录 次方量化(接口仅限 VIP 会员使用,开通与升级见 会员定价)。
- 打开 API Key 管理页,点击创建,生成并复制你的 API Key。
- 之后每次请求在请求头中携带
x-api-key: <你的 API Key>。
注意
- API Key 等同于账号凭证,请妥善保管,不要提交到代码仓库、公开分享或写进前端代码。
- Key 泄露或失效(接口返回
401)时,回到上述页面重新生成,并替换调用方的旧 Key。
3.3 认证失败
| HTTP 状态码 | 说明 |
|---|---|
| 401 Unauthorized | Key 无效或未提供 |
示例(401)
http
HTTP/1.1 401 Unauthorized
WWW-Authenticate: ApiKey
Content-Type: application/json
{"detail":"无效的API Key或Secret"}4. 统一响应体
| 字段 | 类型 | 说明 |
|---|---|---|
code | integer | 业务码;0 表示成功 |
message | string | 人类可读提示 |
data | object | array | null | 业务载荷;失败时可为 null |
成功示例
json
{
"code": 0,
"message": "ok",
"data": {}
}5. 接口索引
| 序号 | 方法 | 路径 | 摘要 |
|---|---|---|---|
| 1 | GET | /api/fund/list | 基金列表 |
| 2 | GET | /api/fund/hist_em | 基金历史日线行情(多代码、复权) |
| 3 | GET | /api/fund/hist_min | 基金历史分钟线行情(仅 SVIP) |
| 4 | GET | /api/fund/hist_intraday | 基金每日固定时点累计行情(仅 SVIP) |
| 5 | GET | /api/fund/spot | 基金实时行情快照(含买卖五档) |
| 6 | GET | /api/fund/exchange_rank | 场内基金收益排行 |
| 7 | GET | /api/trading/list | 自动交易策略列表 |
| 8 | GET | /api/trading/get_strategy_signal | 指定策略当日信号 |
| 9 | POST | /api/fund/momentum | 计算 ETF 动量值 |
| 10 | POST | /api/back-test/momentum | 提交动量轮动策略回测 |
| 11 | GET | /api/back-test/status/{task_id} | 查询回测任务状态与结果 |
| 12 | POST | /api/back-test/publish | 发布为实盘模拟策略 |
| 13 | GET | /api/strategy/my-running | 我发布的运行中策略 |
| 14 | GET | /api/strategy/list/rank | 公开策略区间收益排行 |
| 15 | GET | /api/strategy/preview/{strategy_id} | 预览策略参数与绩效 |
| 16 | POST | /api/strategy/copy | 复制公开策略 |
| 17 | POST | /api/strategy/notify | 订阅策略调仓通知 |
| 18 | POST | /api/strategy/{strategy_id}/visibility | 切换策略公开/私有 |
| 19 | POST | /api/strategy/{strategy_id}/stop | 停止实盘模拟策略 |
6. 基金行情 API
模块路径前缀:/api/fund
6.1 获取基金列表
获取基金清单;可选关键词过滤
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/fund/list |
| 鉴权 | x-api-key |
Query 参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
key_word | string | 否 | 基金代码或名称;省略时由返回全量 |
响应
data:object[],基金信息列表, 每项为一只基金的基础信息;字段结构如下。
data[] 单条记录字段
| 字段 | 类型 | 说明 |
|---|---|---|
fund_code | string | 基金代码 |
fund_name | string | 基金名称 |
fund_type | string | 基金类型(如指数型-股票) |
fund_market | string | 上市市场代码(如 SH、SZ) |
establish_date | string | 成立日期,YYYY-MM-DD |
float_shares | number | 流通份额,单位:份(如 1.5e9 表示 15 亿份);无数据时为 0 或 null |
data 示例
json
[
{
"fund_code": "159107",
"fund_name": "创业板软件ETF富国",
"fund_type": "指数型-股票",
"fund_market": "SZ",
"establish_date": "2025-09-09",
"float_shares": 1500000000
}
]请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" \
"https://<host>/api/fund/list?key_word=510300"6.2 获取基金历史日线行情
批量查询基金历史日线(日 K)行情数据,每行为一个交易日的开高低收,支持复权选项。如需分钟级数据,请使用 6.3 历史分钟线。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/fund/hist_em |
| 鉴权 | x-api-key |
Query 参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
symbol | string | 是 | 基金代码;多个以英文逗号 , 分隔,最多支持同时查询50支基金 |
start_date | date | 是 | 开始日期 YYYY-MM-DD;可回溯年限按会员等级限制:VIP 最早 2018-01-01,SVIP 最早 2015-01-01,早于下限返回 400 |
end_date | date | 是 | 结束日期 YYYY-MM-DD |
adjust | string | 否,默认 none | 复权:none | qfq | hfq |
响应
data:对象;键为请求参数symbol按逗号拆分后的基金代码,值为该标的在start_date~end_date区间内的日线行情(按交易日升序)。
行数据格式(data[基金代码][i] 为长度 9 的数组)
| 下标 | 类型 | 字段含义 |
|---|---|---|
0 | string | 交易日期,YYYY-MM-DD |
1 | number | 开盘价 |
2 | number | 收盘价 |
3 | number | 最高价 |
4 | number | 最低价 |
5 | number | 涨跌幅(百分比数值,如 7.02 表示约 7.02%) |
6 | number | 成交量 |
7 | number | 成交额(元) |
8 | number | null | IOPV(基金净值估算,与价格同一复权口径),无数据时为 null |
data 示例(节选两只标的、各两个交易日)
json
{
"161226": [
["2026-04-01", 2.798, 2.929, 2.978, 2.76, 7.02, 4064275, 11532680, 2.921],
["2026-04-02", 2.771, 2.796, 2.838, 2.724, -4.54, 3790675, 10493220, 2.803]
],
"518880": [
["2026-04-01", 9.95, 10.024, 10.028, 9.912, 3.35, 8356708, 83250310, 10.011],
["2026-04-02", 10, 9.738, 10, 9.641, -2.85, 13026467, 128300750, null]
]
}请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" \
"https://<host>/api/fund/hist_em?symbol=510300,510500&start_date=2024-01-01&end_date=2024-12-31&adjust=qfq"6.3 获取基金历史分钟线行情
批量查询基金历史 1 分钟 K 线,参数和响应与 6.2 基本一致,区别是时间区间精确到时分秒,每行为一根分钟线。
仅限 SVIP 会员:非 SVIP 账号调用会返回
403。开通或升级 SVIP:https://www.cifangquant.com/pricing
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/fund/hist_min |
| 鉴权 | x-api-key,且仅限 SVIP 会员 |
Query 参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
symbol | string | 是 | 基金代码;多个以英文逗号 , 分隔,最多 10 支 |
start_time | datetime | 是 | 开始时间 YYYY-MM-DD HH:MM:SS(含);SVIP 可回溯最早 2015-01-01,早于下限返回 400 |
end_time | datetime | 是 | 结束时间 YYYY-MM-DD HH:MM:SS(含);不得早于 start_time,与 start_time 的日期跨度最多 31 天(含首尾) |
adjust | string | 否,默认 none | 复权:none | qfq | hfq |
说明
- 分钟线的时间戳为该分钟的起始时刻,例如
09:30:00表示 09:30~09:31 这一分钟;start_time、end_time按此时间戳比较,两端均包含。 - 价格默认不复权;
hfq为后复权价,qfq为前复权价(以该基金最新价为基准),复权因子与 6.2 同源。开高低收都会复权,成交量不变。 - 涨跌幅为该分钟收盘价相对前一交易日收盘价的涨跌幅(百分比),不随复权参数变化。
- 区间内没有行情的日期(非交易日、停牌)没有数据;无数据的代码对应空数组。
响应
data:对象;键为请求参数symbol按逗号拆分后的基金代码,值为该标的在区间内的分钟线(按时间升序)。
行数据格式(data[基金代码][i] 为长度 9 的数组)
| 下标 | 类型 | 字段含义 |
|---|---|---|
0 | string | 分钟起始时间,YYYY-MM-DD HH:MM:SS |
1 | number | 开盘价 |
2 | number | 收盘价 |
3 | number | 最高价 |
4 | number | 最低价 |
5 | number | 涨跌幅(百分比数值,如 1.25 表示约 1.25%) |
6 | number | 该分钟成交量 |
7 | number | 该分钟成交额(元) |
8 | number | null | 该分钟 IOPV(基金净值估算,与价格同一复权口径),无数据时为 null |
data 示例(节选两根分钟线)
json
{
"510300": [
["2026-04-01 09:30:00", 4.012, 4.015, 4.018, 4.01, 0.07, 1523400, 6115820, 4.0132],
["2026-04-01 09:31:00", 4.015, 4.02, 4.021, 4.014, 0.2, 986200, 3964410, null]
]
}错误
| 状态码 | 场景 |
|---|---|
403 | 当前账号不是 SVIP 会员(含 VIP 未升级、会员已过期),响应 detail 中附有开通链接 |
400 | start_time 晚于 end_time、日期跨度超过 31 天、symbol 为空或超过 10 支 |
422 | 缺少必填参数、时间格式无效或 adjust 取值不合法 |
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" -G "https://<host>/api/fund/hist_min" \
--data-urlencode "symbol=510300,510500" \
--data-urlencode "start_time=2026-04-01 09:30:00" \
--data-urlencode "end_time=2026-04-01 15:00:00" \
--data-urlencode "adjust=none"6.4 获取基金每日固定时点累计行情
对 start_date~end_date 范围内每一个交易日,从开盘到time时间点的累计日 K 行情,返回逐日序列。适合横向对比「每天某个固定时点」的价位,例如每天 14:00 的价位。
仅限 SVIP 会员:非 SVIP 账号调用会返回
403。开通或升级 SVIP:https://www.cifangquant.com/pricing
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/fund/hist_intraday |
| 鉴权 | x-api-key,且仅限 SVIP 会员 |
Query 参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
symbol | string | 是 | 基金代码;多个以英文逗号 , 分隔,最多 50 支 |
start_date | date | 是 | 开始日期 YYYY-MM-DD;SVIP 可回溯最早 2015-01-01,早于下限返回 400 |
end_date | date | 是 | 结束日期 YYYY-MM-DD,不得早于 start_date;与 start_date 的区间最多 366 天(含首尾) |
adjust | string | 否,默认 none | 复权:none | qfq | hfq |
time | string | 是 | 截止时间点 HH:MM,如 14:00 表示开盘截止到14:00 时刻行情 |
响应
data:对象;键为请求参数symbol按逗号拆分后的基金代码,值为按交易日升序的累计日线;无数据的代码对应空数组。
行数据格式(data[基金代码][i] 为长度 8 的数组,前 7 列与 6.2 一致,第 8 列为 IOPV,不含成交额)
| 下标 | 类型 | 字段含义 |
|---|---|---|
0 | string | 交易日期,YYYY-MM-DD |
1 | number | 开盘价 |
2 | number | 收盘价(time时刻的价格) |
3 | number | 最高价(截止到time时刻) |
4 | number | 最低价(截止到time时刻) |
5 | number | 涨跌幅(百分比数值,如 1.25 表示约 1.25%) |
6 | number | 累计成交量(截止到time时刻) |
7 | number | null | IOPV(基金净值估算,与价格同一复权口径),无数据时为 null |
data 示例(time=14:00,节选两个交易日)
json
{
"510300": [
["2026-04-01", 4.012, 4.056, 4.061, 4.008, 1.02, 18234500, 4.0552],
["2026-04-02", 4.05, 4.031, 4.066, 4.024, -0.62, 15120300, null]
]
}错误
| 状态码 | 场景 |
|---|---|
403 | 当前账号不是 SVIP 会员(含 VIP 未升级、会员已过期),响应 detail 中附有开通链接 |
400 | time 格式不是 HH:MM(带秒会报错)、start_date 晚于 end_date、区间超过 366 天、symbol 为空或超过 50 支 |
422 | 缺少必填参数、日期格式无效或 adjust 取值不合法 |
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" \
"https://<host>/api/fund/hist_intraday?symbol=510300,510500&start_date=2026-04-01&end_date=2026-04-30&time=14:00&adjust=qfq"6.5 获取基金实时行情
获取场内基金实时行情快照,包含最新价、开高低收、涨跌停价、IOPV 和买卖五档。盘中为实时价,盘后为最近一次收盘价。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/fund/spot |
| 鉴权 | x-api-key |
Query 参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
symbol | string | 是 | 基金代码;多个以英文逗号 , 分隔,最多 50 支;不支持不传返回全量 |
响应
data:对象;键为基金代码,值为该基金的实时行情快照。- 没有行情数据的代码不会出现在
data中,请以返回的键判断哪些代码有数据。
data[基金代码] 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
code | string | 基金代码 |
trade_time | string | 最新行情对应的交易时间 |
updated_at | string | 数据更新时间 |
trading_phase_code | string | 交易阶段代码 |
pre_close | number | 昨收价 |
last | number | 最新价 |
open | number | 开盘价 |
high | number | 最高价 |
low | number | 最低价 |
close | number | 收盘价 |
volume | number | 成交量 |
amount | number | 成交额 |
num_trades | number | 成交笔数 |
high_limited | number | 涨停价 |
low_limited | number | 跌停价 |
iopv | number | null | IOPV(ETF 净值估算),无数据时为 null |
bid_price1 ~ bid_price5 | number | null | 买一到买五价格,无数据时为 null |
bid_volume1 ~ bid_volume5 | number | null | 买一到买五数量,无数据时为 null |
ask_price1 ~ ask_price5 | number | null | 卖一到卖五价格,无数据时为 null |
ask_volume1 ~ ask_volume5 | number | null | 卖一到卖五数量,无数据时为 null |
快照不直接提供涨跌幅,可用
(last - pre_close) / pre_close自行计算。
data 示例(买卖五档已节选)
json
{
"510300": {
"code": "510300",
"trade_time": "2026-04-23T13:32:33",
"updated_at": "2026-04-23T13:32:34",
"trading_phase_code": "T",
"pre_close": 4.012,
"last": 4.056,
"open": 4.02,
"high": 4.061,
"low": 4.008,
"close": 4.056,
"volume": 18234500,
"amount": 73985000.5,
"num_trades": 5210,
"high_limited": 4.413,
"low_limited": 3.611,
"iopv": 4.0552,
"bid_price1": 4.055,
"bid_volume1": 120000,
"ask_price1": 4.056,
"ask_volume1": 98000
}
}请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" \
"https://<host>/api/fund/spot?symbol=510300,159915"6.6 获取场内基金排行
获取场内基金收益率排行榜,支持按不同区间收益字段排序。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/fund/exchange_rank |
| 鉴权 | x-api-key |
Query 参数
| 名称 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
sort_by | string | 否 | 1yzf | 排序字段:zzf(近1周)、1yzf(近1月)、3yzf(近3月)、6yzf(近6月)、1nzf(近1年)、2nzf(近2年)、3nzf(近3年)、jnzf(今年来)、lnzf(成立以来) |
sort_order | string | 否 | desc | 排序方向:desc(降序)或 asc(升序) |
limit | integer | 否 | 30000 | 返回数量上限 |
响应
data:object[],排行结果列表。
data[] 单条记录字段
| 字段 | 类型 | 说明 |
|---|---|---|
rank | integer | 排名 |
fund_code | string | 基金代码 |
fund_name | string | 基金名称 |
fund_type | string | 基金类型 |
date | string | 净值日期,YYYY-MM-DD |
unit_nav | number | 单位净值 |
accumulated_nav | number | 累计净值 |
week_1 | number | 近1周收益率 |
month_1 | number | 近1月收益率 |
month_3 | number | 近3月收益率 |
month_6 | number | 近6月收益率 |
year_1 | number | 近1年收益率 |
year_2 | number | 近2年收益率 |
year_3 | number | 近3年收益率 |
ytd | number | 今年来收益率 |
since_inception | number | 成立以来收益率 |
inception_date | string | 成立日期,YYYY-MM-DD |
data 示例
json
[
{
"rank": 1,
"fund_code": "515880",
"fund_name": "通信ETF国泰",
"fund_type": "指数型-股票",
"date": "2026-04-22",
"unit_nav": 1.4105,
"accumulated_nav": 4.2315,
"week_1": 15.52,
"month_1": 30.87,
"month_3": 33.43,
"month_6": 58.25,
"year_1": 270.6,
"year_2": 282.98,
"year_3": 279.1,
"ytd": 37.28,
"since_inception": 323.19,
"inception_date": "2019-08-16"
}
]请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" \
"https://<host>/api/fund/exchange_rank?sort_by=1yzf&sort_order=desc&limit=100"6.7 计算 ETF 动量值
对一组 ETF 计算指定算法与周期的动量值,用于比较标的强弱。动量值越大越强。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | POST /api/fund/momentum |
| 鉴权 | x-api-key |
Body 参数(application/json)
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
momentum_calculation_type | string | 是 | 动量算法,取值见下表 |
etf_pool | string[] | 是 | ETF 代码列表,最多 50 个 |
momentum_period | integer | 否 | 动量周期(天数),默认 20 |
time | string | 否 | 分时版动量的取价时间点 HH:MM:SS,默认 15:00:00;收盘价版算法忽略 |
end_date | date | 否 | 计算基准日期 YYYY-MM-DD,默认今天 |
end_time | string | 否 | end_date 当天自己取价的时刻,不传则沿用 time |
momentum_calculation_type 取值
| 值 | 说明 |
|---|---|
simple | 简单动量(分时版) |
slope | 线性回归斜率(分时版) |
weighted_slope | 加权斜率(分时版) |
weighted_slope_v2 | 加权斜率 V2(分时版) |
simple_close | 简单动量(收盘价版) |
slope_close | 线性回归斜率(收盘价版) |
weighted_slope_close | 加权斜率(收盘价版) |
weighted_slope_close_v2 | 加权斜率 V2(收盘价版) |
rsrs | RSRS 动量 |
响应
data:object[],每项为一只 ETF 的动量结果;在基准日期无行情的代码不会出现。
| 字段 | 类型 | 说明 |
|---|---|---|
etf_code | string | ETF 代码 |
etf_name | string | ETF 名称 |
momentum_value | number | null | 动量值;该日期无数据时为 null |
calculation_series | object | null | 动量计算实际用到的日期价格序列,便于复核 |
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-X POST "https://<host>/api/fund/momentum" \
-d '{"momentum_calculation_type":"simple_close","momentum_period":20,"etf_pool":["510300","159915"]}'7. 策略 API
模块路径前缀:/api/trading
7.1 获取自动化交易策略列表
自动化交易策略需要在平台个人中心-> 自动化交易页面中创建,(必须先开通自动化交易服务)

| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/trading/list |
| 鉴权 | x-api-key |
Query 参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
account | string | 否 | 按资金账号筛选 |
响应
ResponseSchemadata:StrategyInfoForAutoTrading[]
StrategyInfoForAutoTrading 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
id | integer | ID |
strategy_name | string | 策略名称 |
strategy_description | string | 策略描述 |
execute_time | string | 执行时间,格式 HH:mm:ss |
trading_relation_id | integer | 关联的策略ID |
holding_etfs | HoldingETF[] | 当前持仓ETF列表 |
HoldingETF 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
code | integer | ETF代码 |
amount | integer | 持仓数量 |
data 示例
json
[
{
"id": 11040,
"strategy_name": "策略名称",
"strategy_description": "策略描述",
"execute_time": "10:30:00",
"trading_relation_id": 11039,
"holding_etfs": [
{
"code": 510300,
"amount": 1000,
}
]
}
]7.2 获取指定自动化交易当日信号
获取单个策略的当日信号
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/trading/get_strategy_signal |
| 鉴权 | x-api-key |
Query 参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
strategy_id | integer | 是 | 自动化交易 ID,即/api/trading/list接口中返回的数据项的id |
响应
ResponseSchemadata:单个TradingSignalResponse
TradingSignalResponse 字段说明
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
strategy_id | integer | 是 | 自动化交易 ID。 |
buy_stocks | SignalStock[] | 是 | 需要买入的股票列表;无买入信号时为空数组 []。 |
sell_stocks | SignalStock[] | 是 | 需要卖出的股票列表;无卖出信号时为空数组 []。 |
signal_date | string | null | 否 | 信号产生时间,未生成时可能为 null。 |
execution_date | string | null | 否 | 执行时间,未生成时可能为 null。 |
SignalStock 字段说明
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
etf_code | string | null | 否 | ETF 代码 |
etf_name | string | null | 否 | ETF 名称 |
price | number | string | null | 否 | 交易价格 |
quantity | integer | null | 否 | 交易数量 |
action | string | null | 否 | 交易方向 |
data 示例
json
{
"strategy_id": 11040,
"buy_stocks": [],
"sell_stocks": [],
"signal_date": "2026-04-19 10:30:00",
"execution_date": "2026-04-19 10:30:00"
}行为说明
- 策略未运行、关联策略异常或当日信号尚未生成时,可能返回空买卖列表。
- 只有在交易日的执行时间点之后,才能获取到当日的交易信号,且交易信号生成有延迟,所以该接口需要在执行时间点之后进行轮训查询直到获取到信号。
- 信号未生成且未超过服务端重试次数时,
message为「今日信号未生成」
8. 策略回测 API
模块路径前缀:/api/back-test
回测与发布接口目前仅支持动量轮动策略;资产配置、定投、网格等其他策略类型请前往平台网页操作。回测与实盘模拟均为模拟盘,不涉及真实资金。
8.1 提交动量轮动策略回测
异步任务:提交后返回 task_id,再通过 8.2 轮询结果。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | POST /api/back-test/momentum |
| 鉴权 | x-api-key |
Body 参数(application/json,均可选;不传取默认值)
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
start_date | date | 2024-01-01 | 回测开始日期 |
end_date | date | 今天 | 回测结束日期 |
initial_capital | number | 100000 | 初始资金(元) |
etf_pool | string[] | 平台默认 | ETF 代码列表,最多 50 个 |
momentum_calculation_type | string | simple | 动量算法,取值同 6.7 |
momentum_config_groups | object[] | null | 多组动量参数(每组含算法/周期/上下阈值);不传则用上面的单一动量参数 |
momentum_period | integer | 20 | 动量周期(天数) |
momentum_threshold | number | 0.01 | 动量下限阈值,低于此值空仓 |
momentum_upper_threshold | number | 0 | 动量上限阈值,0 表示不限 |
top_n | integer | 1 | 每期持有动量排名前 N 的 ETF |
exclude_today | boolean | false | true 时动量计算不纳入当日实时价格,仅用收盘价 |
fallback_etf | string | null | 无信号时买入的备选 ETF,null 则空仓 |
min_hold_days | integer | 8 | 最小持有天数 |
days_count_type | string | calendar_days | calendar_days(自然日)| trading_days(交易日) |
execute_time | string | 14:30:00 | 每日执行时间:09:30:00 | 10:30:00 | 14:30:00 | 14:50:00 | 15:00:00 |
reserve_cash_hold_max | boolean | false | true:买入时按最大持仓分配资金;false:按当日实际买入分配 |
commission | number | 0 | 手续费率,如 0.0001 = 万一。接口默认 0,建议显式传值 |
slippage | number | 0 | 滑点率,如 0.0005 = 0.05%。接口默认 0,建议显式传值 |
take_profit_enabled | boolean | false | 是否启用收益率止盈 |
take_profit_threshold | number | — | 止盈阈值(启用时必填,如 0.18 = 18%) |
take_profit_cooldown_days | integer | — | 止盈 / sell_conditions 触发卖出后的共用冷却天数,二者任一启用时必填 |
sell_conditions | object[] | null | 卖出条件列表(OR 关系),见下方说明 |
stop_loss_enabled | boolean | false | 是否启用止损 |
stop_loss_threshold | number | 0.08 | 止损阈值(如 0.08 = 下跌 8%) |
stop_loss_methods | string[] | ["percentage"] | 止损方式(可多选):percentage(跌幅)| drawdown(高点回撤) |
drawdown_stop_threshold | number | 0.05 | 高点回撤止损阈值 |
stop_loss_freeze_days | integer | 0 | 止损后冷却天数 |
market_timing_code | string | null | 大盘择时 ETF 代码(如 510300),不满足条件时空仓 |
extreme_filter_conditions | string[] | null | 极端行情过滤,目前支持 one_day_limit_down(跌停过滤) |
condition_filter_config | object[] | null | 动量条件过滤(AND 关系),每项含 type(close_above_ma | ma_golden_cross)及对应均线周期参数 |
sell_conditions 说明:满足任一条即卖出(OR 关系),需先满足 min_hold_days 才会被检查(止损不受此限制);触发后的冷却天数复用 take_profit_cooldown_days。每项 type 取值:
type | 附加字段 | 说明 |
|---|---|---|
ma | days:均线天数,默认 5 | 当前价格跌破 days 日均线(含当天价格)时卖出 |
value | filter_index:动量组下标(从 0 起);op:gt | lt;value:阈值 | 持仓的动量值大于 / 小于阈值时卖出,如 0.3 = 30% |
响应
| 字段 | 类型 | 说明 |
|---|---|---|
task_id | string | 回测任务 ID |
status | string | 初始为 PENDING |
message | string | 提示信息 |
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-X POST "https://<host>/api/back-test/momentum" \
-d '{
"start_date": "2020-01-01",
"end_date": "2024-12-31",
"initial_capital": 100000,
"momentum_calculation_type": "weighted_slope_close",
"momentum_period": 20,
"momentum_threshold": 0.01,
"top_n": 1,
"etf_pool": ["510300", "159915", "512880", "515880", "518880"],
"commission": 0.0001,
"slippage": 0.0005
}'8.2 查询回测任务状态与结果
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/back-test/status/{task_id} |
| 鉴权 | x-api-key |
Path 参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
task_id | string | 是 | 8.1 返回的任务 ID |
响应
建议每 3~5 秒轮询一次。status 流转:PENDING → STARTED → RUNNING(附带 progress,0–100)→ SUCCESS / FAILURE。SUCCESS 时读取 result:
| 字段 | 类型 | 说明 |
|---|---|---|
performance.total_return | string | 区间总收益率 |
performance.annualized_return | string | 年化收益率 |
performance.volatility | string | 波动率 |
performance.sharpe_ratio | string | 夏普比率 |
performance.calmar_ratio | string | 卡玛比率(年化收益 / 最大回撤) |
performance.max_drawdown | string | 最大回撤(负值) |
performance.win_rate | string | 胜率 |
performance.profit_loss_ratio | string | 盈亏比 |
performance.total_trades | integer | 交易次数 |
performance.max_drawdown_detail | object | 最大回撤区间:start / end / recovery |
chart[] | object[] | 每日累计收益率序列:date、value(百分比,0.52 = +0.52%) |
trades[] | object[] | 逐笔交易:date、action(buy | sell)、etf_code、etf_name、price、quantity、amount、remaining_cash |
data 示例(SUCCESS,节选)
json
{
"status": "SUCCESS",
"result": {
"performance": {
"total_return": "158.32%",
"annualized_return": "23.45%",
"sharpe_ratio": "1.28",
"max_drawdown": "-12.03%",
"win_rate": "62.50%",
"total_trades": 48
},
"chart": [{ "date": "2024-01-02", "value": 0.0 }],
"trades": [
{ "date": "2024-01-15", "action": "buy", "etf_code": "510300", "etf_name": "沪深300ETF",
"price": 3.85, "quantity": 10000, "amount": 38500.0, "remaining_cash": 61500.0 }
]
}
}请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" \
"https://<host>/api/back-test/status/abc123"8.3 发布为实盘模拟策略
把一套回测参数保存为策略并启动实盘模拟。会同步完成「保存策略 → 从回测开始日到今日的全量回测 → 写入交易记录与每日收益 → 更新绩效」,耗时约 5~30 秒,请勿重复提交。受账户实盘模拟策略数量上限限制。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | POST /api/back-test/publish |
| 鉴权 | x-api-key |
Body 参数(application/json)
除下列字段外,其余字段与 8.1 完全一致,应原样带上回测时提交的参数。
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
strategy_name | string | 是 | 策略名称 |
strategy_description | string | 否 | 策略描述 |
is_public | boolean | 否 | 是否公开,默认 false(仅自己可见);公开策略会出现在排行榜中,其他用户可预览与复制 |
republish_strategy_id | integer | 否 | 原地重新发布一个已停止的自有策略(保留同一 strategy_id,旧交易记录被覆盖);该策略必须属于自己且当前不是 RUNNING,否则返回 400。不传则创建新策略 |
响应
| 字段 | 类型 | 说明 |
|---|---|---|
strategy_id | integer | 策略 ID |
strategy_name | string | 策略名称 |
initial_capital | string | 初始资金 |
策略详情页:https://www.cifangquant.com/strategy/{strategy_id}。
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-X POST "https://<host>/api/back-test/publish" \
-d '{
"start_date": "2020-01-01",
"end_date": "2024-12-31",
"initial_capital": 100000,
"momentum_calculation_type": "weighted_slope_close",
"momentum_period": 20,
"top_n": 1,
"etf_pool": ["510300", "159915", "512880"],
"strategy_name": "我的动量策略",
"is_public": false
}'9. 策略管理 API
模块路径前缀:/api/strategy
9.1 查询我发布的运行中策略
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/strategy/my-running |
| 鉴权 | x-api-key |
无请求参数。返回当前用户名下 status 为 RUNNING 的策略(通过 /back-test/publish 或 /strategy/copy 发布的都会出现)。
响应
data:object[],每项包含strategy_id、策略名称、参数摘要(strategy_setting)、最新绩效(performance)与当前持仓holding_etfs(code+amount)。字段含义与 9.3 一致。
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" "https://<host>/api/strategy/my-running"9.2 按日期区间查询公开策略收益排行
仅统计公开且 RUNNING 的策略,按区间收益率(区间内最后一个交易日组合市值相对第一个交易日的涨跌幅)降序返回。区间内没有交易数据的策略(刚发布)不会出现。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/strategy/list/rank |
| 鉴权 | x-api-key |
Query 参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
start_date | date | 是 | 统计区间开始日期 YYYY-MM-DD |
end_date | date | 否 | 统计区间结束日期,默认今天 |
top_n | integer | 否 | 返回前 N 名,默认 10,最大 50 |
data[] 单条记录字段
| 字段 | 类型 | 说明 |
|---|---|---|
strategy_id | integer | 策略 ID |
strategy_name / strategy_description | string | 策略名称 / 描述 |
start_date | string | 策略回测开始日期 |
simulation_start_date | string | null | 模拟盘发布日期,尚未发布为模拟盘则为 null |
return_rate | number | 统计区间收益率(%),即排序依据 |
period_start_date / period_end_date | string | 区间内实际有数据的第一 / 最后一个交易日 |
strategy_setting | object | 策略核心参数,结构同 9.3 |
performance | object | 历史绩效摘要,结构同 9.3 |
本接口不返回持仓(
holding_etfs):非本人发布的策略不允许查看持仓。
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" \
"https://<host>/api/strategy/list/rank?start_date=2026-08-01&end_date=2026-09-01&top_n=5"9.3 预览策略参数与绩效
可预览公开策略或自己创建的策略;预览他人的私有策略返回 403。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | GET /api/strategy/preview/{strategy_id} |
| 鉴权 | x-api-key |
Path 参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
strategy_id | integer | 是 | 策略 ID |
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
strategy_id | integer | 策略 ID |
strategy_name / strategy_description | string | 策略名称 / 描述 |
author | string | null | 作者昵称,查自己的策略时为 null |
start_date | string | 策略回测开始日期 |
simulation_start_date | string | null | 模拟盘开始日期,尚未发布为模拟盘则为 null |
strategy_setting | object | 策略核心参数(ETF 池、动量算法、周期、止盈止损等) |
performance | object | 历史绩效摘要(总收益、年化收益、夏普比率、最大回撤、胜率、交易次数) |
holding_etfs | object[] | null | 当前持仓(code + amount),空数组表示空仓;仅查询自己的策略时返回,他人公开策略为 null |
adjustable_fields | string[] | 复制时可覆盖的字段,固定为 ["strategy_name", "initial_capital", "execute_time"] |
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" "https://<host>/api/strategy/preview/123"9.4 复制公开策略
读取来源策略配置 → 全量回测 → 写入交易记录与每日收益 → 更新绩效,生成一条属于自己的新策略。同步阻塞,约 5~30 秒,请勿重复提交;只能复制公开策略,受账户 VIP 策略数量上限限制。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | POST /api/strategy/copy |
| 鉴权 | x-api-key |
Body 参数(application/json)
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
source_strategy_id | integer | 是 | 来源策略 ID |
strategy_name | string | 否 | 新策略名称,不传沿用原名称 |
initial_capital | number | 否 | 初始资金(元),不传沿用原值 |
execute_time | string | 否 | 每日执行时间(09:30:00 | 10:30:00 | 14:30:00 | 14:50:00 | 15:00:00),不传沿用原值 |
响应:返回新策略的 strategy_id(同 8.3)。
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-X POST "https://<host>/api/strategy/copy" \
-d '{"source_strategy_id":123,"strategy_name":"我的动量策略","initial_capital":100000,"execute_time":"14:30:00"}'9.5 订阅策略调仓通知
通知通过微信公众号推送,需先在「次方量化」公众号中完成账号绑定(菜单 → 个人中心 → 绑定账号),并关闭该公众号的「消息免打扰」,配置教程见 微信推送设置。重复订阅返回 400。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | POST /api/strategy/notify |
| 鉴权 | x-api-key |
Body 参数(application/json)
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
strategy_id | integer | 是 | 策略 ID |
notify_type | string | 否 | signal(默认):有调仓信号时推送;daily:每日运行后推送 |
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-X POST "https://<host>/api/strategy/notify" \
-d '{"strategy_id":999,"notify_type":"signal"}'9.6 切换策略公开 / 私有
仅能操作自己创建的策略,操作他人策略返回 404。直接按目标状态传参即可,无需先查询当前状态。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | POST /api/strategy/{strategy_id}/visibility |
| 鉴权 | x-api-key |
Body 参数(application/json)
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
is_public | boolean | 是 | true:设为公开(出现在排行榜,他人可预览 / 复制);false:设为私有(仅自己可见) |
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-X POST "https://<host>/api/strategy/999/visibility" \
-d '{"is_public": true}'9.7 停止实盘模拟策略
仅能操作自己创建的策略,操作他人策略返回 404。
- 停止后状态变为
STOPPED,不再产生新的调仓信号与每日收益;历史交易记录和绩效数据保留,仍可通过 9.3 查看。 - 对已停止的策略再次调用返回
400。 - 没有「原样恢复运行」的接口;如需调参后重新运行,先用 8.1 重新回测,再调用 8.3 并带上
republish_strategy_id。
| 属性 | 值 |
|---|---|
| 方法 / 路径 | POST /api/strategy/{strategy_id}/stop |
| 鉴权 | x-api-key |
无请求体。
请求示例
bash
curl -sS -H "x-api-key: YOUR_API_KEY" -X POST "https://<host>/api/strategy/999/stop"10. 调用频次与限流
次方量化服务器对开放接口做了限流,超出频次的请求会被直接拒绝,不会进入业务处理,响应为 HTTP 429 Too Many Requests。
| 接口 | 统计维度 | 限制 | 允许突发 |
|---|---|---|---|
POST /api/back-test/momentum | 同一 API Key | 20 次 / 分钟(约每 3 秒 1 次) | 5 次 |
GET /api/back-test/status/{task_id} | 同一 IP | 180 次 / 分钟(回测需反复轮询,单独放宽;不同 task_id 共用同一额度) | 30 次 |
| 其余接口 | 同一 IP + 同一接口 | 60 次 / 分钟(约 1 次 / 秒) | 10 次 |
说明
- 「允许突发」指在额度之外短时间内可以多发的请求数,超出后立即返回
429,不会排队等待;长期平均频次仍受上表限制。 - 「同一接口」按路由归一后统计:
/api/strategy/preview/1与/api/strategy/preview/2算同一个接口,不能通过更换路径参数绕过限制。 - 不同接口之间的额度相互独立,例如调用
/api/fund/spot不会占用/api/fund/hist_em的额度。 - 限流只看请求频次,与请求是否成功无关;失败重试同样计入。
- 本文档中的全部接口均受网关限流约束。
使用建议
- 批量拉取行情请使用多代码参数(
symbol=510300,510500,...),不要对每只基金单独发请求。 - 回测任务建议每 3~5 秒轮询一次
status,不要高频死循环。 - 收到
429后请退避重试(如等待 1~5 秒后重试,连续失败时逐步拉长间隔),不要立即重发。 /api/fund/spot盘中数据更新有间隔,高于 1 次 / 秒的轮询不会获得更新的数据,请合理控制频率。