Python实战:解析earning transcript并计算RSI捕捉大模型趋势
发布时间:2026/9/4 23:26:46来源:尧图网络
最近在跟踪大模型公司动态时很多朋友都会留意智谱Zhipu团队的公开分享包括发布会、技术博客以及广义上的 earning transcript。所谓 earning transcript通常指公司在季度业绩交流会上管理层与分析师之间的对话记录。对于 AI 公司来说这类文本的价值不只在财务数字更在于管理层的技术路线表态尤其是“The next-generation……”这种句式后面跟着的方向往往是判断下一代模型投入重点的关键线索。这篇文章会以一个贴近智谱这类大模型公司的模拟 transcript 为例子完整演示如何用 Python 对其进行解析、发言人识别、关键词定位和上下文切片并顺带计算 RSI 相对强弱指标把事件信号与市场情绪放到同一张图里观察。整个过程适合对文本挖掘、AI 行业研究、Python 数据分析感兴趣的开发者。1. 为什么财报电话会议记录值得技术人关注1.1 earning transcript 是什么earning transcript 可以简单理解成一次“如实记录的电话会议文字稿”。上市公司或准上市公司在发布季度业绩后通常会组织管理层与分析师、投资者的交流。交流内容包括财务数据回顾、业务进展、战略计划以及问答环节。问答环节尤其值得关注因为分析师往往会追问那些新闻稿里不会主动写出来的细节。对普通开发者来说财报电话会议听起来偏金融但如果关注的是 AI 公司transcript 里往往还藏着非常硬核的技术信息。管理层可能会谈到下一代模型采用什么训练思路、推理成本优化到什么程度、开源计划如何推进、Agent 能力在哪个场景率先落地。这些信息比单纯看 benchmark 榜单更能反映一家公司的技术资源配置方向。1.2 智谱与大模型行业的“下一代”叙事智谱是国内大模型领域有代表性的团队之一围绕 GLM 系列模型构建了比较完整的技术栈包括基座模型、开源权重、Agent 产品和企业级部署方案。观察这类公司的发展不能只看单一指标因为大模型竞争已经从前两年的“参数规模竞赛”进入更多维度的阶段。最近行业讨论里高频出现的“next-generation”描述通常涵盖几个方向更强的推理能力、更长的上下文处理、更可靠的工具调用、多模态输入输出、以及更低的部署和推理成本。真正落到一家公司的 transcript 里往往能听出它对哪个方向投入最多。比如管理层反复提到“Agent loop”“tool use”“multimodal understanding”那说明下一代产品大概率会往智能体方向倾斜。虽然智谱具体下一代会发布什么最终要以官方公开信息为准但通过文本信号提前建立判断框架是一种值得练习的能力。1.3 RSI 信号在事件跟踪中的作用RSI 全称 Relative Strength Index中文常译为相对强弱指标是技术分析中用来衡量一段时间内上涨下跌动量的指标。它并不会直接告诉你“某家公司下一代模型能不能成”但当你把事件文本和技术面数据放到一起看时RSI 可以帮助回答另一类问题市场对这个事件的预期是否已经过热股价或相关指数是否处于超买、超卖状态。举个例子如果某 AI 公司在电话会议上释放了“next-generation model 即将开放测试”的信号开发者社区可能沸沸扬扬但相关股票或概念指数的 RSI 可能已经进入 70 以上的超买区间。这时候再追高可能就买在了情绪的高点。反过来如果事件非常积极RSI 却长期处于 30 以下的超卖区域说明市场可能还没有充分定价早期技术信号这时的观察窗口更有想象力。2. 从文本到信号分析流程拆解2.1 信号提取链路把一段 transcript 变成可视化信号核心链路可以拆成四步。第一步是文本清洗。原始文本可能来自 PDF、网页或数据平台里面存在大量换行、空格、HTML 标签、发言头衔等噪声需要先统一格式。第二步是发言人结构化。电话会议参与者通常包括 CEO、CFO、CTO、分析师等角色。把“谁说了什么”拆成独立字段后续才能按角色过滤。比如公司内部人对技术细节的表述与分析师追问的“时间线”“商业化进度”在语义上是不同的。第三步是关键词定位。建立一组与“下一代模型”相关的关键词比如 next-generation、GLM、reasoning、multimodal、agent、open source、API pricing然后统计关键词出现次数定位到它周围的上下文句子。第四步是时间线融合。把文本事件标注到时间序列上比如股票价格序列或概念指数序列再叠加 RSI 指标观察事件前后的动量变化。2.2 文本里的三类信号从 transcript 里提取信号时建议把信息分成三类避免把所有表述都当成同等权重的事实来处理。第一类是事实信号例如“公司已经训练完成某个规模的模型”“开放了某个 API 公测”。这类信息通常比较明确技术人可以据此跟进相关产品。第二类是方向信号例如“我们将更多精力投入到推理能力”“下一代架构引入了更灵活的 Agent loop”。这类表述不一定有具体时间表但往往代表着真金白银的研发资源分配方向。第三类是情绪信号例如“我们对未来非常乐观”“当前仍处于早期阶段”“今天不会分享具体指引”。这类表述代表管理层态度的冷热程度需要结合公司所处阶段来解读。在后面的 Python 实战里我们会重点处理方向信号和关键词频率。2.3 为什么用代码而不是凭感觉读一段 transcript 少则几千字多则上万字靠人眼扫读容易漏掉关键信息。最常见的问题是某个词在全文中其实被多次提起但第二次、第三次出现时因为没有加粗或没有处在标题位置很快就被大脑过滤了。用代码处理的最大优势是可复现。不同的人用同一份文本执行相同的脚本应该得到相同的关键词列表、上下文切片和频率统计。这样后续做票选、做周报、做投研纪要都会比“我好像觉得管理层提了很多次 Agent”更可信。3. 环境准备与模拟数据说明3.1 运行环境本文示例使用 Python 3推荐 3.9 及以上版本。主要依赖有 pandas、numpy 和 matplotlib如果只需要跑文本解析部分则只依赖 Python 标准库即可。可以使用 pip 安装依赖pip install pandas numpy matplotlib操作环境可以是 Windows、macOS 或 Linux。为了便于管理依赖也建议先在项目目录里创建虚拟环境python -m venv venv source venv/bin/activateWindows 环境下激活命令为venv\Scripts\activate。3.2 数据与免责说明需要特别说明的是本文使用的 transcript 文本是模拟数据并不代表智谱或其他任何一家公司的真实业绩会记录。代码中不会涉及真实财务数字也不会对任何公司的当期业绩作判断。真实场景中你应该从公司官方投资者关系页面或合规数据平台获取 transcript并严格遵守平台使用条款。模拟 transcript 存放在data/sample_transcript.txt中内容结构模仿典型的业绩会问答格式。Operator: Good day, everyone, and welcome to the quarterly review call. Today we focus on technology progress rather than financial details. I will hand over to our CEO. CEO: Thank you. Over the past few months, we shipped several model updates and improved the developer experience around our GLM series. The next-generation model is now in internal evaluation. We are spending more time on reasoning capability, tool use, and multimodal understanding. We see strong demand from enterprise users who want to deploy models in private environments, so we are also expanding our open-source ecosystem. CFO: From a business perspective, we cannot provide new guidance today. The team continues to invest in research and infrastructure. We believe the priority is long-term capability, not short-term margin. I will not discuss any specific financial figures on this call. CTO: Let me add a technical note. Our next-generation architecture introduces a more flexible agent loop. It can call external tools, browse web pages, and summarize longer context. We also improved safety alignment during post-training. The open source community has been very supportive of our GLM releases. QA Participant: Can you share the timeline? CEO: We do not share an exact release date today. The next-generation rollout will follow a phased approach, starting with API preview and then open weights.这段模拟文本没有包含任何真实财务数据。我们可以通过这样的结构演示完整的数据处理流程。4. 实战解析 transcript 并提取下一代信号4.1 读取与初步清洗首先把文本读取到内存中并做简单清洗。这里要处理两个问题一是空行过多二是每个段落的缩进和换行不一致。新建src/parse_transcript.py文件。# src/parse_transcript.py from pathlib import Path def load_text(file_path: str) - str: text Path(file_path).read_text(encodingutf-8) return text def clean_text(text: str) - str: lines [] for line in text.splitlines(): line line.strip() if line: lines.append(line) return \n.join(lines) if __name__ __main__: raw_text load_text(data/sample_transcript.txt) cleaned_text clean_text(raw_text) print(cleaned_text[:500])代码思路是先用Path.read_text读取文件然后按行去掉首尾空格同时过滤空行。这样后续处理会比较稳妥。4.2 按发言人切分段落电话会议文本虽然结构多样但常见格式是“姓名, 职务: 发言内容”或“姓名 - 职务: 发言内容”。我们使用一个简单的正则表达式把段落拆成发言人和正文两部分。# src/parse_transcript.py import re def split_speech_blocks(text: str): pattern re.compile( r^(?Pspeaker[^:]):(?Pcontent.*)$, re.MULTILINE | re.DOTALL, ) blocks [] for match in pattern.finditer(text): speaker match.group(speaker).strip() content match.group(content).strip().replace(\n, ) blocks.append({speaker: speaker, content: content}) return blocks上面的正则会匹配“任意非冒号字符 冒号 内容”其中^和$配合MULTILINE可以匹配每一行。实际操作中如果文本里有人用“name - title:”这种格式需要把正则在冒号前继续放宽。这里为了示例清晰直接用冒号分隔。4.3 关键词统计建立一组关键词后我们对每个发言人内容进行词频统计。这里采用简单的大小写归一化。# src/keyword_stats.py from collections import Counter KEYWORDS [ next-generation, GLM, reasoning, multimodal, agent, tool use, open source, API, ] def count_keywords(text: str, keywords: list[str]) - dict[str, int]: lower_text text.lower() counter Counter() for kw in keywords: counter[kw] lower_text.count(kw.lower()) return counter if __name__ __main__: from parse_transcript import load_text, clean_text, split_speech_blocks raw load_text(data/sample_transcript.txt) clean clean_text(raw) blocks split_speech_blocks(clean) full_text .join(b[content] for b in blocks) result count_keywords(full_text, KEYWORDS) for k, v in sorted(result.items(), keylambda x: x[1], reverseTrue): print(f{k}: {v})这段代码会把全文拼接成一个连续字符串然后统计每个关键词出现的次数。模拟结果大致是next-generation: 3 GLM: 3 agent: 2 reasoning: 1 open source: 1 API: 1 multimodal: 1 tool use: 1虽然关键词统计简单但它能让你一眼看出管理层这个季度的叙事重心。4.4 上下文切片找到“next-generation”前后的句子单纯统计次数不足以回答“管理层到底说了什么”所以还要提取关键词附近的上下文窗口。在真实分析中我们关心的是“The next-generation model is now in internal evaluation”和“The next-generation rollout will follow a phased approach”这样能体现时间阶段与行动计划的句子。# src/context_view.py import re def find_contexts(text: str, keyword: str, window: int 120): lower_text text.lower() keyword_lower keyword.lower() contexts [] for match in re.finditer(keyword_lower, lower_text): start max(0, match.start() - window) end min(len(text), match.end() window) snippet text[start:end] snippet_one_line snippet.replace(\n, ) contexts.append(snippet_one_line) return contexts这里的思路是用正则定位每个关键词出现的位置再向左右各取一定字符作为上下文。窗口大小可以根据实际需要调整如果只关心句子可以设置 150 到 200 个字符如果想看完整段落可以按句号或换行符切片。4.5 组装一个完整脚本把上述能力合到一起输出每个发言人、关键词次数以及与“next-generation”相关的上下文。# src/report.py from pathlib import Path from collections import Counter import re KEYWORDS [ next-generation, GLM, reasoning, multimodal, agent, tool use, open source, API, ] def load_text(file_path: str) - str: return Path(file_path).read_text(encodingutf-8) def clean_text(text: str) - str: lines [line.strip() for line in text.splitlines() if line.strip()] return \n.join(lines) def split_speech_blocks(text: str): pattern re.compile(r^(?Pspeaker[^:]):(?Pcontent.*)$, re.MULTILINE | re.DOTALL) blocks [] for match in pattern.finditer(text): speaker match.group(speaker).strip() content match.group(content).strip().replace(\n, ) blocks.append({speaker: speaker, content: content}) return blocks def find_contexts(text: str, keyword: str, window: int 120): lower_text text.lower() keyword_lower keyword.lower() contexts [] for match in re.finditer(keyword_lower, lower_text): start max(0, match.start() - window) end min(len(text), match.end() window) snippet text[start:end].replace(\n, ) contexts.append(snippet) return contexts if __name__ __main__: raw load_text(data/sample_transcript.txt) clean clean_text(raw) blocks split_speech_blocks(clean) print( 发言人分段 ) for block in blocks: speaker block[speaker] content block[content] print(f[{speaker}] {content[:60]}...) full_text .join(b[content] for b in blocks) print(\n 关键词频率 ) counter Counter() for kw in KEYWORDS: counter[kw] full_text.lower().count(kw.lower()) for k, v in counter.most_common(): print(f {k}: {v}) print(\n next-generation 上下文 ) for ctx in find_contexts(full_text, next-generation, window80): print( ..., ctx, ...) print()在模拟数据上运行这段代码会得到每段发言人内容、关键词频率以及所有“next-generation”附近的上下文。你可以把这段脚本直接迁移到自己的真实文本分析项目里只要把文件路径替换掉即可。5. 实战计算并观察 RSI 信号5.1 RSI 的计算原理RSI 的计算并不复杂。先选定一个周期常用的是 14 天。然后计算这段周期内的平均上涨幅度和平均下跌幅度。公式可以写作RS 平均上涨幅度 / 平均下跌幅度 RSI 100 - 100 / (1 RS)当 RSI 超过 70 时通常进入超买区间当 RSI 低于 30 时通常进入超卖区间。需要注意的是RSI 是一个动量指标它描述的是“最近涨跌力量的相对强弱”而不是“价格已经太高或太低”。在事件驱动的分析中它更适合作为辅助观察工具。对 AI 行业来说分析对象不一定是某只个股。如果关注的公司没有上市可以观察相关概念指数、ETF也可以用每天新增的相关新闻数量、GitHub Star 数量、模型 API 调用热度等时间序列作为替代计算其 RSI。这里的核心是“一段时间序列 一个事件标注”。5.2 Python 计算 RSI新建src/rsi_demo.py用 pandas 计算 RSI。# src/rsi_demo.py import pandas as pd import numpy as np def compute_rsi(close: pd.Series, period: int 14) - pd.Series: delta close.diff() gain delta.clip(lower0) loss -delta.clip(upper0) avg_gain gain.ewm(alpha1 / period, min_periodsperiod, adjustFalse).mean() avg_loss loss.ewm(alpha1 / period, min_periodsperiod, adjustFalse).mean() rs avg_gain / avg_loss rsi 100 - 100 / (1 rs) rsi rsi.where(~np.isinf(rsi), 100.0) return rsi这里使用了指数移动平均而不是简单移动平均。这样会让 RSI 对最近的变化更敏感也是很多技术分析库的默认做法。需要注意前 period 个周期由于数据不足会出现 NaN需要结合上下文处理。下面用模拟数据演示。这里生成一组随机的“价格序列”实际项目中可以替换成相关指数或个股的日线收盘价。# src/rsi_demo.py import matplotlib.pyplot as plt np.random.seed(42) n 120 date_range pd.date_range(2025-01-01, periodsn, freqD) vol np.random.normal(0, 1, n).cumsum() close pd.Series(100 vol, indexdate_range) rsi compute_rsi(close) print(rsi.tail())由于这是随机种子生成的演示序列不同电脑运行结果是一致的。如果你运行这段代码会看到最后几天的 RSI 值在 40 到 70 之间波动具体数值取决于随机序列走势。5.3 把 transcript 事件叠加到 RSI 图中接下来在序列的第 80 天附近模拟一次“下一代模型发布”事件然后绘制价格和 RSI 的双轴图观察事件前后的动量变化。# src/rsi_demo.py fig, axes plt.subplots( 2, 1, figsize(10, 7), sharexTrue, ) event_date date_range[80] axes[0].plot(close.index, close.values, linewidth1.2, colorsteelblue, labelsimulated price) axes[0].axvline(event_date, colororange, linestyle--, labelnext-gen signal) axes[0].set_ylabel(Price) axes[0].legend(locbest) axes[1].plot(rsi.index, rsi.values, linewidth1.2, colorpurple) axes[1].axhline(70, colorred, linestyle--, linewidth0.8) axes[1].axhline(30, colorgreen, linestyle--, linewidth0.8) axes[1].axvline(event_date, colororange, linestyle--) axes[1].set_ylabel(RSI) axes[1].set_xlabel(Date) plt.tight_layout() plt.savefig(figs/rsi_event.png, dpi120) print(图表已保存到 figs/rsi_event.png)运行前需要先创建figs目录或者把保存路径改成当前目录。事件发生之后可以重点观察 RSI 是否快速进入 70 以上或者是否在事件公布的次日出现钝化。在示例图中事件发生在中期之后 RSI 会随着价格波动出现一轮拉升。这里的分析价值在于text signal 告诉我们要“关注下一代发布了”RSI 则告诉我们“当前市场的情绪温度已经到什么位置”。两者结合比单独看新闻更有层次。6. 常见问题与排查思路实际处理 transcript 和 RSI 时会遇到不少细节问题下面整理一张排查表。问题现象常见原因解决思路RSI 前 14 个值都是 NaN周期不足无法计算平均涨跌幅使用min_periods或去掉前 14 个空值数据量不足时增加采样频率正则提取发言人不准transcript 除了冒号还可能包含破折号、职务括号根据真实格式调整split_speech_blocks正则或先用人工抽样校对“next-generation”漏检存在 “Next generation” 或 “next generation” 等不同拼写统计前统一变成小写将关键词列表扩充为多个变体从网页复制文本后出现乱码原文本编码不是 UTF-8或网页自带 HTML 实体优先使用官方数据文件乱码时检查文件编码并用 BeautifulSoup 清洗 HTML关键词统计数量偏高同一个单词出现在页眉页脚或重复声明中只统计发言人字段内的 content排除 Operator 之外的非内容噪声RSI 显示 100 或 0周期内全涨或全跌导致分母为 0在代码中把 inf 替换为 100或直接检查行情数据是否停牌导致价格不变事件后 RSI 依然继续下跌市场此前已提前定价或事件低于预期不要只依赖单一 RSI 信号需要结合成交量、新闻重复度、同业走势一起判断直接下载平台 transcript 触发访问限制未遵守平台 robots 或使用条款优先使用公司 IR 页面与合规数据源有条件的情况下采购专业数据服务排错时应按“先确认数据是否正确再怀疑代码逻辑”的顺序。很多看起来是算法的问题最终都出在原始文本格式和行情数据质量上。7. 工程化建议与风险提示7.1 数据合规与研究边界把 transcript 分析做成工具时数据来源非常关键。公司投资者关系页面、交易所信息披露平台是相对稳妥的渠道。第三方财经数据平台也有整理好的 transcript但使用前要认真阅读条款不能把订阅数据再次公开传播。在分析中引用管理层原话时建议提供原文片段并注明来源及日期避免断章取义。特别是“next-generation”这类模糊表述一旦截掉后半句意思可能完全相反。7.2 不要把 RSI 当成预测工具RSI 是一个描述过去动量状态的指标它不负责预测未来。技术分析的有效性取决于市场环境和样本区间。在开发者实践中我更推荐把它当成一个“纪律化观察工具”而不是买卖依据。例如当 transcript 中释放出“下一阶段开源计划”这样的积极信号同时相关指数 RSI 处于 30 以下说明市场情绪可能过于悲观值得继续跟踪后续模型发布和社区反馈如果 RSI 已经高于 85那么即便文本信号再乐观短期入场也需要更高的风险承受能力。7.3 更完整的工程流水线建议如果想把这套流程做成每日自动更新的小工具建议考虑以下结构数据采集层负责读取 transcript 文件和行情文件文本处理层负责清洗、分段、关键词统计和上下文提取指标计算层负责计算 RSI、成交量等指标报表层把文本事件、关键句子和指标图输出为 HTML 报告。每一层之间尽量不要耦合。文本处理层不关心行情数据从哪个文件来指标计算层也不应该被 transcript 格式变化影响。这样当新一家公司的 transcript 格式发生变化时只需修改清洗函数即可。7.4 关于智谱等国产大模型公司的研究提醒研究国产大模型公司时除了电话会议文本还可以同步关注模型开源仓库更新、技术论文、API 定价页面、开发者社区讨论和权威评测榜单。开源仓库的 commit 频率和 issue 讨论往往比正式新闻稿更早反映研发动向。需要注意的是公司管理层在公开会议上的表态通常有一定框架语气乐观不等于所有目标都会按期落地。过度的叙事信号要打折看真正的产品能力要看是否能通过公开 API、开源模型权重或客户案例验证。8. 下一步可以继续完善的方向到这里我们已经完成了一条从 earning transcript 到关键词信号再到 RSI 动量指标的完整实验链路。你至少可以学到三件事第一用 Python 清洗电话会议记录并把发言人发言拆成结构化字段第二通过关键词频率和上下文窗口找出“next-generation”相关线索第三用 RSI 给事件热度增加一个动量视角。如果你想继续深入可以尝试把关键词列表替换成“Agent”“多模态”“推理成本”等更细分的方向然后对不同季度的多份 transcript 做同期对比观察管理层关注度的迁移曲线。也可以把文本情绪得分与 RSI 做交叉分析研究“语气转暖 技术上穿 50”之后相关指数是否更容易出现一段持续性行情。最后还是要强调一句实际操作建议文本信号提供的是“研究线索”技术指标提供的是“温度计读数”真正做判断时需要额外结合官方披露、一手体验和风险控制规则。如果这篇文章对你有帮助建议收藏下来下次拿到新的 transcript 时可以照着跑一遍流程。
网站建设高端定制企业官网