"""快速单结果测试:运行第一个参数组合查看回测结果""" import time from pathlib import Path from strategy.bb_midline_backtest import BBMidlineConfig, run_bb_midline_backtest from strategy.data_loader import load_klines, get_1m_touch_direction # 加载数据 print("加载数据中...") t0 = time.time() df = load_klines("5m", "2020-01-01", "2026-01-01") df_1m = load_klines("1m", "2020-01-01", "2026-01-01") print(f"加载完成: 5m={len(df):,} 条, 1m={len(df_1m):,} 条, 耗时 {time.time()-t0:.1f}s\n") # 测试第一个参数:period=20, std=2.0(布林带默认参数) # 或者你想测试 (0.5, 0.5),但实际上period和std都至少是1和0.5 cfg = BBMidlineConfig( bb_period=20, # 第一个有意义的period bb_std=2.0, # 第一个有意义的std initial_capital=200.0, margin_pct=0.01, use_1m_touch_filter=True, kline_step_min=5, ) print(f"运行回测: period={cfg.bb_period}, std={cfg.bb_std}") t0 = time.time() result = run_bb_midline_backtest(df, cfg, df_1m) print(f"回测完成,耗时 {time.time()-t0:.1f}s\n") # 显示结果 print("=" * 80) print(f"参数: period={cfg.bb_period}, std={cfg.bb_std}") print(f"初始本金: {cfg.initial_capital} U") print(f"\n交易统计:") print(f" 总交易数: {len(result.trades)}") if result.trades: winners = sum(1 for t in result.trades if t.net_pnl > 0) losers = sum(1 for t in result.trades if t.net_pnl < 0) win_rate = winners / len(result.trades) * 100 if result.trades else 0 print(f" 胜交易: {winners}, 负交易: {losers}, 胜率: {win_rate:.2f}%") print(f"\n收益统计:") equity_curve = result.equity_curve final_eq = equity_curve["equity"].iloc[-1] ret_pct = (final_eq - cfg.initial_capital) / cfg.initial_capital * 100 max_eq = equity_curve["equity"].max() max_dd = (max_eq - equity_curve["equity"].min()) / max_eq * 100 print(f" 最终权益: {final_eq:.2f} U") print(f" 总收益: {ret_pct:+.2f}%") print(f" 最大回撤: {max_dd:.2f}%") if len(result.daily_stats) > 0: daily_pnl = result.daily_stats["pnl"].sum() if len(result.daily_stats) > 0: print(f" 日均PnL: {daily_pnl / len(result.daily_stats):.2f} U") # 计算夏普比率 (假设年化) if len(result.daily_stats) > 1 and "equity" in result.daily_stats.columns: daily_returns = result.daily_stats["pnl"] / cfg.initial_capital daily_returns = daily_returns.dropna() if len(daily_returns) > 1 and daily_returns.std() > 0: sharpe = daily_returns.mean() / daily_returns.std() * (252 ** 0.5) print(f" 夏普比率: {sharpe:.3f}") print(f"\n手续费统计:") print(f" 总手续费: {result.total_fee:.2f} U") print(f" 总返佣: {result.total_rebate:.2f} U") print("=" * 80)