【AI+量化实战 #09】收盘后还在手动复盘?用 Python 自动生成一页 AI 日报

风险提示:本文仅用于技术演示,不构成投资建议。AI 生成的摘要只是辅助工具,不能替代独立判断。

收盘后,你是不是还在打开四五个页面:指数、涨停、公告、板块涨幅榜,然后手动整理成一段话?

这件事完全可以交给代码。今天的文章教你用 Python 把指数快照、涨停池、公告情绪、板块异动聚合到一页 Markdown 报告里,再用规则或 LLM 生成一段自然语言摘要。

本文你将得到什么

  • 一份可直接运行的「每日 AI 复盘报告」骨架;
  • 用 8 个宽基指数计算市场温度的方法;
  • 把涨停池、公告情绪、板块领涨股结构化到报告里的代码;
  • 规则摘要 + LLM 增强两种模式;
  • 一个 Prompt 模板,可直接接入你自己的大模型。

一、为什么要把复盘做成一页报告

手动复盘的问题不是不会看,而是信息太散:

  • 指数涨了,但不知道哪个指数在领涨;
  • 涨停股很多,但看不出梯队和行业分布;
  • 公告一条一条翻,抓不住情绪倾向;
  • 板块异动看不过来,容易事后才反应过来。

把数据结构化、再让 AI 生成摘要,不是为了替代你思考,而是把「看数据」变成「读一段总结」,提高复盘效率。

二、报告骨架:四个模块

报告由四个部分组成:

  1. 市场温度:用 8 个宽基指数的平均涨跌幅判断整体强弱;
  2. 涨停情绪:拉取涨停池,看连板梯队和净流入前排;
  3. 公告情绪:对样本股的近 7 日公告打情绪标签;
  4. 板块异动:对热门板块批量拉成分股,找领涨股。

核心思路是「数据 → 指标 → 文本」。规则层先把指标翻译成固定句式,LLM 层再把这些句式润色成自然语言。

三、市场温度:从指数到标签

我们用 8 个指数代表全市场:上证指数、上证50、沪深300、中证500、深证成指、创业板指、创业板50、科创50。

import os
import pandas as pd
import mairui

licence = "LICENCE-66D8-9F96-0C7F0FBCD073" # 演示证书,演示证书(读者复制即用,无需替换)
client = mairui.Client(licence)

INDEX_CODES = {
"000001.SH": "上证指数", "000016.SH": "上证50",
"000300.SH": "沪深300", "000905.SH": "中证500",
"399001.SZ": "深证成指", "399006.SZ": "创业板指",
"399673.SZ": "创业板50", "000688.SH": "科创50",
}

index_rows = []
for code, name in INDEX_CODES.items():
snap = client.index_real_time(code=code)
index_rows.append({
"code": code, "name": name,
"pc": snap["pc"], "cje": snap["cje"],
})

拿到涨跌幅后,按平均值打一个标签:

def market_temperature(index_rows):
pcs = [r["pc"] for r in index_rows]
avg = sum(pcs) / len(pcs)
up = sum(1 for x in pcs if x > 0)
down = len(pcs) - up
if avg > 1.0: label = "强势"
elif avg > 0.3: label = "偏暖"
elif avg > -0.3: label = "震荡"
elif avg > -1.0: label = "偏冷"
else: label = "弱势"
return {"avg_pc": round(avg, 2), "up_count": up, "down_count": down, "label": label}

运行结果示例(示例数据,非实时):

指数 涨跌幅% 成交额(亿)
创业板50 +1.23 1761.7
创业板指 +1.12 5564.7
深证成指 +0.45 11524.7
中证500 +0.28 4089.9
沪深300 +0.04 5497.7
上证指数 +0.01 9903.7
科创50 -0.00 988.9
上证50 -0.41 1523.7

市场温度:偏暖,平均涨跌幅 +0.34%,6 只指数上涨、2 只下跌。

四、涨停情绪:不只是数涨停个数

涨停池的字段很丰富:代码、名称、连板数、净流入、封板时间、炸板次数、行业等。我们可以按连板数和净流入排序,找出梯队前排。

date 格式为 YYYY-MM-DD;非交易日可回退到最近一个交易日

pool = client.limit_up_pool(date="2026-08-14")
top = sorted(pool, key=lambda x: (x["lbc"], x["zj"]), reverse=True)[:3]
for r in top:
print(f"{r['dm']} {r['mc']}:{r['lbc']} 连板,净流入 {r['zj']/1e4:.1f} 万")

示例输出:

300862 蓝盾光电:5 连板,净流入 3128.2 万
001260 坤泰股份:3 连板,净流入 33699.0 万
002172 澳洋健康:3 连板,净流入 13626.0 万

