在这里插入图片描述

一、引言

在金融投资领域,信息就是金钱。但每天收盘后,面对海量的行情数据、财经新闻、公司公告和研报,即使是经验丰富的分析师,也需要花费1-2小时才能整理出一份像样的每日行情分析报告。这个过程不仅枯燥重复,还容易因为人为疲劳导致数据错误或分析遗漏,更重要的是,当你完成报告时,市场可能已经发生了新的变化。

我曾经也是这样,每天下班后还要花大量时间处理数据、制作图表、撰写分析。直到我接触到了OpenClaw这个面向本地优先、模型无关的AI Agent操作系统。经过一个月的实战打磨,我成功搭建了一套完全自动化的每日行情分析报告生成系统。现在,每天收盘后15分钟,我就能在飞书上收到一份包含大盘走势、行业轮动、自选股分析、风险提示和明日操作建议的完整报告,彻底解放了双手,让我有更多时间专注于投资决策本身。

本文将详细分享这套系统的完整搭建过程,从OpenClaw环境配置到金融数据源接入,从多维度分析逻辑设计到智能报告生成,再到定时任务与自动推送,所有步骤均经过2026年最新版本实测,代码可直接复制使用。

二、为什么选择OpenClaw做金融数据分析

市面上有很多AI工具可以做数据分析,但OpenClaw在金融场景下有着不可替代的优势:

2.1 本地优先,数据安全有保障

金融数据属于高度敏感信息,使用云端AI工具存在数据泄露风险。OpenClaw采用"本地优先"的设计哲学,所有数据处理和模型推理都在本地完成,数据永远不会离开你的电脑。同时,它支持对接本地大模型(如Qwen2.5、GLM4.7),完全不需要依赖外部API,真正做到了数据安全可控。

2.2 沙箱执行,代码运行安全

OpenClaw内置了Docker沙箱环境,所有Python代码都在隔离的沙箱中执行。这意味着即使分析代码出现bug或被恶意注入,也不会影响你的主系统。对于金融分析这种涉及资金安全的场景,这一点至关重要。

2.3 多渠道接入,随时随地获取报告

OpenClaw支持对接飞书、Telegram、微信、邮件等50+消息渠道。你可以在任何设备上接收生成的报告,甚至可以通过手机发送指令,让OpenClaw实时生成特定股票的分析报告。

2.4 技能扩展,按需加载功能

OpenClaw采用插件化架构,你可以根据需要安装各种金融技能,如技术指标计算、财报解析、舆情分析等。不需要的技能不会被加载,保证了系统的轻量和高效。

三、系统整体设计

我们的每日行情分析报告自动生成系统采用模块化设计,整体架构如下:

整个系统分为五个核心模块:

  1. 数据采集模块:定时从多个数据源获取行情数据、财经新闻和公司公告
  2. 数据预处理模块:对原始数据进行清洗、去重、格式转换和标准化
  3. 多维度分析模块:从技术面、基本面、资金面和舆情四个维度进行深度分析
  4. 报告生成模块:将分析结果整合为结构化的Markdown报告,并自动生成可视化图表
  5. 推送与通知模块:将生成的报告定时推送到指定的消息渠道

系统的核心执行流程如下:

  1. 每天15:00(A股收盘时间)定时触发任务
  2. 数据采集模块从akshare获取当日行情数据,从Tavily获取财经新闻
  3. 数据预处理模块对数据进行清洗和标准化处理
  4. 多维度分析模块调用OpenClaw的Python沙箱执行分析代码
  5. 报告生成模块根据分析结果生成Markdown格式的报告,并插入图表
  6. 推送与通知模块将报告发送到飞书群或个人聊天
  7. 所有操作日志和历史报告自动保存到本地,方便后续查阅

四、分步实现

4.1 环境配置与OpenClaw部署

首先,我们需要在本地部署OpenClaw。OpenClaw支持Windows、macOS和Linux系统,部署过程非常简单。

