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