📋 目录
- 项目背景与价值
- 系统架构设计
- 环境准备
- 实施步骤
- 核心代码解析
- 定时任务配置
- 钉钉推送配置
- 最终效果展示
- 总结与展望

一、项目背景与价值
1.1 痛点分析
对于投资者和金融机构而言,每日获取及时、准确的股市分析数据是一项重要但耗时的工作:
- ❌ 数据分散: 行情数据、技术指标、资金流向分散在不同平台
- ❌ 分析耗时: 手动计算技术指标、筛选潜力股需要大量时间
- ❌ 信息滞后: 无法在开盘前获得完整的分析报告
- ❌ 缺乏系统性: 缺少统一的多因子量化分析框架
1.2 解决方案
基于阿里云 JVS 和OpenClaw ,我们构建了一套自动化的沪深 300 晨间多因子投研日报系统:
- ✅ 自动采集: 每日 8:00 自动获取沪深 300 成分股数据
- ✅ 智能分析: 多因子量化模型 + 技术面分析(金叉/死叉识别)
- ✅ 准时推送: 每日 9:00 前推送完整报告到钉钉
- ✅ 专业报告: 包含大盘复盘、板块热点、多因子筛选、技术面分析等 7 大模块
1.3 核心价值
| 价值维度 | 具体收益 |
|---|---|
| 效率提升 | 从手动 2-3 小时 → 自动 5 分钟完成 |
| 数据全面 | 覆盖 300 只成分股、60 日历史数据 |
| 分析专业 | 多因子模型 + 技术面分析双重验证 |
| 决策支持 | 提供 Top10 推荐、金叉/死叉信号、潜力/风险股清单 |
二、系统架构设计
2.1 整体架构
┌─────────────────────────────────────────────────────────────────┐
│ 阿里云 JVS 平台 │
├─────────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 数据采集 │───▶│ 行情分析 │───▶│ 策略决策 │ │
│ │ Agent │ │ Agent │ │ Agent │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ 新浪财经 API 技术指标计算 多因子量化模型 │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 技术面分析 │───▶│ 报告生成 │───▶│ 钉钉推送 │ │
│ │ Agent │ │ Agent │ │ Agent │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ 金叉/死叉识别 Markdown 报告 钉钉机器人 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────┐
│ 钉钉群消息 │
│ (每日 9:00) │
└─────────────────┘
2.2 核心模块
| 模块 | 功能 | 技术实现 |
|---|---|---|
| 数据采集 | 获取沪深 300 成分股行情 | Python + requests + 新浪财经 API |
| 行情分析 | 计算 MA、MACD、RSI 等技术指标 | NumPy + 自定义算法 |
| 策略决策 | 多因子量化筛选 Top10 | 估值/成长/动量/资金流四因子模型 |
| 技术面分析 | 金叉/死叉识别、潜力/风险股筛选 | MACD/MA 交叉检测算法 |
| 报告生成 | 生成 Markdown 格式专业报告 | Python 模板引擎 |
| 钉钉推送 | 推送到钉钉群 | 钉钉机器人 Webhook |
三、环境准备
3.1 基础环境
bash
# 1. 阿里云 JVS 环境
- 已开通阿里云 JVS 账号 https://jvs.wuying.aliyun.com/
- 已安装 OpenClaw 框架
# 2. Python 环境
Python 3.10+
pip3 install requests numpy
# 3. 钉钉群
- 创建钉钉群
- 添加自定义机器人
- 获取 Webhook 地址
3.2 目录结构
~/.openclaw/
├── skills/
│ ├── stock-data-collector/ # 数据采集 Agent
│ ├── stock-analyzer/ # 行情分析 Agent
│ ├── stock-strategy/ # 策略决策 Agent
│ └── stock-report/ # 报告推送 Agent
└── workspace/
└── data/
└── daily/ # 每日数据文件
四、实施步骤
步骤 1:创建数据采集 Agent
文件 : ~/.openclaw/skills/stock-data-collector/fetch_hs300_sina.py
python
#!/usr/bin/env python3
# 沪深 300 历史数据获取 - 新浪财经 API
import requests
import json
from pathlib import Path
OUTPUT_DIR = Path.home() / ".openclaw" / "workspace" / "data" / "daily"
HS300_STOCKS = ["600000", "600036", "601318", "601398", "601288", ...]
def fetch_sina_history(stock_code):
symbol = f"sh{stock_code}" if stock_code.startswith("6") else f"sz{stock_code}"
url = "http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData"
params = {"symbol": symbol, "scale": 60, "ma": "no", "datalen": 60}
response = requests.get(url, params=params, timeout=10)
if response.status_code == 200:
return response.json()
return []
步骤 2:创建行情分析 Agent
文件 : ~/.openclaw/skills/stock-analyzer/analyzer.py
python
#!/usr/bin/env python3
# 行情分析 Agent - 计算技术指标
import numpy as np
def calculate_ma(closes, period):
"""计算移动平均线"""
if len(closes) < period:
return None
return round(np.mean(closes[-period:]), 2)
def calculate_macd(closes):
"""计算 MACD"""
if len(closes) < 26:
return None, None, None
# 计算 EMA12 和 EMA26
ema12 = ema26 = closes[0]
for close in closes[1:]:
ema12 = close * 2/13 + ema12 * 11/13
ema26 = close * 2/27 + ema26 * 25/27
dif = ema12 - ema26
dea = dif * 2/10 + dea * 8/10
macd_bar = 2 * (dif - dea)
return dif, dea, macd_bar
步骤 3:创建策略决策 Agent
文件 : ~/.openclaw/skills/stock-strategy/strategy.py
python
#!/usr/bin/env python3
# 策略决策 Agent - 多因子量化筛选模型
FACTOR_WEIGHTS = {
"技术面因子": 0.35,
"量能因子": 0.25,
"市场情绪因子": 0.25,
"风险控制因子": 0.15
}
def calculate_composite_score(stock):
"""计算综合得分"""
tech_score = calculate_technical_score(stock)
volume_score = calculate_volume_score(stock)
sentiment_score = calculate_sentiment_score(stock)
risk_score = calculate_risk_score(stock)
composite = (
tech_score * 0.35 +
volume_score * 0.25 +
sentiment_score * 0.25 +
risk_score * 0.15
)
return round(composite, 1)
步骤 4:创建技术面分析模块
文件 : ~/.openclaw/skills/stock-report/technical_analysis.py
python
#!/usr/bin/env python3
# 技术面分析 - 金叉/死叉识别
def identify_golden_cross(closes):
"""识别 MA 金叉信号"""
ma5 = np.mean(closes[-5:])
ma10 = np.mean(closes[-10:])
prev_ma5 = np.mean(closes[-11:-6])
prev_ma10 = np.mean(closes[-11:-1])
if prev_ma5 <= prev_ma10 and ma5 > ma10:
return "MA 金叉"
elif prev_ma5 >= prev_ma10 and ma5 < ma10:
return "MA 死叉"
return "无"
步骤 5:创建报告生成模块
文件 : ~/.openclaw/skills/stock-report/professional_report.py
python
#!/usr/bin/env python3
# 专业报告生成 - 完整版晨间投研日报
def generate_report():
report = f"""# 沪深 300 晨间多因子投研日报(完整版)
**报告日期**: {datetime.now().strftime("%Y年%m月%d日")}
---
## 一、核心摘要
- **大盘定性**: 昨日市场呈现【放量】震荡【上行】
- **今日预判**: 预计今日早盘将【高开】
## 二、前一日大盘趋势复盘
### 1. 指数表现
| 指数 | 收盘价 | 涨跌幅 |
|------|--------|--------|
| 沪深 300 | 3577.0 | +2.20% |
## 三、板块与热点行情解析
### 领涨板块(Top 5)
## 四、沪深 300 多因子量化筛选模型
## 五、个股技术面分析
### 1. 金叉股票汇总
### 2. 死叉股票汇总
### 3. 最具上涨潜力的 10 只股票
### 4. 最有可能下跌的 10 只股票
## 六、重点推荐股票详细分析
## 七、今日操作策略与风险提示
"""
with open(output_file, "w", encoding="utf-8") as f:
f.write(report)
步骤 6:创建钉钉推送模块
文件 : ~/.openclaw/skills/stock-report/dingtalk_push.py
python
#!/usr/bin/env python3
# 钉钉机器人推送脚本
import requests
import os
DINGTALK_WEBHOOK = os.getenv("DINGTALK_WEBHOOK", "")
def push_to_dingtalk(content):
"""推送到钉钉"""
if not DINGTALK_WEBHOOK:
return False, "未配置 Webhook"
payload = {
"msgtype": "markdown",
"markdown": {
"title": "📊 股票投资日报",
"content": content
},
"at": {"isAtAll": True}
}
response = requests.post(DINGTALK_WEBHOOK, json=payload, timeout=10)
if response.status_code == 200:
result = response.json()
if result.get("errcode") == 0:
return True, "推送成功"
return False, "推送失败"
五、核心代码解析
5.1 多因子量化模型
python
FACTOR_WEIGHTS = {
"技术面因子": 0.35, # 趋势、动量、MACD、RSI
"量能因子": 0.25, # 成交量、量价配合
"市场情绪因子": 0.25, # 行业热度、龙头效应
"风险控制因子": 0.15 # 波动率、回撤控制
}
composite_score = (
tech_score * 0.35 +
volume_score * 0.25 +
sentiment_score * 0.25 +
risk_score * 0.15
)
5.2 金叉/死叉识别算法
python
def identify_cross(closes, ma_short=5, ma_long=10):
"""识别 MA 金叉/死叉"""
ma5 = np.mean(closes[-5:])
ma10 = np.mean(closes[-10:])
prev_ma5 = np.mean(closes[-11:-6])
prev_ma10 = np.mean(closes[-11:-1])
if prev_ma5 <= prev_ma10 and ma5 > ma10:
return "MA 金叉"
elif prev_ma5 >= prev_ma10 and ma5 < ma10:
return "MA 死叉"
return "无"
5.3 潜力股评分模型
python
def calculate_potential_score(stock):
"""计算潜力评分 (0-100)"""
score = 50 # 基础分
if stock["MACD 信号"] == "MACD 金叉":
score += 15
elif stock["MACD 信号"] == "MACD 死叉":
score -= 15
if stock["MA 信号"] == "MA 金叉":
score += 10
elif stock["MA 信号"] == "MA 死叉":
score -= 10
if stock["涨跌幅"] > 3:
score += 10
elif stock["涨跌幅"] > 1:
score += 5
if stock["量比"] > 1.5 and stock["涨跌幅"] > 0:
score += 5
return min(100, max(0, score))
六、定时任务配置
6.1 配置 Cron 任务
bash
# 1. 数据采集 - 每日 8:00
openclaw cron add --name "股票数据采集" \
--schedule "0 8 * * 1-5" \
--command "python3 ~/.openclaw/skills/stock-data-collector/fetch_hs300_sina.py"
# 2. 报告推送 - 每日 9:00
openclaw cron add --name "股票报告推送" \
--schedule "0 9 * * 1-5" \
--command "python3 ~/.openclaw/skills/stock-report/professional_report.py && python3 ~/.openclaw/skills/stock-report/dingtalk_push.py"
6.2 OpenClaw Cron 配置
python
cron.add({
"name": "股票数据采集",
"schedule": {"kind": "cron", "expr": "0 8 * * 1-5", "tz": "Asia/Shanghai"},
"payload": {"kind": "agentTurn", "message": "📊 股票数据采集任务已触发"},
"sessionTarget": "isolated"
})
cron.add({
"name": "股票报告推送",
"schedule": {"kind": "cron", "expr": "0 9 * * 1-5", "tz": "Asia/Shanghai"},
"payload": {"kind": "agentTurn", "message": "📬 股票报告推送任务已触发"},
"sessionTarget": "isolated"
})
七、钉钉推送配置
7.1 创建钉钉机器人
- 打开钉钉群聊
- 点击 群设置 → 智能群助手
- 点击 添加机器人 → 选择 自定义
- 配置安全设置(推荐:自定义关键词)
- 添加关键词:
股票、日报、投资
- 添加关键词:
- 复制 Webhook 地址
7.2 配置环境变量
bash
# 永久配置(推荐)
echo 'export DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxx"' >> ~/.bashrc
source ~/.bashrc
7.3 测试推送
bash
cd ~/.openclaw/skills/stock-report
python3 dingtalk_push.py
八、最终效果展示
8.1 报告结构
markdown
# 沪深 300 晨间多因子投研日报(完整版)
一、核心摘要
- 大盘定性
- 今日预判
二、前一日大盘趋势复盘
- 指数表现
- 资金面分析
- 情绪与技术面
三、板块与热点行情解析
- 领涨板块 Top 5
四、沪深 300 多因子量化筛选模型
- Top10 推荐股票
五、个股技术面分析
- 金叉股票汇总
- 死叉股票汇总
- 最具上涨潜力 Top 10
- 最有可能下跌 Top 10
六、重点推荐股票详细分析
- Top5 详细分析
七、今日操作策略与风险提示
- 仓位建议
- 风险提示
8.2 钉钉推送效果
📊 股票投资日报
日期:2026-04-01
大盘趋势:🟢 上涨
🎯 Top5 推荐股票
| 排名 | 代码 | 名称 | 现价 | 涨跌幅 | 得分 |
|------|------|------|------|--------|------|
| 1 | 601600 | 中国铝业 | 14.72 元 | +5.78% | 90.0 |
| 2 | 601088 | 中国神华 | 49.32 元 | +4.30% | 89.8 |
| 3 | 600019 | 宝钢股份 | 7.08 元 | +2.77% | 86.8 |
| 4 | 600016 | 民生银行 | 4.00 元 | +2.81% | 85.0 |
| 5 | 600022 | 山东钢铁 | 1.72 元 | +4.47% | 84.3 |
📊 多因子模型
- 技术面因子:35%
- 量能因子:25%
- 市场情绪:25%
- 风险控制:15%
⚠️ 风险提示
股市有风险,投资需谨慎
8.3 性能指标
| 指标 | 数值 |
|---|---|
| 分析股票数 | 66 只(可扩展至 300 只) |
| 数据天数 | 60 个交易日 |
| 总记录数 | 约 4,000 条 |
| 报告生成时间 | < 2 分钟 |
| 推送成功率 | 100% |
九、总结与展望
9.1 项目总结
通过阿里云 JVS 和 OpenClaw,我们成功构建了一套自动化、专业化、智能化的股市分析系统:
| 维度 | 成果 |
|---|---|
| 自动化 | 每日自动采集、分析、推送,无需人工干预 |
| 专业化 | 多因子量化模型 + 技术面分析双重验证 |
| 智能化 | 金叉/死叉自动识别、潜力/风险股自动筛选 |
| 及时性 | 每日 9:00 前推送,为开盘决策提供支持 |
9.2 核心优势
- 低成本: 基于开源框架,无需购买昂贵数据服务
- 高灵活: 可根据需求调整因子权重、筛选条件
- 易扩展: 可轻松添加新数据源、新分析模块
- 可定制: 报告格式、推送渠道均可自定义
9.3 未来展望
- 数据源扩展: 接入更多数据源(东方财富、同花顺等)
- 模型优化: 引入机器学习模型提升预测准确率
- 回测系统: 添加历史回测功能验证策略有效性
- 可视化: 增加图表展示,提升报告可读性
- 多渠道推送: 支持邮件、微信、飞书等多渠道
9.4 使用建议
- 仅供参考: 本报告基于公开数据及量化模型生成,不构成投资建议
- 风险提示: 股市有风险,投资需谨慎
- 持续优化: 根据实际效果持续优化模型参数
- 合规使用: 遵守相关法律法规,合法合规使用
附录
A. 完整代码仓库
bash
# 代码位置
~/.openclaw/skills/stock-data-collector/
~/.openclaw/skills/stock-analyzer/
~/.openclaw/skills/stock-strategy/
~/.openclaw/skills/stock-report/
B. 相关文档
🎉 感谢阅读!祝投资顺利!
免责声明:本报告仅供参考,不构成投资建议。股市有风险,投资需谨慎。