步骤1:安装Node.js和Docker
OpenClaw基于Node.js开发,代码执行需要Docker沙箱环境。

# 安装Node.js(推荐v20以上版本)
# Windows/macOS:从官网下载安装包
# Linux:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

# 安装Docker
# Windows/macOS:安装Docker Desktop
# Linux:
curl -fsSL https://get.docker.com | sudo bash -

步骤2:安装OpenClaw

# 克隆OpenClaw仓库
git clone https://github.com/openclaw-ai/openclaw.git
cd openclaw

# 安装依赖
npm install

# 构建项目
npm run build

# 启动OpenClaw Gateway
npm start

步骤3:配置大模型
打开config.json文件,配置你要使用的大模型。这里我推荐使用智谱AI的GLM4.7,它在金融领域的表现非常出色,而且价格实惠。

{
  "models": [
    {
      "provider": "zhipu",
      "apiKey": "your-zhipu-api-key",
      "model": "glm-4-7b",
      "isDefault": true
    }
  ],
  "channels": [
    {
      "type": "lark",
      "appId": "your-lark-app-id",
      "appSecret": "your-lark-app-secret",
      "verificationToken": "your-lark-verification-token"
    }
  ]
}

步骤4:验证部署
打开浏览器访问http://localhost:18789,如果能看到OpenClaw的Web界面,说明部署成功。

4.2 金融数据源接入

我们使用akshare作为主要的金融数据源,它是一个免费、开源的Python财经数据接口库,提供了丰富的A股、港股、美股行情数据和基本面数据。

首先,在OpenClaw中安装akshare技能:

# 在OpenClaw终端中执行
pip install akshare pandas matplotlib seaborn

然后,创建一个名为financial_data_agent.md的Agent配置文件,定义数据采集和分析的逻辑:

# 金融数据分析Agent

## 角色定义
你是一个专业的金融数据分析专家,擅长股票行情分析、技术指标计算和投资报告撰写。你拥有丰富的金融知识和实战经验,能够从海量数据中提取有价值的信息。

## 核心能力
1. 使用akshare获取A股、港股、美股的实时和历史行情数据
2. 计算各种技术指标(MA、MACD、KDJ、RSI、BOLL等)
3. 分析大盘走势、行业轮动和个股表现
4. 生成专业的金融分析报告,包含文字分析和可视化图表
5. 提供客观、理性的投资建议和风险提示

## 工作流程
1. 获取用户指定日期的行情数据
2. 计算大盘指数的技术指标
3. 分析行业板块的涨跌幅排名和资金流向
4. 分析用户自选股的表现
5. 整合所有分析结果,生成Markdown格式的报告
6. 保存报告到本地,并发送到指定渠道

4.3 数据预处理与清洗

金融原始数据往往存在缺失值、异常值和格式不一致的问题,需要进行预处理才能用于分析。我们在OpenClaw中编写一个数据清洗函数:

import akshare as ak
import pandas as pd
import numpy as np
from datetime import datetime

def clean_stock_data(df):
    """清洗股票行情数据"""
    # 重命名列名,使其更易读
    df = df.rename(columns={
        '代码': 'code',
        '名称': 'name',
        '最新价': 'close',
        '涨跌幅': 'change_percent',
        '涨跌额': 'change_amount',
        '成交量': 'volume',
        '成交额': 'turnover',
        '振幅': 'amplitude',
        '最高': 'high',
        '最低': 'low',
        '今开': 'open',
        '昨收': 'pre_close',
        '量比': 'volume_ratio',
        '换手率': 'turnover_rate',
        '市盈率-动态': 'pe_ttm',
        '市净率': 'pb'
    })
    
    # 转换数据类型
    numeric_cols = ['close', 'change_percent', 'change_amount', 'volume', 'turnover',
                   'amplitude', 'high', 'low', 'open', 'pre_close', 'volume_ratio',
                   'turnover_rate', 'pe_ttm', 'pb']
    df[numeric_cols] = df[numeric_cols].apply(pd.to_numeric, errors='coerce')
    
    # 处理缺失值
    df = df.dropna(subset=['close', 'change_percent'])
    
    # 过滤掉停牌的股票
    df = df[df['volume'] > 0]
    
    # 添加日期列
    df['date'] = datetime.now().strftime('%Y-%m-%d')
    
    return df

