第一版策略
This commit is contained in:
70
quick_single_test.py
Normal file
70
quick_single_test.py
Normal file
@@ -0,0 +1,70 @@
|
||||
"""快速单结果测试:运行第一个参数组合查看回测结果"""
|
||||
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)
|
||||
Reference in New Issue
Block a user