Skip to main content
POST
/
v1
/
quant
/
backtest
Run strategy backtest
curl --request POST \
  --url https://api.reportify.cn/v1/quant/backtest \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "start_date": "2023-12-25",
  "end_date": "2023-12-25",
  "market": "cn",
  "symbols": [
    "<string>"
  ],
  "filter_formula": "<string>",
  "entry_formula": "<string>",
  "exit_formula": "<string>",
  "strategy_code": "<string>",
  "initial_cash": 100000,
  "commission": 0,
  "buy_commission": 0,
  "sell_commission": 0,
  "min_commission_amount": 0,
  "slippage": 0,
  "stop_loss": 0,
  "auto_close": true,
  "signal_factors": {},
  "position_size": 0.2,
  "max_positions": 5,
  "min_volume": 100
}
'
{
  "success": true,
  "initial_cash": 100000,
  "commission": 0,
  "final_cash": 100000,
  "total_return": 0,
  "total_return_pct": 0,
  "max_drawdown": 0,
  "profit_factor": 0,
  "win_rate": 0,
  "total_trades": 0,
  "winning_trades": 0,
  "losing_trades": 0,
  "trades": [],
  "portfolio_value": {},
  "error_msg": "<string>"
}

运行策略回测

执行策略回测,返回绩效指标和交易记录。
POST /v1/quant/backtest
curl -X POST https://api.reportify.cn/v1/quant/backtest \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "start_date": "2024-01-01",
    "end_date": "2025-01-01",
    "market": "cn",
    "symbols": ["000001"],
    "entry_formula": "CROSS(MA(CLOSE, 5), MA(CLOSE, 10))",
    "exit_formula": "CROSS(MA(CLOSE, 10), MA(CLOSE, 5))",
    "initial_cash": 100000,
    "commission": 0.0003,
    "position_size": 0.2,
    "max_positions": 5,
    "min_volume": 100
  }'

请求参数

start_date
string
required
回测开始日期,格式:YYYY-MM-DD
end_date
string
required
回测结束日期,格式:YYYY-MM-DD
market
string
default:"cn"
股票市场:cn(A股), hk(港股), us(美股)
symbols
array
default:"[]"
回测股票代码列表。如果不提供,则默认回测当前所选市场(如A股、美股或港股)。当前市场回测时建议配合 filter_formula 过滤不符合条件的股票。
filter_formula
string
股票池预筛选公式。在执行每日回测逻辑前,系统会先用此公式对当前市场的股票进行过滤,结果大于 0(即为 True)的股票才会保留在当日的可用股票池中,参与后续的行情数据加载和买卖信号计算。通常用于当前市场范围选股时过滤掉 ST 股、停牌股或不符合基本面要求的股票。
entry_formula
string
买入/开仓公式,结果大于 0 时触发买入(如不提供则必须提供 strategy_code)。支持技术指标与基本面因子。
exit_formula
string
卖出/平仓公式,结果大于 0 时触发卖出(可选)
strategy_code
string
自定义回测策略的 Python 源码代码。若提供,将执行自定义策略而非公式策略。注意: 策略代码必须定义一个名为 handle_data(context, datas) 的函数作为回测引擎的入口点。
initial_cash
number
default:"100000"
初始资金(元)
commission
number
default:"0"
佣金费率,买卖通用(如 0.0003 表示万三)。若同时设置 buy_commission / sell_commission,则以后者为准
buy_commission
number
default:"0"
买入手续费率,优先于 commission(如 0.0003 表示万三)
sell_commission
number
default:"0"
卖出手续费率,优先于 commission(如 0.0013 表示万三佣金 + 千一印花税)
min_commission_amount
number
default:"0"
单笔最低手续费金额(元),如 5.0 表示每笔至少收 5 元手续费
slippage
number
default:"0"
滑点比例(如 0.001 表示千一),买入价上浮、卖出价下浮,模拟真实成交价差
stop_loss
number
default:"0"
止损比例(如 0.1 表示 10% 止损,0 表示不止损)
position_size
number | null
default:"null"
单只股票最大仓位比例,例如 0.2 表示单只股票占用总资金的 20%。默认 null(不限制)
max_positions
integer | null
default:"null"
最大持仓股票数量。默认 null(不限制)
min_volume
integer
default:"100"
最小买入股数(如A股的 1 手即 100 股)
auto_close
boolean
default:"true"
是否在回测结束时自动平仓
cheat_on_open
boolean
default:"false"
是否在 T 日信号生成后的 T 日开盘执行交易。默认 false 为 T+1 开盘执行
signal_factors
object
预计算因子字典,用于 strategy_code 模式下提前计算买卖所需的指标,或在回测中返回额外的值(可选)。可通过 factors 接口获取可用因子列表。