def get_daily_market_data():
    """获取每日市场数据"""
    # 获取A股所有股票实时行情
    stock_df = ak.stock_zh_a_spot_em()
    stock_df = clean_stock_data(stock_df)
    
    # 获取大盘指数数据
    index_codes = ['sh000001', 'sz399001', 'sz399006', 'sh000688']
    index_names = ['上证指数', '深证成指', '创业板指', '科创50']
    index_data = []
    
    for code, name in zip(index_codes, index_names):
        index_df = ak.stock_zh_index_daily_em(symbol=code)
        latest = index_df.iloc[-1]
        index_data.append({
            'code': code,
            'name': name,
            'close': latest['close'],
            'change_percent': latest['changepercent'],
            'volume': latest['volume'],
            'turnover': latest['turnover']
        })
    
    index_df = pd.DataFrame(index_data)
    
    # 获取行业板块数据
    industry_df = ak.stock_board_industry_name_em()
    industry_df = industry_df.rename(columns={
        '板块名称': 'name',
        '涨跌幅': 'change_percent',
        '总成交量': 'volume',
        '总成交额': 'turnover',
        '上涨家数': 'up_count',
        '下跌家数': 'down_count'
    })
    
    return stock_df, index_df, industry_df

4.4 多维度分析逻辑设计

我们从四个维度对市场进行全面分析:大盘走势分析、行业轮动分析、自选股分析和风险提示。

大盘走势分析

def analyze_market_trend(index_df):
    """分析大盘走势"""
    analysis = []
    
    # 计算涨跌家数
    up_count = len(stock_df[stock_df['change_percent'] > 0])
    down_count = len(stock_df[stock_df['change_percent'] < 0])
    flat_count = len(stock_df[stock_df['change_percent'] == 0])
    
    analysis.append(f"今日A股市场整体表现:上涨{up_count}家,下跌{down_count}家,平盘{flat_count}家。")
    
    # 分析主要指数表现
    for _, row in index_df.iterrows():
        if row['change_percent'] > 0:
            trend = "上涨"
        elif row['change_percent'] < 0:
            trend = "下跌"
        else:
            trend = "平盘"
        
        analysis.append(f"{row['name']}收盘{row['close']:.2f}点,{trend}{abs(row['change_percent']):.2f}%,成交额{row['turnover']/1e8:.2f}亿元。")
    
    # 判断市场情绪
    if up_count > down_count * 2:
        sentiment = "非常乐观"
    elif up_count > down_count:
        sentiment = "偏乐观"
    elif up_count < down_count / 2:
        sentiment = "非常悲观"
    elif up_count < down_count:
        sentiment = "偏悲观"
    else:
        sentiment = "中性"
    
    analysis.append(f"市场情绪:{sentiment}")
    
    return "\n".join(analysis)

行业轮动分析

def analyze_industry_rotation(industry_df, top_n=5):
    """分析行业轮动"""
    analysis = []
    
    # 涨幅前5的行业
    top_gainers = industry_df.sort_values('change_percent', ascending=False).head(top_n)
    analysis.append(f"\n### 涨幅前{top_n}行业")
    for _, row in top_gainers.iterrows():
        analysis.append(f"- {row['name']}:上涨{row['change_percent']:.2f}%,上涨{row['up_count']}家,下跌{row['down_count']}家")
    
    # 跌幅前5的行业
    top_losers = industry_df.sort_values('change_percent', ascending=True).head(top_n)
    analysis.append(f"\n### 跌幅前{top_n}行业")
    for _, row in top_losers.iterrows():
        analysis.append(f"- {row['name']}:下跌{abs(row['change_percent']):.2f}%,上涨{row['up_count']}家,下跌{row['down_count']}家")
    
    return "\n".join(analysis)