这比单纯说「今天 63 只涨停」更有信息量。

五、公告情绪:低成本文本信号

公告情绪我们沿用第 #02 篇的关键词法:正面词命中 +1,负面词命中 -1。

POS = ("增持","回购","中标","重大合同","预增","预盈","分红","送转","权益分派")
NEG = ("减持","预亏","预降","退市","立案调查","处罚","债务逾期","亏损")

def score_sentiment(title):
pos = sum(1 for w in POS if w in title)
neg = sum(1 for w in NEG if w in title)
return 1 if pos > neg else (-1 if neg > pos else 0)

items = client.stock_announcement(code="600519", lt=5)
for item in items:
print(score_sentiment(item["zt"]), item["zt"])

示例统计(6 只样本股近 7 日):正面 1 条、中性 7 条、负面 0 条,整体公告情绪偏正面。

关键词法轻量可解释,升级路径可以换成 LLM 或 FinBERT。

六、板块异动:用批量接口抓领涨方向

先拿板块成分股,再用 stock_ssjy_more 批量拉行情,可以算出板块平均涨跌幅和领涨股。

detail = client.sector_detail(sector_name="GN半导体")
stocks = detail["stocks"][:10]
codes = [s["dm"].split(".")[0] for s in stocks]
records = client.stock_ssjy_more(stock_codes=",".join(codes))

按涨跌幅排序

leader = max(records, key=lambda x: x["pc"])
print(f"半导体领涨:{leader}")

注意:stock_ssjy_more 返回的字段里没有股票名称,名称需要从 sector_detail 的成分股列表里自己映射。

示例结果:

板块 领涨股 涨跌幅%
半导体 盈新发展 +10.18
人工智能 特发信息 +5.00
新能源 冰山冷热 +1.02
机器人 深科技 +1.72
低空经济 特发信息 +5.00

七、把模块拼成一页报告

把上面的结果按 Markdown 拼起来,就是一份复盘报告骨架:

每日 AI 复盘报告 · 2026-08-14

一、市场温度:偏暖(平均涨跌幅 +0.34%)

...
### 二、涨停情绪(63 只涨停)
...
### 三、公告情绪
...
### 四、板块异动(领涨方向)
...

脚本会把报告保存为 daily_report.md,方便你每天收盘后自动跑一遍。

八、LLM 增强:从骨架到自然语言

把结构化的市场数据传给 LLM,Prompt 可以这样写:

你是一名市场复盘助手。请根据以下数据,用 3~5 句话生成一段市场摘要。

市场温度:偏暖,平均涨跌幅 +0.34%
主要指数:
- 创业板50 +1.23%
- 创业板指 +1.12%
- 上证50 -0.41%
涨停池数量:63
近 7 日公告情绪:正面 1 条 / 负面 0 条

要求:不要给出买入/卖出建议,控制在 120 字以内。

如果你的环境没有配置 LLM_API_KEY 和 LLM_BASE_URL,脚本会自动退回规则摘要,保证可复现。

九、完整可运行脚本

依赖安装:

pip install mairui pandas numpy requests

核心初始化:

import os
import mairui

licence = "LICENCE-66D8-9F96-0C7F0FBCD073" # 演示证书,演示证书(读者复制即用,无需替换)
client = mairui.Client(licence)

脚本已整理到 Demo 目录,包含:

  • load_index_snapshot():拉指数快照;
  • market_temperature():计算市场温度;
  • load_limit_up_pool():拉涨停池;
  • load_announcement_sentiment():公告情绪;
  • load_sector_leaders():板块领涨股;
  • rule_summary() + llm_summary_prompt():规则/LLM 摘要。

十、使用边界与常见坑

  1. 指数快照非盘中实时:收盘后 15:00 左右数据才完整,盘中可能缺失部分字段;
  2. 涨停池日期要回退:非交易日或早盘数据可能为空,脚本应自动回退到最近交易日;
  3. 公告关键词法有噪声:同一公告标题可能同时命中增持和减持,需要人工复核;
  4. 批量接口不返回名称:板块领涨股的名称必须从 sector_detail 映射,不能直接从 stock_ssjy_more 取;
  5. LLM 不能预测股价:摘要只是帮你整理已知信息,不要把它当成交易信号。

小结

把复盘做成一页报告,本质是把「零散的数据查看」变成「结构化的信息消费」。规则层保证稳定输出,LLM 层提升可读性,两者结合可以每天自动产出一份可读的市场摘要。

下篇预告:【AI+量化实战 #10】用 LLM 做市场状态分类:趋势 / 震荡 / 恐慌的文本化判断。


代码与接口文档参考:https://github.com/MaiRuiApi

posted @ 2026-09-13 07:29  量化分析码农  阅读(22)  评论(0)    收藏  举报