响应参数

success
boolean
回测是否成功
initial_cash
number
初始资金
final_cash
number
最终资金
total_return
number
总收益(元)
total_return_pct
number
总收益率(如 0.156 表示 15.6%)
max_drawdown
number
最大回撤(如 -0.082 表示 -8.2%)
profit_factor
number
盈利因子(总盈利 / 总亏损)
win_rate
number
胜率(如 0.65 表示 65%)
total_trades
integer
总交易次数
winning_trades
integer
盈利交易次数
losing_trades
integer
亏损交易次数
trades
array
交易详情列表
portfolio_value
object
每日账户净值序列,用于绘制资产走势图。键为日期,值为净值。
error_msg
string
错误信息,仅当 success 为 false 时非空

响应示例

{
  "success": true,
  "initial_cash": 100000,
  "commission": 0.0003,
  "final_cash": 115600,
  "total_return": 15600,
  "total_return_pct": 0.156,
  "max_drawdown": -0.082,
  "profit_factor": 2.35,
  "win_rate": 0.65,
  "total_trades": 12,
  "winning_trades": 8,
  "losing_trades": 4,
  "trades": [
    {
      "id": 1,
      "symbol": "000001",
      "type": "Long",
      "entry_date": "2024-01-15",
      "exit_date": "2024-02-20",
      "entry_price": 11.25,
      "exit_price": 12.50,
      "size": 8800,
      "net_pnl": 10937.3,
      "return_pct": 0.111,
      "cumulative_pnl": 10937.3
    }
  ],
  "portfolio_value": {
    "2024-01-15": 100000.0,
    "2024-01-16": 101200.5,
    "2024-02-20": 110937.3
  }
}

策略公式示例

均线金叉死叉策略

5 日均线上穿 10 日均线时买入,下穿时卖出:
{
    "entry_formula": "CROSS(MA(CLOSE, 5), MA(CLOSE, 10))",
    "exit_formula": "CROSS(MA(CLOSE, 10), MA(CLOSE, 5))",
    "symbols": ["000001"],
    "start_date": "2024-01-01",
    "end_date": "2025-01-01"
}

RSI 超买超卖策略

RSI 低于 30 时买入,高于 70 时卖出:
{
    "entry_formula": "RSI(14) < 30",
    "exit_formula": "RSI(14) > 70",
    "symbols": ["600519"],
    "start_date": "2024-01-01",
    "end_date": "2025-01-01",
    "stop_loss": 0.1
}

MACD 金叉死叉策略

MACD DIF 上穿 DEA 时买入,下穿时卖出:
{
    "entry_formula": "CROSS(MACD().dif, MACD().dea)",
    "exit_formula": "CROSS(MACD().dea, MACD().dif)",
    "symbols": ["000002"],
    "start_date": "2024-01-01",
    "end_date": "2025-01-01"
}

布林带突破策略

价格突破布林带上轨时买入,跌破下轨时卖出:
{
    "entry_formula": "CLOSE > BOLL(20, 2).upper",
    "exit_formula": "CLOSE < BOLL(20, 2).lower",
    "symbols": ["000001"],
    "start_date": "2024-01-01",
    "end_date": "2025-01-01"
}

组合条件策略

RSI 超卖且价格在 20 日均线上方买入,RSI 超买或价格跌破均线卖出:
{
    "entry_formula": "(RSI(14) < 30) & (CLOSE > MA(CLOSE, 20))",
    "exit_formula": "(RSI(14) > 70) | (CLOSE < MA(CLOSE, 20))",
    "symbols": ["600036"],
    "start_date": "2024-01-01",
    "end_date": "2025-01-01",
    "commission": 0.0003,
    "position_size": 0.8
}

当前市场选股与过滤策略

如果不指定 symbols,系统将在当前市场(由 market 字段决定,默认为A股 cn)执行回测。可以利用 filter_formula 在当前市场范围内进行过滤筛选,排除不满足基本面或状态要求的股票:
{
    "start_date": "2024-01-01",
    "end_date": "2025-01-01",
    "filter_formula": "NOT(IS_ST()) & (PE_TTM() < 20) & (ROE() > 15)",
    "entry_formula": "CROSS(MA(CLOSE, 5), MA(CLOSE, 20))",
    "exit_formula": "CROSS(MA(CLOSE, 20), MA(CLOSE, 5))",
    "position_size": 0.1,
    "max_positions": 10
}

