feat(portfolio): 组合回测接入A股费用(佣金/印花税/最低佣金/滑点)对齐个股回测; BulletTrade set_order_cost/set_slippage [vps]
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 25s
CI/CD / nas-verify (push) Successful in 10s

This commit is contained in:
2026-08-13 10:32:49 +08:00
parent b48a3b5c75
commit 66b393df16
6 changed files with 82 additions and 3 deletions
+20
View File
@@ -49,6 +49,11 @@ def parse_args() -> argparse.Namespace:
p.add_argument("--benchmark", default="000300.XSHG", help="基准代码")
p.add_argument("--max-pool", type=int, default=0, help="限制选股池前N只(0=不限,MVP验证用)")
p.add_argument("--frequency", default="day", help="回测频率 day/minute")
# A 股费用(对齐个股回测;BulletTrade 默认仅印花税千1+最低5元,这里显式可配)
p.add_argument("--commission-rate", type=float, default=0.0003, help="佣金率双边(万3=0.0003)")
p.add_argument("--stamp-duty-rate", type=float, default=0.001, help="印花税率卖出(千1=0.001)")
p.add_argument("--min-commission", type=float, default=5.0, help="单笔最低佣金(元)")
p.add_argument("--slippage", type=float, default=0.0, help="滑点比率(万10=0.001,0=不加)")
p.add_argument(
"--strategy", default="all_weather",
choices=["all_weather", "momentum_timing", "value_selection", "small_cap"],
@@ -237,6 +242,21 @@ def run_backtest(args: argparse.Namespace) -> Dict[str, Any]:
# 才能真正设到 bullet_trade settings → fq_mode=pre 与 get_current_data 一致, 买入才成交
holder["broker"] = build_broker_facade_inner(strategy, context)
strategy.broker = holder["broker"]
# A 股费用 + 滑点(聚宽风格全局函数,对齐个股回测;BulletTrade 默认费用不全)
from bullet_trade.core.api import set_order_cost, set_slippage # type: ignore
from bullet_trade.core.settings import OrderCost, FixedSlippage # type: ignore
set_order_cost(
OrderCost(
open_tax=0.0,
close_tax=args.stamp_duty_rate,
open_commission=args.commission_rate,
close_commission=args.commission_rate,
min_commission=args.min_commission,
),
type="stock",
)
if args.slippage:
set_slippage(FixedSlippage(value=args.slippage))
strategy.initialize(context)
def build_broker_facade_inner(strategy: Any, context: Any):