第一次回测

先完成安装。将以下代码保存为 quickstart.py,执行 python quickstart.py。 它使用三个人工交易日,无需账号或行情服务。

"""安装 doribt 后即可运行;仅使用合成行情与公开 API。"""

from doribt import Backtest, Context, Costs, Instrument, MarketData, RunConfig, china_rules

days = ["2025-01-02", "2025-01-03", "2025-01-06"]
prices = [10, 10, 11]
data = MarketData.from_records(
    [
        {
            "session": day,
            "symbol": "DEMO",
            "status": "trading",
            "open": price,
            "high": price,
            "low": price,
            "close": price,
            "volume": 500_000,
            "upper_limit": 12,
            "lower_limit": 8,
        }
        for day, price in zip(days, prices, strict=True)
    ],
    calendar=days,
    instruments=[Instrument(symbol="DEMO", kind="etf")],
    rules=china_rules({"DEMO": "szse_equity_etf"}, start=days[0], end=days[-1]),
    source="人工三日行情,仅用于演示",
)


def buy_and_hold(ctx: Context) -> None:
    ctx.target_weights({"DEMO": 0.9})


config = RunConfig(initial_cash=10_000, costs=Costs(commission=0.0003, minimum_commission=5))
result = Backtest(data, config=config).run(buy_and_hold)
print("期末权益:", result.equity[-1])  # 10895 元:剩余现金 995 + 持仓 900 × 11。
print("总收益率:", result.report().stats["total_return"])

也可下载脚本。

为什么期末权益是 10895 元

  1. 首日收盘权益 10000 元,90% 的仓位目标对应 900 份。

  2. 下一交易日开盘以 10 元成交,成交额 9000 元。佣金按 max(9000 × 0.0003, 5) 收取 5 元。

  3. 现金剩余 995 元;第三日收盘价格 11 元,持仓价值 9900 元,总权益 10895 元,总收益率 8.95%。

目标权重保持不变时,引擎延续原来的股数目标。需要按最新权益重新计算股数时,显式使用 rebalance=True。

这里的交易日、涨跌停价与价格均为演示输入。实际回测要换成有来源的完整数据,见接入自己的行情。