带 signal_factors 和自定义策略的回测

使用 signal_factors 预计算因子并在自定义策略 strategy_code 中调用:
{
    "symbols": ["000001"],
    "start_date": "2024-01-01",
    "end_date": "2025-01-01",
    "signal_factors": {
        "ma5": "MA(CLOSE, 5)",
        "ma10": "MA(CLOSE, 10)",
        "rsi": "RSI(14)",
        "macd_dif": "MACD().dif",
        "pe": "PE_TTM()"
    },
    "strategy_code": "def handle_data(context, datas):\n    for data in datas:\n        symbol = data.name\n        position = context.portfolio.get_position(symbol)\n        if not position:\n            if data.ma5 > data.ma10 and data.pe < 20:\n                context.order_target_percent(symbol, 0.2)\n        elif data.rsi > 70:\n            context.order_target_percent(symbol, 0)"
}

参数说明

佣金设置

参数描述
commission0不计算佣金
commission0.0003买卖统一万三(0.03%)
buy_commission0.0003买入万三
sell_commission0.0013卖出万三佣金 + 千一印花税(A股推荐)
min_commission_amount5每笔最低 5 元手续费

滑点设置

描述
0不考虑滑点
0.001千一滑点(买入价上浮 0.1%,卖出价下浮 0.1%)
0.002千二滑点

止损设置

描述
0不设止损
0.055% 止损
0.110% 止损

仓位设置

描述
99使用 99% 资金(预留部分应对价格波动)
50使用 50% 资金(半仓操作)
30使用 30% 资金(轻仓试探)

上传 Excel 文件进行回测

上传包含 OHLCV 数据的 Excel 文件进行回测,无需依赖系统内置数据源,使用自有行情数据执行策略回测。
POST /v1/quant/backtest/upload
该接口使用 multipart/form-data 格式上传,不支持 JSON body。
curl -X POST https://api.reportify.cn/v1/quant/backtest/upload \
  -H "Authorization: Bearer <token>" \
  -F "file=@backtest_data.xlsx" \
  -F 'params={"entry_formula": "CROSS(MA(CLOSE, 5), MA(CLOSE, 10))", "exit_formula": "CROSS(MA(CLOSE, 10), MA(CLOSE, 5))", "initial_cash": 100000, "commission": 0.0003}'

Excel 文件格式要求

