外观
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和成交模型。