Files
codex_jxs_code/quick_single_test.py
2026-02-28 13:21:58 +08:00

71 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""快速单结果测试:运行第一个参数组合查看回测结果"""
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)