智能分析助手:从数据采集到AI预测的完整解决方案

549 阅读10分钟

本文基于一个真实的股票分析项目,深入解析如何构建一个支持自然语言查询、多模型预测、自动可视化的智能股票分析系统。项目采用Python技术栈,集成大模型、时间序列分析、数据库存储等技术,实现从数据采集到智能分析的完整闭环。

前言

小散户分析股票

我发现一个问题,市面上的有很多炒股软件,上面都有很多技术指标来展示当前股票的技术面,!!!!!但是每一个软件APP都要充钱,才能看哇,付费金额还几十上百不等。对于我这种小散来说,有限金额应该放入到本金里面。那好吧,说干就干。 温馨提示:股票有风险,请谨慎投资

那我自己先分析一下应该要搞些什么功能:

  • 📊 历史数据查询:需要查询不同股票的历史行情、涨跌幅、成交量等数据
  • 📈 技术分析:需要计算各种技术指标,如布林带、移动平均线、RSI等
  • 🔮 预测建模:需要构建ARIMA、Prophet等时间序列模型进行股价预测
  • 📋 报告生成:需要将分析结果整理成图表和报告
  • 效率问题:传统方式需要手动编写SQL、调用不同API、生成图表,效率低下

那接下来总结一下

基于这个真实的业务需求,我决定构建一个基于大模型和多种时间序列分析方法的智能股票分析助手,目标是:

核心功能

  • 支持自然语言查询股票数据,自动生成SQL
  • 集成ARIMA、Prophet、BOLL等多种分析模型
  • 自动生成可视化图表,支持Web界面展示
  • 内置FAQ知识库,提供专业分析指导
  • 支持本地化部署,数据安全可控 最主要不用充钱哇

预期效果

  • 🎯 分析准确率提升:多模型融合,减少单一模型偏差
  • 💼 可视化自动化:一键生成专业图表
  • 🔄 知识沉淀:FAQ知识库持续优化
  • 📱 多端支持:Web界面和终端模式

技术选型

  • 大模型框架:DashScope + qwen-agent(阿里通义千问智能体框架)
  • 数据处理:Python + Pandas + SQLAlchemy
  • 数据存储:MySQL(关系型数据库)
  • 可视化:Matplotlib(图表生成)
  • 时间序列分析:ARIMA、Prophet、BOLL
  • 数据采集:Tushare(金融数据API)

🤔 那为什么选择这个技术栈?

在技术选型过程中,我们面临了多个选择,最终确定的技术栈原因如下:

🎯 技术优势分析

1. 大模型智能对话

# qwen-agent原生支持工具调用
class Assistant(FnCallAgent):
    def _run(self, messages, **kwargs):
        # 自动处理自然语言理解
        # 内置工具调用机制
        # 支持多轮对话管理

2. 强大的数据处理能力

  • Pandas:高效的数据处理和分析
  • SQLAlchemy:ORM框架,简化数据库操作
  • MySQL:成熟稳定的关系型数据库

3. 丰富的时间序列分析库

  • ARIMA:经典的时间序列预测模型
  • Prophet:Facebook开源的预测工具
  • BOLL:布林带技术分析指标

4. 灵活的配置管理

# 集中管理敏感信息
DB_CONFIG = {
    'host': 'localhost',
    'user': 'root',
    'password': 'your_password',
    'database': 'stock_history',
    'charset': 'utf8mb4'
}

🔧 架构设计的核心思路

1. 自然语言到SQL转换

# 通过大模型实现智能SQL生成
system_prompt = """
我是股票查询助手,支持自然语言查询股票数据。
当用户输入"查询贵州茅台2024年收盘价"时,自动生成:
SELECT * FROM stocks_history WHERE stock_name='贵州茅台' AND trade_date BETWEEN '2024-01-01' AND '2024-12-31'
"""

2. 多模型分析集成

  • ARIMA预测:基于历史数据预测未来股价
  • Prophet分析:分解趋势、周期、节假日成分
  • BOLL检测:识别超买超卖信号

3. 自动化可视化

def generate_chart_png(df_sql, save_path):
    # 根据数据量自动选择图表类型
    if len(df_sql) > 20:
        # 大数据量使用折线图
        plt.plot(x, df_sql[column], label=column)
    else:
        # 小数据量使用柱状图
        plt.bar(x, df_sql[column], label=column)

🏗️ 项目架构:三层递进式设计

第一层:数据存储层(Storage Layer)

📊 MySQL数据库设计

