Python金融新闻分析系统(附代码)

Python金融新闻分析系统(附代码)
一、概述
该代码实现了一个金融新闻分析系统,主要功能是抓取金融新闻数据,使用LLM(大语言模型)进行分析,并生成结构化的markdown报告。系统集成了akshare数据源和自定义的LLM工厂模式,实现了新闻数据的采集、处理、分析和报告生成的完整流程。
二、功能分析
系统主要实现了以下核心功能:
- 数据采集:使用akshare库获取全球金融新闻数据
- 时间处理:对新闻发布时间进行标准化处理
- 批次处理:将新闻数据分批处理以适应LLM的输入限制
- 新闻分析:使用LLM进行多维度新闻分析
- 报告生成:将分析结果整合为结构化的markdown报告
三、实现细节
3.1 代码结构
def runner():
# 1. 数据获取和预处理
cls_telegraph_news = ak.stock_info_global_cls()
# 2. 时间处理
cls_telegraph_news["日期"] = cls_telegraph_news.apply(...)
# 3. LLM初始化
llm_factory = LLMFactory()
# 4. 批次处理和分析
news_batches = []
# 5. 报告生成
response = reporter.one_chat(prompt)
3.2 核心算法
- 时间处理算法
- 将分散的日期和时间字段合并
- 对时间进行规整化处理(30分钟为界限)
- 生成标准化的时间范围描述
- 新闻批处理算法
- 使用累积长度控制(9500字符限制)
- 动态分批以确保每批数据不超过LLM处理限制
- 保持新闻完整性的分割策略
3.3 设计模式
- 工厂模式
- 使用
LLMFactory
创建LLM客户端 - 支持多种LLM实现(MiniMaxPro和FallBack)
- 策略模式
- 通过不同的LLM客户端实现不同的分析策略
- 支持灵活切换和扩展分析能力
四、技术亮点
- 模块化设计
- 清晰的职责分离
- 高内聚低耦合的组件设计
- 容错机制
- 使用FallbackLLMClient作为备选方案
- 文件系统操作的安全处理
- 可扩展架构
- 支持多种LLM模型的集成
- 灵活的报告生成模板
五、最佳实践
- 配置管理
- 使用Config类管理配置信息
- 支持环境变量和配置文件
- 错误处理
- 确保文件操作的安全性
- LLM调用的错误处理机制
- 代码组织
- 清晰的函数职责划分
- 良好的注释和文档
六、改进建议
- 功能增强
- 添加新闻数据的本地缓存机制
- 实现增量更新的支持
- 添加数据验证和清洗功能
- 性能优化
- 实现异步处理机制
- 添加批处理的并行支持
- 优化内存使用效率
- 可维护性提升
- 增加单元测试覆盖
- 添加详细的日志记录
- 完善错误处理机制
- 扩展性增强
- 支持更多数据源的集成
- 实现插件化的LLM模型支持
- 添加自定义分析模板的支持
源代码
import akshare as ak
import pandas as pd
from datetime import datetime
import os
import uuid
from core.utils.config_setting import Config
from core.llms.llm_factory import LLMFactory
from core.llms.mini_max_pro import MiniMaxProClient
from core.llms.fallback_client import FallbackLLMClient
def runner():
cls_telegraph_news = ak.stock_info_global_cls()
# 将发布日期和发布时间组合成新的列日期
cls_telegraph_news["日期"] = cls_telegraph_news.apply(
lambda row: datetime.combine(row["发布日期"], row["发布时间"]), axis=1
)
# 获取起始时间和结束时间
start_time = cls_telegraph_news["日期"].min()
end_time = cls_telegraph_news["日期"].max()
# 调整起始时间和结束时间
if start_time.minute < 30:
start_time = start_time.replace(minute=0, second=0, microsecond=0)
else:
start_time = start_time.replace(minute=0, second=0, microsecond=0) + pd.Timedelta(hours=1)
if end_time.minute < 30:
end_time = end_time.replace(minute=0, second=0, microsecond=0)
else:
end_time = end_time.replace(minute=0, second=0, microsecond=0) + pd.Timedelta(hours=1)
# 生成time_span字符串
time_span = f"资讯时间从{start_time.strftime('%Y年%m月%d日%H点')},到{end_time.strftime('%Y年%m月%d日%H点')}"
llm_factory = LLMFactory()
# 确保output文件夹存在
os.makedirs("output", exist_ok=True)
# 确保 markdown/news/ 目录存在
os.makedirs("markdown/news", exist_ok=True)
# 访问之前步骤的数据
data = cls_telegraph_news
df = data
# 使用LLM API进行新闻分析
reporter = llm_factory.get_reporter("FallbackLLMClient")
llm_client = llm_factory.get_reporter("FallbackLLMClient")
if isinstance(llm_client, MiniMaxProClient):
llm_client.debug=True
if isinstance(reporter, MiniMaxProClient):
reporter.debug=True
news_batches = []
current_batch = ""
for _, row in data.iterrows():
news = f"标题: {row['标题']}\n内容: {row['内容']}\n"
if len(current_batch) + len(news) > 9500:
news_batches.append(current_batch)
current_batch = news
else:
current_batch += news
if current_batch:
news_batches.append(current_batch)
analysis_results = []
for batch in news_batches:
prompt = f"""分析以下新闻,重点关注:
1. 总结和提炼对市场影响比较大的内容
2. 金融市场动态总结
3. 市场情绪的走向和判断
4. 市场影响、热点和异常
5. 行业影响、热点和异常
6. 其他的市场重点要点信息
新闻内容:
{batch}
"""
response = llm_client.one_chat(prompt)
analysis_results.append(response)
# 准备返回值
results = []
results.append(time_span)
results.append("新闻分析结果:")
for i, result in enumerate(analysis_results, 1):
results.append(f"批次 {i} 分析:\n{result}\n")
# 将结果保存到analysis_result变量
analysis_result = "\n".join(results)
# 使用LLM API生成markdown文件
prompt = f"""请将以下新闻分析结果整理成markdown格式的报告。
报告主要内容及markdown文件的结构如下:
标题:xxxx年xx月xx日财经资讯分析报告
(本次分析的时间范围:xxxx年xx月xx日xx点至xxxx年xx月xx日xx点)
1. 主要市场趋势:
- 综合所有批次,识别出最重要、最具影响力的市场趋势。
- 这些趋势如何相互关联或冲突?
2. 金融市场动态:
- 总结各个市场(如股票、债券、商品等)的整体表现和关键变动。
- 识别出可能影响未来市场走向的关键因素。
3. 市场情绪分析:
- 综合评估整体市场情绪(如乐观、悲观、谨慎等)。
- 分析情绪变化的原因和可能的影响。
4. 热点和异常事件:
- 列出所有批次中提到的主要热点和异常事件。
- 评估这些事件对市场的短期和长期影响。
5. 行业分析:
- 识别受关注度最高或影响最大的行业。
- 总结这些行业面临的机遇和挑战。
6. 政策和监管影响:
- 总结可能影响市场的主要政策或监管变化。
- 分析这些变化可能带来的影响。
7. 风险评估:
- 基于所有分析结果,识别潜在的系统性风险或值得关注的风险因素。
8. 前瞻性展望:
- 根据当前分析,对短期和中期市场走势做出预测。
- 提出投资者和市场参与者应该关注的关键点。
请提供一个全面、深入、结构化的总结,整合所有批次的分析结果,突出最重要的发现和见解。
需要总结的新闻内容摘要如下:
{analysis_result}
"""
response = reporter.one_chat(prompt)
date_str = datetime.now().strftime("%Y%m%d%H%M%S")
file = f"markdown/news/news{date_str}.md"
# 创建或更新output.md文件
with open(file, "w", encoding="utf-8") as f:
f.write(response)
if __name__ == "__main__":
runner()