feat(portfolio): 组合回测接入A股费用(佣金/印花税/最低佣金/滑点)对齐个股回测; BulletTrade set_order_cost/set_slippage [vps]
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user