183 lines
6.5 KiB
Python
183 lines
6.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
查看分析历史工具
|
|
"""
|
|
import os
|
|
import sys
|
|
import json
|
|
from datetime import datetime
|
|
from analysis_storage import AnalysisStorage
|
|
|
|
def print_banner():
|
|
"""打印横幅"""
|
|
banner = """
|
|
╔══════════════════════════════════════════════════════════════╗
|
|
║ 分析历史查看工具 ║
|
|
║ Analysis History Viewer ║
|
|
╚══════════════════════════════════════════════════════════════╝
|
|
"""
|
|
print(banner)
|
|
|
|
def list_all_analyses():
|
|
"""列出所有分析记录"""
|
|
storage = AnalysisStorage()
|
|
analyses = storage.list_all_analyses()
|
|
|
|
if not analyses:
|
|
print("📭 暂无分析记录")
|
|
return
|
|
|
|
print(f"📊 共找到 {len(analyses)} 条分析记录:")
|
|
print("=" * 80)
|
|
|
|
for i, analysis in enumerate(analyses, 1):
|
|
print(f"{i:2d}. {analysis['symbol']} - {analysis['company_name']}")
|
|
print(f" 时间: {analysis['analysis_date']}")
|
|
print(f" 建议: {analysis['recommendation']}")
|
|
print(f" 评分: {analysis['overall_score']:.1f}/100")
|
|
print(f" 文件: {analysis['files']['summary']}")
|
|
print("-" * 80)
|
|
|
|
def view_analysis_details(symbol: str):
|
|
"""查看特定股票的分析详情"""
|
|
storage = AnalysisStorage()
|
|
analysis_data = storage.get_latest_analysis(symbol)
|
|
|
|
if not analysis_data:
|
|
print(f"❌ 未找到 {symbol} 的分析记录")
|
|
return
|
|
|
|
print(f"\n📈 {symbol} 最新分析结果:")
|
|
print("=" * 60)
|
|
|
|
# 基本信息
|
|
metadata = analysis_data.get('analysis_metadata', {})
|
|
company_info = analysis_data.get('company_info', {})
|
|
investment_rec = analysis_data.get('investment_recommendation', {})
|
|
|
|
print(f"公司名称: {company_info.get('name', 'N/A')}")
|
|
print(f"分析时间: {metadata.get('analysis_date', 'N/A')}")
|
|
print(f"投资建议: {investment_rec.get('recommendation', 'N/A')}")
|
|
print(f"综合评分: {investment_rec.get('overall_score', 0):.1f}/100")
|
|
|
|
# 各维度评分
|
|
valuation = analysis_data.get('valuation_analysis', {})
|
|
financial_health = analysis_data.get('financial_health', {})
|
|
growth = analysis_data.get('growth_analysis', {})
|
|
risk = analysis_data.get('risk_analysis', {})
|
|
|
|
print(f"\n📊 各维度评分:")
|
|
print(f" 估值吸引力: {valuation.get('valuation_score', 0):.1f}/100")
|
|
print(f" 财务健康度: {financial_health.get('health_score', 0):.1f}/100")
|
|
print(f" 成长性: {growth.get('growth_score', 0):.1f}/100")
|
|
print(f" 风险控制: {risk.get('risk_score', 0):.1f}/100")
|
|
|
|
# 关键优势
|
|
strengths = investment_rec.get('key_strengths', [])
|
|
if strengths:
|
|
print(f"\n✅ 关键优势:")
|
|
for strength in strengths:
|
|
print(f" • {strength}")
|
|
|
|
# 关键担忧
|
|
concerns = investment_rec.get('key_concerns', [])
|
|
if concerns:
|
|
print(f"\n⚠️ 关键担忧:")
|
|
for concern in concerns:
|
|
print(f" • {concern}")
|
|
|
|
# 风险提示
|
|
warnings = investment_rec.get('risk_warnings', [])
|
|
if warnings:
|
|
print(f"\n🚨 风险提示:")
|
|
for warning in warnings:
|
|
print(f" • {warning}")
|
|
|
|
def view_analysis_history(symbol: str):
|
|
"""查看特定股票的分析历史"""
|
|
storage = AnalysisStorage()
|
|
history = storage.get_analysis_history(symbol)
|
|
|
|
if not history:
|
|
print(f"❌ 未找到 {symbol} 的分析历史")
|
|
return
|
|
|
|
print(f"\n📚 {symbol} 分析历史 (共 {len(history)} 条记录):")
|
|
print("=" * 80)
|
|
|
|
for i, record in enumerate(history, 1):
|
|
print(f"{i:2d}. 时间: {record['analysis_date']}")
|
|
print(f" 建议: {record['recommendation']}")
|
|
print(f" 评分: {record['overall_score']:.1f}/100")
|
|
print(f" 文件: {record['files']['summary']}")
|
|
print("-" * 80)
|
|
|
|
def export_analysis_summary():
|
|
"""导出分析摘要"""
|
|
storage = AnalysisStorage()
|
|
analyses = storage.list_all_analyses()
|
|
|
|
if not analyses:
|
|
print("📭 暂无分析记录可导出")
|
|
return
|
|
|
|
# 生成摘要报告
|
|
summary_file = f"analysis_summary_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md"
|
|
|
|
with open(summary_file, 'w', encoding='utf-8') as f:
|
|
f.write("# 股票分析摘要报告\n\n")
|
|
f.write(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
|
|
f.write(f"分析记录数: {len(analyses)}\n\n")
|
|
|
|
f.write("## 分析记录列表\n\n")
|
|
|
|
for i, analysis in enumerate(analyses, 1):
|
|
f.write(f"### {i}. {analysis['symbol']} - {analysis['company_name']}\n")
|
|
f.write(f"- **分析时间**: {analysis['analysis_date']}\n")
|
|
f.write(f"- **投资建议**: {analysis['recommendation']}\n")
|
|
f.write(f"- **综合评分**: {analysis['overall_score']:.1f}/100\n")
|
|
f.write(f"- **详细报告**: {analysis['files']['summary']}\n\n")
|
|
|
|
print(f"✅ 分析摘要已导出到: {summary_file}")
|
|
|
|
def main():
|
|
"""主函数"""
|
|
if len(sys.argv) < 2:
|
|
print("使用方法:")
|
|
print("python3 view_analysis.py list # 列出所有分析记录")
|
|
print("python3 view_analysis.py view <股票代码> # 查看最新分析结果")
|
|
print("python3 view_analysis.py history <股票代码> # 查看分析历史")
|
|
print("python3 view_analysis.py export # 导出分析摘要")
|
|
return
|
|
|
|
command = sys.argv[1].lower()
|
|
|
|
if command == 'list':
|
|
print_banner()
|
|
list_all_analyses()
|
|
|
|
elif command == 'view':
|
|
if len(sys.argv) < 3:
|
|
print("❌ 请提供股票代码")
|
|
return
|
|
symbol = sys.argv[2].upper()
|
|
print_banner()
|
|
view_analysis_details(symbol)
|
|
|
|
elif command == 'history':
|
|
if len(sys.argv) < 3:
|
|
print("❌ 请提供股票代码")
|
|
return
|
|
symbol = sys.argv[2].upper()
|
|
print_banner()
|
|
view_analysis_history(symbol)
|
|
|
|
elif command == 'export':
|
|
print_banner()
|
|
export_analysis_summary()
|
|
|
|
else:
|
|
print("❌ 无效命令")
|
|
|
|
if __name__ == "__main__":
|
|
main() |