外观
场内基金日频回测
先完成安装,并了解基金机制。本例在首次可成交的开盘竞价买入 100 份 ETF 并持有,以同一基金的后复权收益作为基准。未成交余单立即撤销;交易费用与 T+1 使用框架默认值。
运行
保存为 fund_daily.py,执行 python fund_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 = "510300.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",
asset_type="cn_etf", 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": "fund_daily", "benchmark": {"type": "instrument", "order_book_id": CODE},
"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。换成 LOF 时仍使用 cn_etf 链路,需确认该代码有场内行情及基础信息;不把资产类型改为不存在的 cn_lof。
信号与执行
基金的回调、竞价成交及日线可见性与 stock 账户一致,见生命周期和历史边界。上一交易日日线信号可以在下一交易日 open_auction 执行;需要日内申报时使用分钟回测。
分红和份额折算由账户入账,后复权信号不能作为委托限价。普通买入与分红再投资份额的当日可平规则不同,实际下单以 closable 为准。基金价格、交易单位、税费和折算条件以基金机制为准。