Files
etf/visualization/report_generator
aszerW 861e590441 feat(report): 策略KPI数据统一来源,避免重复计算
修改内容:
1. strategies/rotation/report.py
   - 新增保存策略KPI到JSON文件的功能
   - 保存指标:累计收益、年化收益、夏普比率、最大回撤、Calmar比率、日胜率
   - 同时保存基准指标和回测区间信息
   - 输出路径: results/report_metrics.json

2. visualization/report_generator/generate_report.py
   - 加载策略KPI JSON文件(优先)
   - 直接使用轮动策略输出的指标,不再重复计算
   - 保留备用计算逻辑(JSON不存在时)
   - 确保HTML报告与轮动策略结果完全一致

效果:
- KPI指标统一从轮动策略回测结果获取
- 避免重复计算导致的数据不一致
- 数据来源清晰可追溯
- HTML报告指标与终端输出完全一致
2026-05-08 22:25:22 +08:00
..

ETF轮动策略报告生成器

生成精美的 HTML 策略报告,展示回测结果和关键指标。

功能特性

  • 策略 KPI - 累计收益、年化收益、胜率、夏普比率等
  • 净值曲线 - 交互式折线图,支持缩放和悬停
  • 月度收益 - 柱状图展示每月收益分布
  • 盈亏分布 - 饼图展示盈利/亏损比例
  • 品种排行 - 横向条形图展示各品种表现
  • 调仓记录 - 可按日期和品种筛选的交易明细表格
  • 现代化 UI - 渐变色头部、卡片布局、响应式设计
  • 打印友好 - 支持直接打印为 PDF

使用方法

基础用法

# 生成完整报告
python visualization/report_generator/generate_report.py

# 指定时间区间
python visualization/report_generator/generate_report.py --start 2024-01-01 --end 2024-12-31

# 指定输出目录
python visualization/report_generator/generate_report.py --output my_reports

Python API 调用

from visualization.report_generator.generate_report import ReportGenerator

# 创建生成器
generator = ReportGenerator(results_dir='results')

# 生成报告
output_file = generator.generate(
    start_date='2024-01-01',
    end_date='2024-12-31',
    output_dir='reports'
)

print(f"报告已生成: {output_file}")

定时生成(可选)

# 添加到 crontab每天生成一次
0 9 * * * cd /path/to/etf && python visualization/report_generator/generate_report.py

依赖

pip install pandas numpy jinja2

文件结构

visualization/report_generator/
├── template.html          # HTML 模板
├── generate_report.py     # 报告生成脚本
└── README.md             # 说明文档

输出示例

生成的报告包含:

  1. 头部区域 - 报告标题和数据区间
  2. KPI 卡片 - 8 个关键指标(收益、胜率、夏普比等)
  3. 净值曲线 - 带渐变填充的折线图
  4. 月度收益 - 红绿柱状图
  5. 盈亏分布 - 环形饼图
  6. 品种排行 - 横向条形图
  7. 调仓表格 - 支持筛选和打印

自定义

修改配色方案

编辑 template.html 中的 CSS 变量:

:root {
    --primary-color: #1890ff;
    --success-color: #52c41a;
    --danger-color: #ff4d4f;
}

添加新指标

generate_report.pycalculate_kpis() 方法中添加:

def calculate_kpis(self, trades_filtered):
    # ... 现有代码 ...
    
    # 添加新指标
    new_metric = ...
    
    return {
        'total_return': ...,
        'new_metric': new_metric,  # 新增
        ...
    }

然后在模板中使用:

<div class="kpi-value">{{ new_metric }}</div>

技术栈

  • 模板引擎: Jinja2
  • 图表库: ECharts 5.4
  • 样式框架: Bootstrap 5.3
  • 图标: Bootstrap Icons

注意事项

  1. 确保 results/report_summary.csvresults/report_trades.csv 存在
  2. 数据格式需符合预期(参考现有 CSV 文件)
  3. 生成的 HTML 文件可离线查看ECharts 使用 CDN
  4. 打印时筛选栏会自动隐藏

示例输出

🚀 开始生成策略报告...
✅ 数据加载成功: 1233 条交易记录
📊 筛选后数据: 1233 条记录
✅ 报告已生成: reports/strategy_report_20260508_210000.html
📁 文件大小: 125.3 KB
🌐 在浏览器中打开: file:///Users/aszer/Documents/vscode/etf/reports/strategy_report_20260508_210000.html