file
file
required
Excel 文件(.xlsx.xls 格式),包含回测所需的行情数据。必须包含的列:
列名类型说明
date日期交易日期
open数字开盘价
high数字最高价
low数字最低价
close数字收盘价
可选列:
列名类型说明
symbol字符串股票代码(多标的回测时必须提供,单标的时缺省为 "UPLOAD"
volume数字成交量
amount数字成交额
自定义字段: 支持任意英文字段名(仅字母、数字、下划线,不能以数字开头),值为数字类型。例如 pemarket_cappb_ratio 等。这些字段可在公式中直接引用。中文列名支持: 系统会自动将常见的中文列名映射为对应的英文列名:
中文列名映射到
日期 / 时间 / 交易日期 / 交易日date
开盘 / 开盘价open
最高 / 最高价high
最低 / 最低价low
收盘 / 收盘价close
成交量 / 交易量volume
成交额 / 交易额amount
代码 / 股票代码 / 证券代码symbol
自定义字段列名仍须为 ASCII 字符(英文字母、数字、下划线)。

请求参数 (params)

params 为表单字段,值为 JSON 字符串,支持以下参数(与标准回测接口一致,但不含 market/symbols/filter_formula/start_date/end_date):
entry_formula
string
买入/开仓公式,结果大于 0 时触发买入(如不提供则必须提供 strategy_code
exit_formula
string
卖出/平仓公式,结果大于 0 时触发卖出
strategy_code
string
自定义回测策略的 Python 源码代码,与 entry_formula 互斥
initial_cash
number
default:"100000"
初始资金(元)
commission
number
default:"0"
佣金费率(如 0.0003 表示万三)
auto_close
boolean
default:"true"
是否在回测结束时自动平仓
signal_factors
object
指标与因子字典,用于预计算买卖信号或自定义字段
position_size
number
default:"0.2"
单只股票最大仓位比例
max_positions
integer
default:"5"
最大持仓股票数量
min_volume
integer
default:"100"
最小买入股数

响应参数

响应格式与标准回测接口完全一致,参见上方 响应参数 章节。

Excel 上传回测示例

单标的回测

Excel 文件包含单只股票数据(无需 symbol 列):
dateopenhighlowclosevolume
2024-01-0210.5010.8010.4010.755000000
2024-01-0310.7010.9010.6010.854500000
{
  "entry_formula": "CROSS(MA(CLOSE, 5), MA(CLOSE, 10))",
  "exit_formula": "CROSS(MA(CLOSE, 10), MA(CLOSE, 5))",
  "initial_cash": 100000,
  "commission": 0.0003
}

多标的回测

Excel 文件包含多只股票数据(必须有 symbol 列):
datesymbolopenhighlowclosevolume
2024-01-0200000110.5010.8010.4010.755000000
2024-01-0260051918001815179018102000000
{
  "entry_formula": "RSI(14) < 30",
  "exit_formula": "RSI(14) > 70",
  "position_size": 0.3,
  "max_positions": 2
}

带自定义字段的回测

Excel 文件包含自定义基本面字段(如 pepb):
datesymbolopenhighlowclosevolumepepb
2024-01-0200000110.5010.8010.4010.75500000015.21.3
可在公式中直接引用自定义字段名:
{
  "entry_formula": "(CLOSE > MA(CLOSE, 20)) & (pe < 20)",
  "exit_formula": "CLOSE < MA(CLOSE, 20)",
  "initial_cash": 100000
}

注意事项

  • 回测结果仅供参考,历史收益不代表未来表现
  • 可通过 slippage 参数模拟滑点,buy_commission / sell_commission 分别设置买卖手续费以更贴近真实交易成本
  • 建议使用合理的佣金和止损参数以更接近真实交易
  • 如果不设置 exit_formula,则只有买入信号,卖出依赖止损或 auto_close

Authorizations

Authorization
string
header
required

Enter your Bearer token

Body

application/json

Backtest input parameters for strategy execution.

start_date
string<date>
required

Backtest start date (required)

end_date
string<date>
required

Backtest end date (required)

market
enum<string>
default:cn

Stock market (cn, hk, us), default cn

Available options:
cn,
hk,
us
symbols
string[] | null

List of stock codes. If empty, defaults to full market (must provide filter_formula)

filter_formula
string | null

Pre-filter formula, e.g., 'NOT(IS_ST)'

entry_formula
string | null

Buy/entry formula, triggers buy when result > 0

exit_formula
string | null

Sell/exit formula, triggers sell when result > 0 (optional)

strategy_code
string | null

Backtest strategy python code

initial_cash
number
default:100000

Initial capital, default 100000.0

commission
number
default:0

Commission rate, default 0.0

buy_commission
number
default:0

Buy commission rate, takes priority over commission (e.g., 0.0003 for 0.03%)

sell_commission
number
default:0

Sell commission rate, takes priority over commission (e.g., 0.0013 for A-share sell including stamp duty)

min_commission_amount
number
default:0

Minimum commission per trade in CNY (e.g., 5.0 means at least 5 yuan per trade)

slippage
number
default:0

Slippage ratio (e.g., 0.001 for 0.1%, buy price up, sell price down)

stop_loss
number
default:0

Stop loss percentage, default 0.0 (disabled)

auto_close
boolean
default:true

Auto close position at end, default true

signal_factors
Signal Factors · object

Signal factors dictionary for custom strategy pre-computation

position_size
number
default:0.2

Max position size ratio per stock, default 0.2

max_positions
integer
default:5

Max number of holding stocks, default 5

min_volume
integer
default:100

Minimum trading volume (e.g., 100 for A-shares), default 100

Response

Successful Response

Backtest result containing performance metrics and trade details.

success
boolean
default:true

Whether backtest completed successfully

initial_cash
number
default:100000

Initial capital

commission
number
default:0

Commission rate

final_cash
number
default:100000

Final capital after backtest

total_return
number
default:0

Total profit/loss amount

total_return_pct
number
default:0

Total return percentage

max_drawdown
number
default:0

Maximum drawdown percentage

profit_factor
number
default:0

Gross profit / Gross loss ratio

win_rate
number
default:0

Winning trades percentage

total_trades
integer
default:0

Total number of completed trades

winning_trades
integer
default:0

Number of profitable trades

losing_trades
integer
default:0

Number of losing trades

trades
TradeItem · object[]

List of trade details

portfolio_value
Portfolio Value · object

Daily portfolio values (for equity curve)

error_msg
string | null

Error message when success is false