策略 API 文档
聚宽风格 Python 策略接口 · 日线回测 · 前复权数据
· 所有 order* 下单在次一交易日开盘价撮合 (聚宽日线口径, 杜绝未来函数)。
· 严格 T+1: 当日买入的仓位次日才可卖 (closeable_amount 只含可卖部分)。
· 涨跌停: 开盘触及涨停买不进、触及跌停卖不出, 委托作废并记入撮合提示。
· 费率: 佣金万2.5 (最低5元, 双边) + 印花税万5 (卖出) + 过户费万0.1 (沪深双边); 滑点 5BP。
· 买入自动取整到 100 股 (一手); 清仓卖出含零股全卖。
· 历史数据 API 只提供到当前回测日前一交易日; 当日 bar 仅经 handle_data 的 data 参数提供。
· 股票代码支持 600519 / 600519.SH / 600519.XSHG 写法。
initialize(context)回测开始时调用一次, 必须定义。用于设置 g 变量、基准、费率等。
before_trading_start(context)每个交易日开盘前调用。在这里下单会在当日开盘价成交。
handle_data(context, data)每个交易日收盘后调用 (核心函数)。data[code] 为当日完整 bar (open/high/low/close/volume); 在这里下单次日开盘成交。
after_trading_end(context)每日收盘处理完之后调用, 适合做日终统计。
run_daily(func, time='open'|'close')注册每日定时函数 (在 initialize 中调用)。time='open' 开盘后执行, time='close' 收盘后执行; func(context)。
order(security, amount)按股数下单: 正数买入 (自动取整到 100 股), 负数卖出。
order_value(security, value)按金额下单: 正数买入约 value 元, 负数卖出约 |value| 元市值。
order_target(security, amount)调仓到目标持仓股数; order_target(code, 0) 即清仓。
order_target_value(security, value)调仓到目标市值。
# 半仓买入平安银行, 次日开盘成交
order_value('000001.SZ', context.portfolio.total_value * 0.5)attribute_history(security, count, fields=['open','high','low','close','volume'])取单只股票最近 count 个交易日的历史数据, 返回 pandas DataFrame (index 为日期)。
history(count, field='close', security_list=[...])取多只股票同一字段的历史, 返回 DataFrame (行=日期, 列=代码)。
get_price(security, start_date=None, end_date=None, fields=None, count=None)按区间取历史行情 (end 自动截断到当前回测日前一日)。
hist = attribute_history('000001.SZ', 20, fields=['close'])
ma20 = float(hist['close'].mean())context.portfolio.cash / total_value / positions_value / returns可用现金 / 总资产 / 持仓市值 / 收益率。
context.portfolio.positions[code]持仓对象: .amount 持仓股数 / .closeable_amount 可卖股数 (T+1) / .avg_cost 成本 / .price 最新价 / .value 市值。遍历 positions 得到当前持仓代码。
context.current_dt / context.previous_date当前回测日 (datetime) / 前一交易日 (字符串)。
g全局对象, 跨函数保存策略状态, 如 g.security = '000001.SZ'。
set_benchmark(code)设置业绩基准, 仅 initialize 中有效。默认 'MARKET.EW' (全市场等权指数, 由仓内全部 A 股每日等权平均合成, 永不混入 ETF); ETF 策略建议用 'ETF.EW' (全 ETF 等权) 或 'ETF.BROAD' (宽基 ETF 等权); 也可设为任意标的代码 (如策略标的本身, 直接衡量择时价值)。基准在仓内无区间数据时会自动回退到 'MARKET.EW' 并给出警告。
set_commission(commission_rate=..., min_commission=..., stamp_tax_rate=...)覆盖默认费率, 仅 initialize 中有效。
set_slippage(rate)设置滑点比例 (默认 0.0005), 仅 initialize 中有效。
log.info / log.warning / log.error / log.debug输出运行日志 (带回测日期前缀), 在「运行日志」面板查看。print 会重定向到 log.info。
代码格式:仓内 ETF 用 THS 式 510300.SH / 159915.SZ(不是 平台码 SH510300)。
T+0 / T+1 自动生效:撮合器按标的规则处理,策略代码无需任何特殊写法。 允许当日回转的仅官方五类 —— 债券ETF / 货币ETF / 黄金ETF(商品ETF) / 商品期货ETF / 跨境ETF;境内股票 ETF(510300 / 159915 / 588000)固定 T+1。 对 T+0 标的,同一交易日买入后可当日卖出;对 T+1 标的,当日卖出会被拒并提示「无可卖持仓 (T+1 未解锁)」。
费用:ETF 免印花税(A 股卖出收 0.05%), 佣金/过户费与 A 股同口径,涨跌停一律 10%,最小单位 100 份。
数据边界:ETF 日线在仓内的起点是 2025-09-18(主站行情仓 250 根滚动窗,随时间累积加深),而 A 股从 2010 年起。ETF 基准 ETF.EW /ETF.BROAD 同起点,因此 无法回测 2025-09 之前的 ETF 策略。
当前做不了的:研究仓日线只含 OHLCV,没有 IOPV 与折溢价历史、也没有申赎数据, 所以「折溢价回归」与「ETF 套利」类策略暂时无法回测(可回测的是基于日线的 ETF 轮动/择时)。
可 import: numpy, pandas, math, statistics, datetime, json, random, collections, itertools, functools, heapq, bisect, decimal, re, copy
出于安全, 策略在无网络的隔离沙箱中运行: 不能访问文件/网络/系统接口; 单次回测限时 180 秒、内存 512MB、日志输出 2MB。
数据范围: 全 A 股 + 场内 ETF 日线 (前复权), 来自平台自建日线数据仓 (每晚更新、随时间持续累积加深); 可回测区间见「运行回测」弹窗中的数据覆盖提示。分钟级回测将在后续版本开放。