跳转到正文

A 股日频回测 ​

先完成安装,并了解股票数据与交易机制。本例在首次可成交的开盘竞价买入 100 股后持有,未成交余单立即撤销;费用与成交量限制使用框架默认值。

运行 ​

将以下代码保存为 stock_daily.py,执行 python stock_daily.py。数据范围先于正式起点,满足前置行情与基准需要。标的、日期和资金都是示例选择。

python
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo

from localquant import run_func
from localquant.apis import cancel_order, get_position, order_shares, update_universe
from localquant.mod.localquant_mod_seeddata_source import (
    discard_bundle, load_framework_data, register_bundle,
)
from localquant.mod.localquant_mod_sys_analyser.report import export_full_html

CODE = "600000.SH"
run_name = datetime.now(ZoneInfo("Asia/Shanghai")).strftime("%Y-%m-%d-%H-%M-%S")
output_dir = Path("output/backtest") / run_name
output_dir.mkdir(parents=True, exist_ok=False)

def init(context):
    update_universe([CODE])

def open_auction(context, bar_dict):
    if get_position(CODE).quantity == 0:
        order = order_shares(CODE, 100)
        if order is not None and not order.is_final():
            cancel_order(order)

bundle = load_framework_data(
    [CODE], start="2024-05-27", end="2024-06-07",
    base_url="http://127.0.0.1:28637",
    index_codes=["000300.SH"], include_yield_curve=False,
)
key = register_bundle(bundle)
try:
    result = run_func(
        config={
            "base": {
                "start_date": "2024-06-03", "end_date": "2024-06-07",
                "frequency": "1d", "accounts": {"stock": 100_000},
                "use_risk_free_rate": False, "capital_gain_tax_rate": 0,
            },
            "mod": {
                "seeddata_source": {
                    "enabled": True,
                    "lib": "localquant.mod.localquant_mod_seeddata_source",
                    "priority": 0, "bundle_key": key,
                },
                "sys_analyser": {
                    "enabled": True, "record": True,
                    "strategy_name": "minimal_backtest", "benchmark": {"type": "instrument", "order_book_id": "000300.SH"},
                    "output_file": str(output_dir / "result.pkl"),
                },
            },
        },
        init=init, open_auction=open_auction,
    )
finally:
    discard_bundle(key)

analyser = result["sys_analyser"]
export_full_html(analyser, run_name, output_dir / "full_report.html")
print(analyser["summary"])
print(output_dir.resolve())

成功后输出 output/backtest/<运行时间>/result.pkl 和 full_report.html,HTML 可离线打开。默认只保存已发生成交;订单拒绝原因查看运行日志。

信号与执行 ​

日频每天有一次收盘 handle_bar,还提供盘前与竞价回调。要实现“上一交易日信号、下一交易日开盘执行”,在盘前读取截至前日的历史,在当日 open_auction 下单;不能在当日收盘才形成信号后,声称已按当天开盘价成交。

竞价可用于决策的是当时允许读取的价格,全天量额和快照高低价存在信息边界,见行情字段。仅允许竞价成交时,每笔订单返回后立即撤销剩余活动数量,不能等进入 handle_bar 再撤;该 BAR 已先尝试撮合存量订单。

需要信号窗口时,按实际交易日数提前加载;未满足历史长度时不要用补零构造信号。回调顺序见生命周期,订单与撮合见订单 API和成交模型。

localquant documentation