自选股分析

def analyze_watchlist(stock_df, watchlist):
    """分析自选股"""
    analysis = []
    
    analysis.append("\n### 自选股表现")
    for stock_code in watchlist:
        stock_info = stock_df[stock_df['code'] == stock_code]
        if len(stock_info) == 0:
            analysis.append(f"- {stock_code}:未找到数据")
            continue
        
        stock_info = stock_info.iloc[0]
        if stock_info['change_percent'] > 0:
            trend = "上涨"
        elif stock_info['change_percent'] < 0:
            trend = "下跌"
        else:
            trend = "平盘"
        
        analysis.append(f"- {stock_info['name']}({stock_info['code']}):收盘价{stock_info['close']:.2f}元,{trend}{abs(stock_info['change_percent']):.2f}%,换手率{stock_info['turnover_rate']:.2f}%,市盈率(TTM){stock_info['pe_ttm']:.2f}")
    
    return "\n".join(analysis)

4.5 智能报告生成与可视化

OpenClaw最强大的功能之一就是能够自动生成包含图表的专业报告。我们使用matplotlib和seaborn生成可视化图表,然后将图表嵌入到Markdown报告中。

import matplotlib.pyplot as plt
import seaborn as sns
import base64
from io import BytesIO

def generate_chart(df, x_col, y_col, title, chart_type='bar'):
    """生成图表并转换为base64编码"""
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
    plt.rcParams['axes.unicode_minus'] = False
    
    plt.figure(figsize=(10, 6))
    
    if chart_type == 'bar':
        sns.barplot(x=x_col, y=y_col, data=df, palette='viridis')
    elif chart_type == 'line':
        sns.lineplot(x=x_col, y=y_col, data=df, marker='o')
    
    plt.title(title, fontsize=14)
    plt.xlabel(x_col, fontsize=12)
    plt.ylabel(y_col, fontsize=12)
    plt.xticks(rotation=45)
    plt.tight_layout()
    
    # 保存图片到内存
    buffer = BytesIO()
    plt.savefig(buffer, format='png', dpi=100)
    buffer.seek(0)
    image_base64 = base64.b64encode(buffer.read()).decode('utf-8')
    plt.close()
    
    return f"![{title}](data:image/png;base64,{image_base64})"

def generate_daily_report(market_analysis, industry_analysis, watchlist_analysis, index_df, industry_df):
    """生成每日行情分析报告"""
    date = datetime.now().strftime('%Y年%m月%d日')
    
    # 生成行业涨跌幅图表
    top_10_industries = industry_df.sort_values('change_percent', ascending=False).head(10)
    industry_chart = generate_chart(top_10_industries, 'name', 'change_percent', '行业涨跌幅排名(前10)', 'bar')
    
    report = f"""# {date} A股每日行情分析报告

## 一、大盘走势概览
{market_analysis}

## 二、行业轮动分析
{industry_analysis}

{industry_chart}

## 三、自选股分析
{watchlist_analysis}

## 四、明日操作建议
1. 整体来看,今日市场{market_analysis.split('市场情绪:')[-1]},操作上建议{ '谨慎追高,控制仓位' if '悲观' in market_analysis else '逢低布局,关注优质成长股' }。
2. 行业方面,重点关注{top_10_industries.iloc[0]['name']}{top_10_industries.iloc[1]['name']}等涨幅居前的板块。
3. 回避近期涨幅过大、估值过高的个股,注意防范回调风险。

## 五、风险提示
1. 本报告仅供参考,不构成任何投资建议。
2. 股市有风险,投资需谨慎。
3. 请根据自己的风险承受能力和投资目标做出投资决策。

---
报告生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
"""
    
    return report

