1. 项目概述:为什么需要一个盘前分析Agent?
做美股交易的朋友,尤其是做日内或波段的朋友,应该都体会过盘前那一个小时的紧张感。新闻、财报、异动、大盘期货、热门个股的盘前走势……信息像潮水一样涌来,你需要在开盘前快速消化,形成交易预案。过去几年,我尝试过各种方法:手动刷财经网站、订阅付费数据流、甚至写一些简单的脚本去抓取关键数据。但问题始终存在:信息是碎片化的,决策是感性的,复盘是模糊的。你很难说清,今天赚的这笔钱,到底是因为你准确预判了财报,还是仅仅因为运气好,赶上了大盘的东风。
这就是我决定动手搭建这个“美股盘前分析和量化指标Agent”的核心动机。我不想再依赖模糊的感觉,而是希望构建一个系统化的、可量化的分析框架。这个Agent,我称之为“OpenClaw”,它的目标很明确:在美股每个交易日的盘前(通常是美东时间早上4点到9点30分),自动完成信息收集、数据处理、指标计算和初步研判,最终给我一份结构化的、带有量化评分的分析报告,作为我开盘决策的重要参考。
“从0到1”意味着我们不依赖任何现成的、封装好的商业分析平台,而是从最基础的数据源和代码开始搭建。整个过程会涉及到数据获取(如雅虎财经、Alpha Vantage、新闻API)、核心金融指标的计算(如波动率、相对强弱、资金流向)、以及将这些指标融合成一个可操作的“信号”的决策逻辑。最终,这个Agent不仅能告诉我“发生了什么”,更能通过历史回测告诉我,基于它产生的信号进行交易,大概会有怎样的胜率和盈亏比。这才是“可量化”的真正含义——将分析过程从艺术变为工程。
2. 核心架构与工具选型:为什么是OpenClaw?
给这个项目起名“OpenClaw”,是希望它像一只敏捷的爪子,能从纷繁复杂的市场信息流中,精准地抓取出有价值的部分。整个系统的架构设计围绕“数据流水线”和“决策引擎”两个核心展开。
2.1 技术栈选型背后的考量
选择合适的技术栈,是项目能否顺利推进和后期易于维护的关键。我的选型原则是:成熟、轻量、生态丰富,并且适合快速原型开发和数据科学任务。
编程语言:Python
- 为什么是Python?这几乎是量化金融领域的“普通话”。Pandas、NumPy用于数据处理和计算,有着无与伦比的便捷性;
yfinance、alpha_vantage等库让获取免费的市场数据变得异常简单;scikit-learn、statsmodels为后续更复杂的模型提供了可能。其简洁的语法也让我们能更专注于业务逻辑,而非语言细节。
- 为什么是Python?这几乎是量化金融领域的“普通话”。Pandas、NumPy用于数据处理和计算,有着无与伦比的便捷性;
数据获取层:yfinance + NewsAPI + 自制爬虫
- yfinance:获取股票历史价格、盘前报价、基本面数据(如市值、市盈率)的主力。它免费、稳定,虽然有时有速率限制,但对于盘前分析这种低频调用场景完全够用。
- NewsAPI 或 RSS 订阅:用于抓取指定公司的相关新闻头条。这里的关键不是做复杂的自然语言处理情感分析(初期),而是识别“有无重大新闻”以及新闻的来源权重(例如,华尔街日报的报道和某个小众博客的报道,权重不同)。
- 自制爬虫(备用):对于一些特殊数据,如特定论坛的热度、期权异动数据(可能需要从CBOE等网站获取),可能需要编写针对性的爬虫。我会使用
requests和BeautifulSoup库,但会严格遵守网站的robots.txt并设置礼貌的请求间隔。
数据处理与计算层:Pandas + NumPy + Ta-Lib
- Pandas & NumPy:数据操作的基石。DataFrame结构完美契合时间序列数据,进行数据清洗、对齐、合并和转换。
- TA-Lib:一个技术指标计算的C语言库,有Python封装。它经过高度优化,计算上百种技术指标(如RSI, MACD, Bollinger Bands, ATR等)速度极快且准确。强烈建议通过
pip install TA-Lib安装,这是量化分析的核心武器之一。
Agent逻辑与调度:Schedule + 自定义逻辑
- Schedule:一个轻量级的Python作业调度库。我们可以用它来设置Agent每天在美东时间凌晨4点自动启动,执行一系列数据抓取和分析任务。
- 自定义逻辑:这是Agent的“大脑”。我们将编写一系列模块化的函数和类,分别负责:获取数据、清洗数据、计算技术指标、计算市场情绪指标、整合评分、生成报告。
输出与可视化:Logging + Matplotlib/Plotly + 邮件/钉钉
- Logging:详细的运行日志,便于调试和回溯。
- Matplotlib/Plotly:用于生成关键图表,如个股价格走势叠加技术指标、投资组合相关性热力图等。这些图表可以嵌入最终的报告。
- 邮件/钉钉/webhook:将最终的分析报告摘要,在开盘前通过邮件或即时通讯工具推送到我的手机。报告主体可以是一个HTML文件或PDF,包含详细数据和图表。
注意:在数据源选择上,务必遵守各平台的服务条款。免费API通常有调用频率限制,在代码中务必加入
time.sleep()等延迟,避免被封IP。对于核心交易决策,建议后期考虑接入更稳定、延迟更低的付费数据源(如IEX Cloud, Polygon.io),但项目初期免费资源完全足够验证想法。
2.2 系统工作流设计
整个Agent的工作流可以概括为以下四个阶段,这是一个清晰的“数据管道”:
触发与采集(美东时间 ~04:00 AM):
Schedule触发任务。Agent并行或串行执行:- 从
yfinance获取我关注列表(Watchlist)中所有股票的昨日收盘价、今日盘前价、成交量。 - 从
NewsAPI获取过去12小时内,关于这些股票及所在行业的关键新闻标题。 - (可选)获取标普500指数期货、恐慌指数VIX的盘前数据,用于判断大盘情绪。
- 从
处理与计算(~04:30 AM):对采集到的原始数据进行加工。
- 数据清洗:处理缺失值(例如,某只股票盘前无交易),统一时间戳,将数据整理成规整的Pandas DataFrame。
- 指标计算:这是核心环节。利用TA-Lib和自定义公式,计算每只股票的多个维度指标:
- 技术面:基于近期日线数据,计算RSI(相对强弱指数)、布林带位置、ATR(平均真实波幅)等。
- 盘面面:计算盘前涨跌幅、盘前成交量与日均成交量的比率。
- 事件面:基于新闻标题,使用关键词匹配(如“earnings beat”, “FDA approval”, “investigation”)给出一个简单的事件分数。
- 关联性:计算个股与大盘指数(如SPY)的短期相关性。
整合与评分(~05:00 AM):将上述多维指标融合成一个或几个易于理解的“信号”。
- 我采用一种加权评分卡模型。例如:
- 技术面RSI超卖(<30):+2分
- 股价触及布林带下轨:+1.5分
- 盘前放量上涨(量比>2且涨幅>3%):+2分
- 有重大利好新闻:+1.5分
- 与大盘负相关(在大盘跌时抗跌):+1分
- 每只股票会得到一个总分。同时,我会设定一个“异常波动警报”,例如盘前涨跌幅超过±10%的股票,无论总分如何,都需要被重点标注审查。
- 我采用一种加权评分卡模型。例如:
报告与推送(~05:30 AM):生成人类可读的报告。
- 报告分为两部分:摘要和详情。
- 摘要(推送至手机):列表显示总分最高的前5只潜在“做多机会”和总分最低的(或做空信号最强的)前3只“风险/做空机会”,并附上其核心理由(如“RSI超卖+放量反弹”)。
- 详情(HTML文件):包含所有关注股票的完整数据表格、关键指标图表、新闻摘要列表。这份文件会保存到本地,并作为历史档案,用于后续的策略回测和优化。
3. 核心指标量化:如何定义“机会”与“风险”?
搭建好框架后,最核心也最有趣的部分来了:我们究竟计算哪些指标,又如何将它们量化?这里没有“圣杯”,只有基于历史经验和统计的“概率优势”。我分享一套经过我实战调整的初级指标体系,它包含了技术、量价、事件三个维度。
3.1 技术指标的计算与解读
技术指标是历史价格和成交量的衍生品,帮助我们识别趋势、动量和超买超卖状态。使用TA-Lib可以一键计算,但关键在于理解其参数和适用场景。
相对强弱指数(RSI):这是我最常用的动量振荡器之一,用于识别超买超卖。
- 计算:
ta.RSI(close, timeperiod=14)。通常取14天周期。 - 量化规则:
- 超卖信号(潜在买入机会):RSI < 30。特别是当股价在盘前下跌,但RSI已进入超卖区时,可能预示着短期卖压衰竭。在我的评分卡里,RSI<30会触发一个较强的正向信号(+2分)。
- 超买信号(潜在卖出/做空机会):RSI > 70。需要结合其他指标看,在强势上涨趋势中,RSI可能长期维持在50-80之间,单纯>70并非强烈做空信号。因此,我会给RSI>70一个较弱的负向信号(-1分),但如果同时出现“顶背离”(价格创新高,RSI未创新高),则会升级为强负向信号(-2.5分)。
- 实操心得:RSI在盘整市中效果较好,在单边暴涨暴跌的行情中容易“钝化”。盘前分析时,我主要看RSI是否处于极端位置(<25 或 >75),这种位置的突破或反弹往往更有力度。
- 计算:
布林带(Bollinger Bands):由中轨(简单移动平均线)、上轨和下轨(中轨加减两倍标准差)组成,反映价格波动范围和相对位置。
- 计算:
ta.BBANDS(close, timeperiod=20, nbdevup=2, nbdevdn=2)。 - 量化规则:
- 触及或跌破下轨:通常被视为超卖,可能反弹。如果同时伴随成交量萎缩,信号更强。+1.5分。
- 触及或突破上轨:通常被视为超买,可能回调。但如果价格沿着上轨强势运行,则是趋势强劲的表现,此时不应视为做空信号。因此,单纯触及上轨给-0.5分;若同时出现缩量或RSI超买,则扣分增加。
- 布林带收窄:预示着波动率降低,可能即将出现方向性突破。这个信号本身不直接产生多空评分,但会作为一个“高关注度”标记,提示我接下来要重点观察该股票的突破方向。
- 计算:
平均真实波幅(ATR):衡量价格的波动剧烈程度,用于设置止损止盈位非常有效。
- 计算:
ta.ATR(high, low, close, timeperiod=14)。 - 量化应用:ATR本身不产生交易信号,但它是风险管理的核心。在盘前分析中,我会计算股票的当前ATR值。例如,如果某股票ATR为$5,那么我计划入场时,止损位设置就可能参考这个数值(如入场价下方1.5倍ATR)。对于盘前波动异常放大(例如,盘前波动幅度已达到昨日ATR的2倍以上)的股票,我会格外谨慎,因为这意味着今日日内波动可能极大,风险与收益并存。
- 计算:
3.2 量价关系与盘前异动
“量在价先”,成交量是确认价格变动有效性的关键。盘前时段成交量虽不如常规时段,但异动往往蕴含重要信息。
盘前涨跌幅与量比:
- 计算:
盘前涨跌幅 = (盘前价 - 昨日收盘价) / 昨日收盘价;量比 = 盘前成交量 / 过去20日平均小时成交量(折算到相同时长)。 - 量化规则:
- 放量上涨(量比>2,涨幅>3%):强烈的短期看多信号。表明有资金在盘前积极买入。+2分。
- 放量下跌(量比>2,跌幅>3%):强烈的短期看空信号。可能是利空消息驱动。-2分。
- 缩量上涨/下跌(量比<0.5):价格变动缺乏成交量支持,可持续性存疑。此类信号我会给予很低的权重或直接忽略,不纳入评分。
- 实操心得:盘前成交量数据有时不稳定,特别是对于流动性较差的股票。因此,我更关注“相对变化”而非绝对数值。比如,一只平时盘前只有几千股成交的股票,突然放量到几十万股,即使绝对量不大,也值得高度关注。
- 计算:
异常波动监控:
- 这是一个简单的过滤器。我会设置一个阈值(例如±8%)。任何盘前涨跌幅超过此阈值的股票,无论其综合评分如何,Agent都会在报告摘要中将其高亮标红,并附上简要原因(如“财报超预期”、“被做空报告狙击”)。这能确保我不会错过任何突发性的重大事件。
3.3 事件驱动的简易量化
新闻和事件对股价的短期冲击是立竿见影的。我们不需要一开始就搭建复杂的NLP模型,用规则匹配就能解决80%的问题。
- 关键词评分表:我维护一个简单的字典,将关键词映射到分数和影响方向。
event_keywords = { ‘positive‘: {‘earnings beat‘: 1.5, ‘FDA approval‘: 2.0, ‘upgrade‘: 1.0, ‘buyback‘: 0.8, ‘partnership‘: 0.7}, ‘negative‘: {‘earnings miss‘: -1.5, ‘investigation‘: -2.0, ‘downgrade‘: -1.0, ‘cut guidance‘: -1.8, ‘lawsuits‘: -1.2} } - 操作流程:Agent抓取新闻标题后,遍历标题中的单词,与评分表匹配。将所有匹配到的关键词分数累加,得到该新闻事件的初步分数。同时,根据新闻来源(如Reuters, Bloomberg权重更高),可以对分数进行微调。
- 局限性:这种方法无法理解语境。比如“Company beats earnings but guides weakly”,单纯匹配“beats”会给正分,但实际可能是利空。因此,事件分数在初期权重不宜过高,更多是作为一个“提示器”,提醒我去人工阅读那篇具体的新闻。
4. Agent决策逻辑与报告生成
当所有维度的指标都计算完毕后,我们需要一个“大脑”来整合信息,做出判断。我的设计原则是:透明、可调、不以预测绝对涨跌为目标,而是评估“概率优势”。
4.1 加权评分卡模型
这是将多维数据降维到单一可比较分数的核心方法。模型的核心是权重矩阵和评分规则表。
首先,我为每个指标类别分配一个基础权重,反映我对该类别的重视程度。
| 指标类别 | 基础权重 | 说明 |
|---|---|---|
| 技术面 | 35% | RSI,布林带位置,趋势线等 |
| 量价面 | 40% | 盘前涨跌幅、量比、异常波动 |
| 事件面 | 15% | 新闻关键词评分 |
| 大盘关联 | 10% | 与SPY的相关性(逆市强势为加分项) |
然后,为每个指标的具体状态设计评分规则。以下是一个简化示例:
| 指标 | 条件 | 得分 | 说明 |
|---|---|---|---|
| RSI | < 30 | +2 | 超卖,反弹概率增 |
| RSI | > 70 | -1 | 超买,回调风险增 |
| 布林带位置 | 价格触及下轨 | +1.5 | 支撑位附近 |
| 量价组合 | 涨幅>3% & 量比>2 | +2 | 放量上涨,动能强 |
| 新闻事件 | 有利好关键词 | +0.5 ~ +2 | 根据关键词强度浮动 |
| 大盘关联 | 大盘跌,该股平或涨 | +1 | 显示相对强势 |
最终分数计算:对于每只股票,遍历所有评分规则,将符合条件规则的得分相加,得到一个原始总分。然后,用这个原始总分去乘以该规则所属类别的基础权重(实际上是在设计规则得分时,已经隐含了权重考虑,更常见的做法是直接使用加权后的得分)。最后,将所有加权后的得分求和,得到该股票的综合机会分数。
重要提示:这个权重和评分表不是一成不变的。它应该被视为你交易哲学的量化体现。如果你是趋势交易者,可以提高量价和趋势指标的权重;如果你是价值或事件驱动者,可以提高事件面权重。最好的优化方式是基于历史数据进行回测,调整规则和权重,使得高分数股票在后续一段时间内(例如接下来5个交易日)的平均收益显著优于低分数股票。
4.2 报告生成与自动化推送
一份好的报告应该让使用者在30秒内抓住重点。我的Agent生成两份报告:
终端/日志输出(结构化数据):这是最原始的数据,用于调试和存档。它会列出所有股票,每只股票的详细指标值和计算出的综合分数。
[PRE-MARKET SCAN] 2023-10-27 05:30 EST ========================================== TICKER | PRICE | CHG% | VOL_RATIO | RSI | BB_POS | EVENT_SCORE | FINAL_SCORE -------|-------|------|-----------|-----|--------|-------------|------------- AAPL | 172.5 | +1.2%| 1.8 | 45.2| Middle | +0.5 | +0.7 TSLA | 200.3 | -4.5%| 3.2 | 28.1| Lower | -1.0 (miss) | +1.8* NVDA | 425.6 | +0.8%| 0.9 | 65.0| Upper | 0.0 | -0.4 ... (更多股票)其中,
TSLA分数较高(+1.8),主要因为RSI超卖(+2)和触及布林带下轨(+1.5),尽管有财报利空(-1.0)。星号(*)标记表示该股票触发了“高关注度”规则(如RSI<30)。HTML可视化报告(人类可读):使用
Jinja2模板引擎,将Pandas DataFrame和Matplotlib生成的图表嵌入到一个美观的HTML模板中。报告包含:- 概览仪表盘:展示市场整体状态(如上涨/下跌股票比例,平均涨跌幅)。
- 机会排行榜:按综合分数降序排列,展示Top 10和Bottom 5的股票,并列出其主要加分/减分项。
- 个股详情页(可折叠):点击股票代码,可展开查看其近期价格走势图(附上RSI、布林带等技术指标)、相关新闻列表、详细指标数值。
- 今日重点关注:列出所有触发“异常波动”或“高关注度”标记的股票。
推送摘要:使用Python的
smtplib(邮件)或requests(调用钉钉/企业微信机器人webhook)将最重要的信息在开盘前推送到手机。【OpenClaw盘前分析】2023-10-27 🟢 潜在机会(高分数): 1. TSLA (+1.8): RSI超卖+布林带支撑,尽管财报利空。 2. XOM (+1.2): 放量突破近期平台,油价上涨带动。 🔴 注意风险(低分数/异动): 1. META (-1.5): 盘前放量下跌-5%,传闻监管审查。 2. AMZN (异动): 盘前+12%,季度营收超预期。 市场情绪:中性偏多(上涨股票占比58%)。 详细报告:file:///path/to/report.html
5. 回测验证与策略迭代
一个不能验证效果的量化工具是盲目的。搭建好Agent并运行一段时间后,我们必须回答一个问题:按照它的信号操作,能赚钱吗?这就需要回测。
5.1 简易回测框架搭建
我们不需要搭建复杂的回测平台,初期可以做一个简单的“事后验证”:
- 数据记录:每天开盘前,将Agent生成的“机会排行榜”(Top N股票)和“风险榜”(Bottom M股票)记录下来,包括股票代码、综合分数、入选理由。
- 绩效追踪:追踪这些股票在后续一段时间(例如1个交易日、5个交易日)的表现。计算:
- 做多组(Top N)的平均收益率。
- 做空组/规避组(Bottom M)的平均收益率。
- 做多组 vs 做空组的收益差。
- 胜率:做多组中上涨股票的比例。
- 基准对比:将做多组的平均收益与同期大盘指数(如SPY)的收益进行对比,看是否有超额收益(Alpha)。
例如,你可以每周运行一次这样的分析:
# 伪代码:分析过去一周的信号表现 signals_df = load_from_csv(‘daily_signals_last_week.csv‘) # 加载过去5天每天的信号 performance_data = [] for date, row in signals_df.iterrows(): top_5 = row[‘top_5_tickers‘] # 当天推荐的5只股票 next_day_returns = get_returns(top_5, date, holding_days=1) # 获取它们第二天的收益率 performance_data.append(next_day_returns.mean()) # 计算平均收益 weekly_avg_return = np.mean(performance_data) weekly_win_rate = np.mean([ret > 0 for ret in performance_data]) print(f“过去一周,次日平均收益:{weekly_avg_return:.2%}, 胜率:{weekly_win_rate:.2%}“)5.2 策略迭代与优化
回测结果会给你提供优化方向:
- 如果胜率高但平均收益低:可能是你的评分卡过于保守,捕捉到的都是小幅波动。可以尝试提高对强势信号(如放量大涨)的权重,或者调整持仓逻辑(不止盈那么早)。
- 如果平均收益高但胜率低:策略波动大,可能依赖少数几次高收益交易,但经常小亏。需要检查止损规则是否合理,或者是否过度依赖某些高波动、高风险的信号。
- 如果整体无效:需要重新审视你的核心指标和逻辑。是不是RSI参数不合适?盘前量比这个指标在当下市场环境下是否失效?新闻关键词是否需要更新?
迭代流程应该是:运行 -> 记录 -> 回测 -> 分析 -> 调整(权重/规则)-> 再运行。这是一个持续的循环。切记,不要基于非常短期的数据(比如一两天的结果)就大幅修改策略,避免“过度拟合”。至少积累一个月的交易数据后再做系统性评估。
5.3 常见陷阱与我的心得
在开发和运行这个Agent的过程中,我踩过不少坑,这里分享几点最重要的心得:
- 数据质量是生命线:垃圾进,垃圾出。务必处理好数据缺失、异常值(如股价为0)、除权除息导致的股价跳空。
yfinance有时会返回NaN,你的代码必须能稳健处理,比如用前值填充或直接剔除该股票当天的分析。 - 避免“未来函数”:这是量化回测中最经典的错误。在计算指标时,绝对不能使用当天收盘后的数据。在盘前分析场景中,我们使用的是“截至昨日收盘”的历史数据来计算技术指标(如RSI(close, 14)),使用“当前盘前”的数据来计算盘前涨跌幅和量比。逻辑必须清晰,确保在实盘中,Agent在时刻t做出的决策,只依赖于t时刻及之前的信息。
- 参数迷信:RSI(14)一定比RSI(10)好吗?布林带用20日均线还是26日?没有绝对答案。我的建议是,先选择市场公认的默认参数(如RSI14,布林带20),把整个流程跑通。优化应该放在整个策略框架稳定之后,并且要用样本外数据检验。
- Agent是辅助,不是圣杯:这个Agent最大的价值,是把我从繁重的信息筛选中解放出来,并将我的交易思路结构化、纪律化。它给出的“分数”是一个经过量化的“注意力过滤器”,而不是一个自动交易指令。最终的下单决策,必须结合盘中的实时走势、整体的市场环境以及我个人的风险承受能力来做出。永远不要完全放弃自己的判断。
- 从简单开始,逐步复杂化:我最初版本的Agent只计算RSI和盘前涨跌幅两个指标。运行稳定后,才陆续加入布林带、新闻、相关性等维度。这样更容易定位问题。如果你一开始就想构建一个包含20个因子的复杂模型,很容易在调试中崩溃。
搭建这样一个Agent的过程,本身就是一个极好的学习过程。它强迫你去深入理解每一个市场指标的含义,去思考数据之间的关系,去建立一套属于自己的、理性的决策框架。即使最终这个Agent的直接交易收益有限,这个过程中培养出的系统化思维和数据敏感度,对任何交易者来说都是无价的财富。