-- 股票历史价格表
CREATE TABLE stocks_history (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
    ts_code VARCHAR(16) NOT NULL COMMENT '股票代码',
    trade_date DATE NOT NULL COMMENT '交易日期',
    `open` DECIMAL(12,2) COMMENT '开盘价',
    high DECIMAL(12,2) COMMENT '最高价',
    low DECIMAL(12,2) COMMENT '最低价',
    `close` DECIMAL(12,2) COMMENT '收盘价',
    pre_close DECIMAL(12,2) COMMENT '昨收价',
    `change` DECIMAL(12,2) COMMENT '涨跌额',
    pct_chg DECIMAL(8,4) COMMENT '涨跌幅',
    vol DECIMAL(20,2) COMMENT '成交量(手)',
    amount DECIMAL(20,2) COMMENT '成交额(元)',
    stock_name VARCHAR(32) COMMENT '股票中文名'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='股票历史价格表(合并所有股票)';

设计亮点

  • 统一表结构:所有股票数据存储在同一个表中,便于查询和管理
  • 字段完整:包含价格、成交量、涨跌幅等关键指标
  • 索引优化:建议创建(ts_code, trade_date)复合索引,提升查询性能

🔧 数据采集与导入

# Tushare数据采集
def fetch_stock_data():
    stocks = {
        '贵州茅台': '600519.SH',
        '五粮液': '000858.SZ',
        '国泰君安': '601211.SH',
        # ... 更多股票
    }
    
    for name, code in stocks.items():
        df = pro.daily(ts_code=code, start_date=start_date, end_date=end_date)
        df['stock_name'] = name
        df_list.append(df)
    
    return pd.concat(df_list, ignore_index=True)

# 自动导入脚本
def import_to_mysql(csv_path='stock_history-2.csv'):
    df = pd.read_csv(csv_path, encoding='utf-8')
    df.to_sql('stocks_history', engine, if_exists='append', index=False)

第二层:智能分析层(Analysis Layer)

🎯 多模型分析工具

@register_tool('arima_stock')
class ArimaStockTool(BaseTool):
    """ARIMA模型预测未来股价"""
    def call(self, params: str, **kwargs) -> str:
        ts_code = args['ts_code']
        n = int(args.get('n', 5))
        
        # 获取最近一年历史数据
        sql = f"SELECT trade_date, close FROM stocks_history WHERE ts_code='{ts_code}'"
        df = pd.read_sql(sql, engine)
        
        # ARIMA建模预测
        model = ARIMA(close_series, order=(5,1,5))
        model_fit = model.fit()
        forecast = model_fit.forecast(steps=n)
        
        return generate_prediction_chart(df, forecast, ts_code, n)

@register_tool('prophet_analysis')
class ProphetAnalysisTool(BaseTool):
    """Prophet周期性分析"""
    def call(self, params: str, **kwargs) -> str:
        # Prophet模型分解趋势、周期、节假日成分
        m = Prophet(yearly_seasonality=True, weekly_seasonality=True)
        m.fit(df[['ds', 'y']])
        forecast = m.predict(future)
        
        return generate_decomposition_chart(forecast, ts_code)

@register_tool('boll_detection')
class BollDetectionTool(BaseTool):
    """BOLL布林带异常检测"""
    def call(self, params: str, **kwargs) -> str:
        # 计算布林带
        df['MA20'] = df['close'].rolling(20).mean()
        df['STD20'] = df['close'].rolling(20).std()
        df['Upper'] = df['MA20'] + 2 * df['STD20']
        df['Lower'] = df['MA20'] - 2 * df['STD20']
        
        # 检测超买超卖点
        overbought = df[df['close'] > df['Upper']]
        oversold = df[df['close'] < df['Lower']]
        
        return generate_boll_chart(df, overbought, oversold, ts_code)

分析模型对比

  • ARIMA:适合短期预测,基于历史数据的自相关性
  • Prophet:适合长期趋势分析,能处理季节性和节假日效应
  • BOLL:技术分析工具,用于识别超买超卖信号

第三层:智能交互层(Interaction Layer)

🤖 大模型智能调度

class Assistant(FnCallAgent):
    def __init__(self):
        # 配置大模型
        llm_cfg = {
            'model': 'qwen-turbo-2025-04-28',
            'timeout': 30,
            'retry_count': 3,
        }
        
        # 注册工具
        tools = [
            'exc_sql',      # SQL查询工具
            'arima_stock',  # ARIMA预测工具
            'prophet_analysis',  # Prophet分析工具
            'boll_detection'     # BOLL检测工具
        ]
        
        super().__init__(llm=llm_cfg, tools=tools)

    def _prepend_knowledge_prompt(self, messages, knowledge=''):
        """将FAQ知识库注入到对话上下文中"""
        with open('faq.txt', encoding='utf-8') as f:
            faq_tips = f.read()
        
        # 格式化知识并添加到系统提示中
        knowledge_prompt = self._format_knowledge(faq_tips)
        messages = self._inject_knowledge(messages, knowledge_prompt)
        return messages

智能交互特色

  • 自然语言理解:支持中文股票名称和代码识别
  • 工具自动调用:根据用户问题自动选择合适的分析工具
  • 知识库辅助:FAQ知识库提供专业分析指导

🔄 数据流:从查询到答案的完整链路

第一步:自然语言理解

# 用户输入:"查询贵州茅台2024年收盘价"
# 系统自动识别:
# - 股票名称:贵州茅台
# - 时间范围:2024年
# - 查询字段:收盘价
# - 分析类型:历史数据查询

第二步:SQL自动生成

# 根据识别结果生成SQL:
sql = """
SELECT ts_code, trade_date, close, stock_name 
FROM stocks_history 
WHERE stock_name='贵州茅台' 
AND trade_date BETWEEN '2024-01-01' AND '2024-12-31'
ORDER BY trade_date
"""

第三步:数据查询与处理

@register_tool('exc_sql')
class ExcSQLTool(BaseTool):
    def call(self, params: str, **kwargs) -> str:
        sql_input = args['sql_input']
        need_visualize = args.get('need_visualize', True)
        
        # 执行SQL查询
        df = pd.read_sql(sql_input, engine)
        
        # 生成结果表格
        md = df.to_markdown(index=False)
        
        if need_visualize and len(df) > 1:
            # 自动生成图表
            generate_chart_png(df, save_path)
            img_md = f'![股票行情图]({img_path})'
            return f"{md}\n\n{img_md}"
        
        return md

第四步:智能分析与可视化

def generate_chart_png(df_sql, save_path):
    """智能图表生成"""
    n = len(df_sql)
    
    # 根据数据量选择图表类型
    if n > 20:
        # 大数据量使用折线图
        plt.plot(x, df_sql[column], label=column)
        plt.title("股票行情折线图(大数据量自动切换)")
    else:
        # 小数据量使用柱状图
        plt.bar(x, df_sql[column], label=column)
        plt.title("股票行情柱状图")
    
    plt.legend()
    plt.tight_layout()
    plt.savefig(save_path)
    plt.close()

🎨 用户体验:双模式交互设计

Web图形界面模式

def app_gui():
    """Web图形界面模式"""
    bot = init_agent_service()
    chatbot_config = {
        'prompt.suggestions': [
            '查询2024年全年贵州茅台的收盘价走势',
            '统计2024年4月国泰君安的日均成交量',
            '对比2024年中芯国际和贵州茅台的涨跌幅',
        ]
    }
    
    WebUI(bot, chatbot_config=chatbot_config).run()

界面特色

  • 现代化设计:基于qwen-agent的WebUI,界面美观
  • 智能提示:预设常用问题,降低使用门槛
  • 实时响应:支持流式输出,用户体验流畅

终端交互模式

def app_tui():
    """终端交互模式"""
    bot = init_agent_service()
    messages = []
    
    while True:
        query = input('请输入你的股票问题: ')
        if not query:
            continue
            
        print("正在处理您的请求...")
        for response in bot.run(messages):
            print('助手回复:', response)

终端特色

  • 轻量级:无需浏览器,适合服务器环境
  • 脚本友好:支持批量处理,便于自动化
  • 调试方便:详细的日志输出,便于问题排查

🎯 技术亮点总结

1. 自然语言到SQL智能转换

  • 基于大模型的语义理解
  • 自动识别股票名称、时间范围、分析类型
  • 智能生成优化SQL语句

2. 多模型时间序列分析

  • ARIMA:短期股价预测
  • Prophet:长期趋势和周期性分析
  • BOLL:技术分析和异常检测

3. 自动化可视化

  • 智能图表类型选择
  • 统一美观的样式设计
  • 支持Web和终端展示

4. 企业级特性

  • 本地化部署
  • 数据安全可控
  • 易于扩展和维护

🔮 未来优化迭代方向

短期优化

  • 支持更多技术指标(RSI、MACD等)
  • 增加机器学习模型(LSTM、XGBoost等)
  • 优化图表样式和交互体验

长期规划

  • 多股票对比分析
  • 板块和行业分析
  • 个性化推荐
  • 实时数据接入

结尾

各位大佬能看到这里,那你已经打败了99.9%的人啦。又到传统环节的时候,上代码不逼逼啦。

[stock-chat-BI]-Github代码仓库觉得有点小用,记得点个小星星哇

这个项目展示了如何构建一个完整的智能股票分析系统,通过合理的架构设计和优化策略,实现了从数据采集到智能分析的完整闭环。主要价值:

  1. 技术价值:展示了Python在金融数据分析中的强大能力
  2. 业务价值:显著提升了股票分析效率,降低了使用门槛
  3. 学习价值:涵盖了数据处理、机器学习、大模型应用等多个技术领域
  4. 省了钱包里的💰
得意.jpeg

希望这个实战案例能为你提供有价值的参考!🚀