跳转到正文

场内基金日频回测 ​

先完成安装,并了解基金机制。本例在首次可成交的开盘竞价买入 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 为准。基金价格、交易单位、税费和折算条件以基金机制为准。

localquant documentation