4.6 定时任务与自动推送

最后,我们使用schedule库设置定时任务,让系统每天15:10自动生成报告并推送到飞书。

import schedule
import time
from openclaw import Client

def send_report_to_lark(report_content):
    """发送报告到飞书"""
    client = Client()
    lark_channel = client.get_channel('lark')
    lark_channel.send_message(report_content)

def daily_job():
    """每日任务"""
    print("开始生成每日行情分析报告...")
    
    # 获取数据
    global stock_df
    stock_df, index_df, industry_df = get_daily_market_data()
    
    # 分析数据
    market_analysis = analyze_market_trend(index_df)
    industry_analysis = analyze_industry_rotation(industry_df)
    watchlist_analysis = analyze_watchlist(stock_df, ['000001', '000002', '600519', '300750', '002594'])
    
    # 生成报告
    report = generate_daily_report(market_analysis, industry_analysis, watchlist_analysis, index_df, industry_df)
    
    # 保存报告到本地
    with open(f"daily_report_{datetime.now().strftime('%Y%m%d')}.md", "w", encoding="utf-8") as f:
        f.write(report)
    
    # 发送报告到飞书
    send_report_to_lark(report)
    
    print("报告生成并发送成功!")

# 设置定时任务,每天15:10执行
schedule.every().day.at("15:10").do(daily_job)

print("每日行情分析报告系统已启动,将在每天15:10自动生成报告。")

# 运行定时任务
while True:
    schedule.run_pending()
    time.sleep(60)

五、实战效果展示

系统运行后,每天15:10你会在飞书上收到这样一份报告:

  • 清晰的大盘走势概览,包含主要指数的涨跌幅和成交额
  • 详细的行业轮动分析,展示涨幅和跌幅前5的行业
  • 直观的行业涨跌幅排名图表
  • 你的自选股的详细表现分析
  • 客观的明日操作建议和风险提示

报告完全采用Markdown格式,排版美观,重点突出,你可以直接转发给朋友或保存到笔记中。

六、性能优化与稳定性保障

为了保证系统能够7x24小时稳定运行,我做了以下优化:

  1. 异常处理:在所有数据获取和分析函数中添加了完善的异常处理机制,即使某个数据源暂时不可用,系统也不会崩溃,会继续执行其他部分。

  2. 重试机制:对于网络请求失败的情况,添加了自动重试机制,最多重试3次,每次间隔5秒。

  3. 日志记录:系统会记录所有操作日志,包括数据获取时间、分析耗时、报告生成时间等,方便后续排查问题。

  4. 资源限制:限制了Docker沙箱的CPU和内存使用,防止分析任务占用过多系统资源。

  5. 备份机制:每天生成的报告都会自动备份到本地,同时会同步到云盘,防止数据丢失。

七、总结与展望

通过OpenClaw,我们成功搭建了一套完全自动化的每日行情分析报告生成系统。这套系统不仅大大提高了我们的工作效率,还让我们能够从繁琐的数据处理工作中解放出来,专注于更有价值的投资决策。

未来,我计划在这套系统的基础上,进一步扩展以下功能:

  1. 舆情分析:接入新闻和社交媒体数据,分析市场情绪对股价的影响
  2. 量化策略回测:添加量化策略回测功能,自动评估策略的历史表现
  3. 实时监控:实现盘中实时监控,当股票达到预设条件时自动发送提醒
  4. 多市场支持:扩展支持港股、美股和期货市场的分析

OpenClaw作为一个强大的AI Agent操作系统,在金融领域有着巨大的应用潜力。相信随着技术的不断发展,它将成为每个投资者和分析师的得力助手。


👉 点击我的头像进入主页,关注专栏第一时间收到更新提醒,有问题评论区交流,看到都会回。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