# 设置通用回测选项

set_option(name, value)
1

设置通用回测选项。
当前正式支持的 name 如下:

name 可选值 默认值 说明
limit_order_expire_bars None 或正整数 None 设置限价单未成交时最多保留的撮合 bar 数;None 表示不自动过期
future_data_policy "truncate" 或 "raise" "truncate" 策略查询时间超过当前策略时点时,truncate 截断到当前时点,raise 直接抛出异常;同时适用于行情和历史财务数据查询

示例

set_option("limit_order_expire_bars", 3)
set_option("future_data_policy", "raise")
1
2

说明:

  • set_option 当前不会校验 name 是否在白名单中,传入未支持的名称虽然可能不会立即报错,但不会产生对应功能效果。

示例1:限价单当前bar不成交,保留N根信号


def init(context):
    context.stock = "000001.SZ"
    context.bar_count = 0
    set_execution("close")
    # 限价单未成交时最多保留 3 根 bar,超时自动撤销
    set_option("limit_order_expire_bars", 3)

def handle_bar(context, bar_dict):
    context.bar_count += 1
    # 第1根bar挂一个不可能成交的限价单(市价的50%)
    if context.bar_count == 1:
        price = 11.13
        order(context.stock, 100,price=price)
        log.info(f"【第1根bar】挂限价单 {price:.2f},等待3根bar过期自动撤销")
    elif context.bar_count == 5:
        log.info(f"【第5根bar】限价单应已在第4根bar自动撤销,查交易明细确认")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

示例1说明
评测运行时间段:20260810-20260817 000001.SZ 20260810 前复权收盘价11.29

set_execution("close") 设置了当前根成交,限价价格低高于等于低于收盘价都不会在20260810下单。set_option("limit_order_expire_bars", 3)只要设置了,限价单只会从开始日期后的第一根bar之后才有交易。目前是限价单只能在回测开始日期之后的bar才能有信号,开始日期当前bar是不可能有信号的。

限价单未成交时最多保留 3 根 bar,依次为20260811[11.24,11.40] 、20260812[11.20,11.29]、20260813[11.18,11.27].(20260814[11.11,11.23])
当能满足限价单在最近一根k价格区间以内的就会在最近一根k成交。
限价order(context.stock, 100,price=11.24) 在20260811 成交

限价order(context.stock, 100,price=11.23) 在20260812 成交

限价order(context.stock, 100,price=11.19) 在20260813 成交

因为set_option("limit_order_expire_bars", 3),即便是限价价格比如定位11.13在后面第4根20260814[11.11,11.23]价格内也无法下单成功了。

注意
限价下单如果不设置 set_option("limit_order_expire_bars", 3)相当于没设置限制,满足价格位置时累积bar的限价单都会集体触发。
限价单支持跨 bar 累积、按 limit_order_expire_bars 过期。
没设置limit_order_expire_bars是默认有价格满足时前面全部下单

此现象是限价单跨日累积导致的,不是日线 handle bar在同一天调用了多次。
当前执行顺序是:
1.撮合前几天遗留的未完成订单;
2.调用当天的 handle bar ;
3.代码每天都新建一张 100 股、11.1 元限价单;
4.默认 limit order expire bars=None ,未成交订单不会自动过期。
5.在20260717满足价格的时候前面bar累积的单子一起下单。

示例2:开启未来数据抛出报错

def init(context):
    context.stock = "000001.SZ"
    # "raise" = 查询超过当前时间点的数据时抛异常(默认 "truncate" = 截断不报错)
    # set_option("future_data_policy", "raise")

def handle_bar(context, bar_dict):
    # 故意查询 end_date 超过当前时间的数据(未来数据)
    future_date = context.current_dt + timedelta(days=30)
    hist = get_price(
        context.stock,
        start_date=context.current_dt - timedelta(days=10),
        end_date=future_date,  # 超过当前时间 → 触发 future_data_policy
        frequency="1d",
        fields=["close"],
    )
    log.info(f"【查询结果】行数={len(hist)},最后日期={hist.index[-1]},当前时间={context.current_dt}")
    log.info(f"【截断判断】请求end={future_date},实际end={hist.index[-1]},{'已截断' if hist.index[-1] < future_date else '未截断'}")
    order_target_percent(context.stock, 1)

def after_trading(context):
    log.info(f"===== 总资产: {context.portfolio.total_value:.2f} =====")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

示例2说明
当注释掉 set_option(默认 "truncate")→ 静默截断到当前时间,不报错

当set_option("future_data_policy", "raise")有效时 "raise" → end_date 超过当前时间会报错中断