最终报告生成器
| 151 | |
| 152 | |
| 153 | class FinalReportGenerator: |
| 154 | """最终报告生成器""" |
| 155 | |
| 156 | def __init__(self, final_state: Dict): |
| 157 | self.final_state = final_state |
| 158 | self.console = Console() |
| 159 | self.market_type = os.environ.get('CONTEST_TRADE_MARKET', 'CN-Stock') |
| 160 | |
| 161 | def get_text(self, cn_text: str, en_text: str) -> str: |
| 162 | return en_text if self.market_type == 'US-Stock' else cn_text |
| 163 | |
| 164 | def generate_markdown_report(self, save_path: Path) -> str: |
| 165 | """生成Markdown格式的报告""" |
| 166 | |
| 167 | # 获取基本信息 |
| 168 | step_results = self.final_state.get('step_results', {}) |
| 169 | data_team_results = step_results.get('data_team', {}) |
| 170 | research_team_results = step_results.get('research_team', {}) |
| 171 | contest_results = step_results.get('contest', {}) |
| 172 | |
| 173 | # 获取触发时间,确保正确解析 |
| 174 | trigger_time = self.final_state.get('trigger_time', 'N/A') |
| 175 | if trigger_time == 'N/A': |
| 176 | # 尝试从其他地方获取时间 |
| 177 | trigger_time = step_results.get('trigger_time', 'N/A') |
| 178 | |
| 179 | data_factors_count = data_team_results.get('factors_count', 0) |
| 180 | research_signals_count = research_team_results.get('signals_count', 0) |
| 181 | best_signals = contest_results.get('best_signals', []) |
| 182 | |
| 183 | # 筛选有效信号 |
| 184 | valid_signals = [s for s in best_signals if s.get('has_opportunity', 'no') == 'yes'] |
| 185 | invalid_signals = [s for s in best_signals if s.get('has_opportunity', 'no') != 'yes'] |
| 186 | |
| 187 | # 生成报告内容 |
| 188 | signal_rate = f"{len(valid_signals)/len(best_signals)*100:.1f}% ({len(valid_signals)}/{len(best_signals)})" if len(best_signals) > 0 else "0% (0/0)" |
| 189 | |
| 190 | report_content = f"""# ContestTrade {self.get_text('最终分析报告', 'Final Analysis Report')} |
| 191 | |
| 192 | ## 📊 {self.get_text('执行摘要', 'Executive Summary')} |
| 193 | |
| 194 | **{self.get_text('分析时间', 'Analysis Time')}**: {trigger_time} |
| 195 | **{self.get_text('分析状态', 'Analysis Status')}**: ✅ {self.get_text('完成', 'Completed')} |
| 196 | **{self.get_text('数据源数量', 'Data Sources Count')}**: {data_factors_count} |
| 197 | **{self.get_text('研究信号数量', 'Research Signals Count')}**: {research_signals_count} |
| 198 | **{self.get_text('有效投资信号', 'Valid Investment Signals')}**: {len(valid_signals)} |
| 199 | **{self.get_text('信号有效率', 'Signal Effectiveness Rate')}**: {signal_rate} |
| 200 | |
| 201 | --- |
| 202 | |
| 203 | ## 🎯 {self.get_text('投资建议摘要', 'Investment Recommendations Summary')} |
| 204 | |
| 205 | """ |
| 206 | |
| 207 | if valid_signals: |
| 208 | report_content += f"### ✅ {self.get_text('推荐投资信号', 'Recommended Investment Signals')} ({len(valid_signals)}{self.get_text('个', '')})\n\n" |
| 209 | |
| 210 | for i, signal in enumerate(valid_signals, 1): |
no outgoing calls
no test coverage detected