分钟回测¶
分钟策略沿用 Backtest 和 Context,输入改为 MarketData.from_minutes,周期为 1min 或 5min。
准备分钟行情¶
def sample() -> MarketData:
days = (date(2025, 1, 2), date(2025, 1, 3))
clock = MinuteClock.build(days, "1min")
rows = [
dict(
timestamp=point,
phase="continuous",
symbol="DEMO",
status="trading",
open=10,
high=10.1,
low=9.9,
close=10,
volume=1000,
upper_limit=12,
lower_limit=8,
)
for point in clock.timestamps
]
return MarketData.from_minutes(
rows,
calendar=days,
instruments=[Instrument(symbol="DEMO", kind="etf")],
rules=china_rules({"DEMO": "szse_equity_etf"}, start=days[0], end=days[-1]),
source="人工两日分钟行情",
)
MinuteClock.build(days, "1min") 生成 09:31–11:30、13:01–15:00 的 bar 结束时点,每日 240 根;5 分钟为每日 48 根。它只为传入的日期生成网格,不识别交易所节假日。
示例全部声明为 continuous,用于演示连续交易。真实数据须按实际区间标记 continuous/auction;竞价区间只估值、不模拟成交。所有时间必须带 +08:00 时区。详见分钟数据契约。
部分成交与 T+1¶
def strategy(ctx: Context) -> None:
if ctx.bar_index == 0:
ctx.order("DEMO", 1000, valid_for="day")
elif ctx.bar_index == 240:
ctx.order("DEMO", -1000, valid_for="day")
首日第一根 bar 收盘后买入 1000 份,次日第一根 bar 收盘后卖出。配置 10% 参与率、每根成交量 1000 时,每根最多成交 100 份,需要多次完成订单。两边订单各自累计计算最低佣金,成交一次不会重复收费 5 元。
python examples/minute.py
python examples/minute.py --backend numba
python examples/minute.py --backend numba --precomputed
后两条命令需安装 Numba。完整分钟示例采用相同的两日人工行情。
配置滑点与参与率¶
from doribt import BarExecution, Costs, FixedBps, RunConfig
config = RunConfig(
initial_cash=100_000,
costs=Costs(commission=0.0003, minimum_commission=5),
execution=BarExecution(participation=0.1, slippage=FixedBps(5), slippage_policy="cost"),
)
5 bps 为单边 0.05%。也可使用 FixedTicks(1) 或 VolumeImpact(coefficient=0.1)。上例选择 cost:完整计入滑点,允许模拟结算价超过 bar 高低价或当日涨跌停价。省略 slippage_policy 时默认 strict,越界不成交;cap 则截到边界,会削减滑点成本。
三种模式都保留原始行情的成交资格、T+1、量限与资金约束,以及用户对最终结算价设置的 limit_price。涨停买入、跌停卖出的原始开盘阻断仍然有效,详见滑点边界契约。
完整滑点比较示例在三日平价人工行情上演示高点买入、低点卖出:
python examples/slippage.py
零手续费、100 份、单边 0.02 元滑点:strict 没有成交,cap 买卖都按 10 元结算,cost 买入 10.02 元、卖出 9.98 元,往返滑点成本为 4 元。Fill.reference_price 保留 10 元参考价,Fill.slippage_cost 可用于解释成本;它已计入现金与收益,不要重复扣减。
next_bar 只尝试下一根;day 持续到首个可执行 bar 所属交易日结束,午休不撤单。T+1 按交易日推进,不能在同一天买入后再卖出未解锁股份。
执行使用下一根 bar 的开盘价及最终成交量,是 bar 级模拟。成交在该 bar 结束时可见,不表示开盘时已知全部成交量。日频研究指标请用 result.report(),不要把每分钟收益直接按 252 年化。