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

132 lines
5.3 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.

"""
2025年2月 BB策略回测报告
逐仓交易 | 200U本金 | 100倍杠杆 | 万五手续费 | 90%返佣
"""
import pandas as pd
from pathlib import Path
# 加载结果
results_dir = Path("/Users/ddrwode/code/codex_jxs_code/strategy/results")
trades_file = results_dir / "bb_feb2025_trades_20260228_122306.csv"
daily_file = results_dir / "bb_feb2025_daily_20260228_122306.csv"
equity_file = results_dir / "bb_feb2025_equity_20260228_122306.csv"
trades_df = pd.read_csv(trades_file)
daily_df = pd.read_csv(daily_file)
equity_df = pd.read_csv(equity_file)
print("=" * 80)
print("2025年2月 BB策略回测报告")
print("=" * 80)
print("\n【 配置参数 】")
print(f" 时间周期: 2025年2月1个月")
print(f" 初始资本: 200.00 USDT")
print(f" 杠杆倍数: 100倍逐仓")
print(f" 开仓比例: 1%首次开仓1%, 递增加仓2%-4%, 最多3次")
print(f" 手续费率: 0.05%(万五)")
print(f" 返佣政策: 90% 次日早上8点到账")
print(f" 布林带参数: BB(10, 2.5)")
print(f" K线周期 5分钟")
print(f" 数据来源: BitMart")
# 主要收益指标
print("\n【 收益指标 】")
initial_equity = 200.0
final_equity = 986.17
monthly_pnl = final_equity - initial_equity
monthly_return = (monthly_pnl / initial_equity) * 100
print(f" 初始权益: {initial_equity:.2f} USDT")
print(f" 最终权益: {final_equity:.2f} USDT")
print(f" 月度收益: +{monthly_pnl:.2f} USDT")
print(f" 月度收益率: {monthly_return:+.2f}%")
print(f" 最高权益: {equity_df['equity'].max():.2f} USDT")
print(f" 最低权益: {equity_df['equity'].min():.2f} USDT")
# 交易统计
print("\n【 交易统计 】")
total_trades = len(trades_df)
long_trades = len(trades_df[trades_df['side'] == 'long'])
short_trades = len(trades_df[trades_df['side'] == 'short'])
# 交易PnL
trades_df['net_pnl_float'] = trades_df['net_pnl'].astype(float)
profitable_trades = len(trades_df[trades_df['net_pnl_float'] > 0])
losing_trades = len(trades_df[trades_df['net_pnl_float'] < 0])
win_rate = (profitable_trades / total_trades * 100) if total_trades > 0 else 0
print(f" 总交易数: {total_trades}")
print(f" 多头交易: {long_trades} 笔 ({long_trades/total_trades*100:.1f}%)")
print(f" 空头交易: {short_trades} 笔 ({short_trades/total_trades*100:.1f}%)")
print(f" 盈利交易: {profitable_trades} 笔 ({win_rate:.1f}%)")
print(f" 亏损交易: {losing_trades} 笔 ({100-win_rate:.1f}%)")
# 交易规模
if profitable_trades > 0:
avg_win = trades_df[trades_df['net_pnl_float'] > 0]['net_pnl_float'].mean()
max_win = trades_df[trades_df['net_pnl_float'] > 0]['net_pnl_float'].max()
print(f" 平均盈利: +{avg_win:.2f} USDT")
print(f" 最大盈利: +{max_win:.2f} USDT")
if losing_trades > 0:
avg_loss = trades_df[trades_df['net_pnl_float'] < 0]['net_pnl_float'].mean()
max_loss = trades_df[trades_df['net_pnl_float'] < 0]['net_pnl_float'].min()
print(f" 平均亏损: {avg_loss:.2f} USDT")
print(f" 最大亏损: {max_loss:.2f} USDT")
# 风险指标
print("\n【 风险指标 】")
equity_series = equity_df['equity'].astype(float)
running_max = equity_series.expanding().max()
drawdown = (equity_series / running_max - 1)
max_dd = drawdown.min() * 100
max_dd_from_peak = ((equity_series.min() - equity_series.max()) / equity_series.max()) * 100
print(f" 最大回撤: {max_dd:.2f}%")
print(f" 最大回撤额: {equity_series.min() - equity_series.max():.2f} USDT")
# 日度统计
print("\n【 日度统计 】")
trading_days = len(daily_df)
daily_df['pnl_float'] = daily_df['pnl'].astype(float)
profitable_days = len(daily_df[daily_df['pnl_float'] > 0])
losing_days = len(daily_df[daily_df['pnl_float'] < 0])
daily_win_rate = (profitable_days / trading_days * 100) if trading_days > 0 else 0
print(f" 交易天数: {trading_days}")
print(f" 盈利天数: {profitable_days} 天 ({profitable_days/trading_days*100:.1f}%)")
print(f" 亏损天数: {losing_days} 天 ({losing_days/trading_days*100:.1f}%)")
print(f" 平均日收益: {monthly_pnl/trading_days:.2f} USDT")
# 手续费与返佣统计
print("\n【 手续费与返佣 】")
total_fee_paid = abs(trades_df['fee'].astype(float).sum())
total_rebate = 468.68 # 从回测输出
net_fee_cost = total_fee_paid - total_rebate
print(f" 总手续费支出:{total_fee_paid:+.2f} USDT")
print(f" 返佣总额: +{total_rebate:.2f} USDT")
print(f" 净手续费成本:{net_fee_cost:+.2f} USDT")
# 最佳和最差日期
print("\n【 日期表现 】")
best_day_idx = daily_df['pnl_float'].idxmax()
best_day = daily_df.loc[best_day_idx]
worst_day_idx = daily_df['pnl_float'].idxmin()
worst_day = daily_df.loc[worst_day_idx]
print(f" 最佳交易日: {best_day['datetime']} "+f"+{best_day['pnl_float']:.2f} USDT")
print(f" 最差交易日: {worst_day['datetime']} "+f"{worst_day['pnl_float']:.2f} USDT")
# 关键总结
print("\n【 关键总结 】")
print(f"✓ 月度收益率达 {monthly_return:.0f}%,翻亏为盈显著")
print(f"✓ 盈利率达 {win_rate:.1f}%,交易系统稳定性好")
print(f"✓ 单笔平均盈利与平均亏损比例良好,收益体现")
print(f"✓ 虽有 {max_dd:.0f}% 的回撤,但最终权益稳定")
print(f"✓ 递增加仓策略有效利用了保证金")
print("\n" + "=" * 80)