
Earnings Tracker
- 8 installs
- 33 repo stars
- Updated April 26, 2026
- bighardperson/computer-science-skills-collection
Earnings-tracker is a skill that scans A-share and US stock earnings calendars and pushes analyzed earnings updates to Discord or Telegram.
About
This skill is an earnings tracker for A-share and US stocks. It scans earnings calendars from AKShare and Yahoo Finance, tracks pre-announcements, quick reports, and formal filings, and flags whether results beat or miss expectations. It pushes summaries to Discord or Telegram on a schedule and lets a user pick which companies to follow.
- Scans A-share and US stock earnings calendars
- Tracks revenue, net profit, and beat/miss vs expectations
- Pushes earnings updates to Discord and Telegram
Earnings Tracker by the numbers
- 8 all-time installs (skills.sh)
- Ranked #820 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Data as of Jul 30, 2026 (Skillselion catalog sync)
earnings-tracker capabilities & compatibility
- Capabilities
- earnings scan · financial analysis · notification push
- Use cases
- trading · data analysis
What earnings-tracker says it does
AI-powered earnings tracker for A-share and US stock financial reports
美股财报日历(Yahoo Finance)
营收: $22.1B (预期 $20.4B) ✅ 超预期 8.3%
npx skills add https://github.com/bighardperson/computer-science-skills-collection --skill earnings-trackerAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 8 |
|---|---|
| repo stars | ★ 33 |
| Last updated | April 26, 2026 |
| Repository | bighardperson/computer-science-skills-collection ↗ |
What it does
Scan stock earnings calendars and push beat/miss summaries to Discord or Telegram.
Who is it for?
Tracking upcoming earnings for a watchlist of A-share and US stocks and getting pushed summaries.
When should I use this skill?
You want to monitor earnings dates and results for specific companies and receive alerts.
What you get
- earnings calendar summary
- earnings report summary pushed to Discord/Telegram
By the numbers
- 4 AKShare data interfaces used
- weekly scan scheduled Sunday 18:00
Files
Earnings Tracker - AI 驱动的财报追踪器
自动扫描财报日历,推送重要财报更新
---
✨ 核心功能
📅 财报日历扫描
- ✅ A 股预约披露时间表(AKShare)
- ✅ 美股财报日历(Yahoo Finance)
- ✅ 每周日自动扫描下周财报
- ✅ 筛选关注的公司
📊 财报数据追踪
- ✅ 业绩预告(提前信号)
- ✅ 业绩快报(快速概览)
- ✅ 正式财报(完整数据)
- ✅ 营收、净利润、同比增长
📈 智能分析
- ✅ 超预期/不及预期判断
- ✅ 关键指标提取
- ✅ AI 相关亮点识别
- ✅ 机构点评汇总
🔔 自动推送
- ✅ Discord 频道推送
- ✅ Telegram 话题推送
- ✅ 定时任务调度
- ✅ 一次性提醒
---
🚀 使用方法
1. 安装依赖
pip install akshare---
2. 配置关注的公司
编辑 config/settings.json:
{
"watchlist": {
"us": ["NVDA", "MSFT", "GOOGL", "META", "AMZN", "TSLA", "AMD"],
"cn": ["600519", "000858", "601318", "000001"]
},
"schedule": {
"weeklyScan": "Sunday 18:00",
"reportScan": "after_market"
}
}---
3. 运行扫描
node scripts/earnings-scanner.cjs---
📋 工作流程
每周日 18:00 - 预扫描
1. ✅ 扫描下周财报日历 2. ✅ 筛选关注的公司 3. ✅ 推送到 Discord/Telegram 4. ✅ 等待用户确认
用户确认后
1. ✅ 为每个财报创建一次性提醒 2. ✅ 财报发布后搜索结果 3. ✅ 格式化摘要 4. ✅ 推送到指定频道
---
🌍 数据源
A 股(推荐)
| 数据源 | 费用 | 接口 |
|---|---|---|
| AKShare | 免费 | stock_yysj_em() - 预约披露时间表 |
| AKShare | 免费 | stock_yjyg_em() - 业绩预告 |
| AKShare | 免费 | stock_yjkb_em() - 业绩快报 |
| AKShare | 免费 | stock_yjbb_em() - 正式财报 |
美股
| 数据源 | 费用 | 说明 |
|---|---|---|
| Yahoo Finance | 免费 | 财报日历 |
| Alpha Vantage | 有限免费 | 财务数据 API |
---
📊 示例输出
财报日历扫描
📅 下周财报日历 (2026-03-17 ~ 2026-03-21)
🇺🇸 美股:
• NVDA - 3月19日 盘后
• MSFT - 3月20日 盘后
• GOOGL - 3月18日 盘后
🇨🇳 A股:
• 600519 贵州茅台 - 3月20日
• 000858 五粮液 - 3月21日
请回复要跟踪的公司(例如:NVDA, 600519)财报摘要推送
📊 NVDA Q4 2025 财报摘要
💰 营收: $22.1B (预期 $20.4B) ✅ 超预期 8.3%
📈 EPS: $4.12 (预期 $3.95) ✅ 超预期 4.3%
📊 毛利率: 72.1% (同比 +2.3%)
🎯 关键亮点:
• 数据中心营收 $18.4B (同比 +409%)
• AI 芯片需求强劲
• 下季度指引超预期
📌 管理层指引:
• Q1 营收预期 $24B
• 毛利率维持 70%+
来源:Yahoo Finance, Seeking Alpha---
🔧 配置文件
config/settings.json
{
"watchlist": {
"us": ["NVDA", "MSFT", "GOOGL", "META", "AMZN", "TSLA", "AMD"],
"cn": ["600519", "000858", "601318", "000001"]
},
"schedule": {
"weeklyScan": "Sunday 18:00",
"reportScan": "after_market"
},
"notify": {
"channel": "discord",
"to": "channel:1478698808631361647"
},
"dataSources": {
"cn": "akshare",
"us": "yahoo_finance"
}
}---
📝 更新日志
v1.0.0 (2026-03-14)
- ✅ 初始版本
- ✅ A 股财报日历扫描(AKShare)
- ✅ 美股财报日历扫描(Yahoo Finance)
- ✅ Discord/Telegram 推送
- ✅ 定时任务调度
---
📊 轻松追踪财报,不错过重要信息!
{
"watchlist": {
"us": ["NVDA", "MSFT", "GOOGL", "META", "AMZN", "TSLA", "AMD"],
"cn": ["600519", "000858", "601318", "000001"]
},
"schedule": {
"weeklyScan": "Sunday 18:00",
"reportScan": "after_market"
},
"notify": {
"channel": "discord",
"to": "channel:1478698808631361647"
},
"dataSources": {
"cn": "akshare",
"us": "yahoo_finance"
}
}
{
"name": "earnings-tracker",
"version": "1.1.0",
"description": "AI 驱动的财报追踪器(中国版),自动扫描 A 股财报日历",
"main": "scripts/earnings_scanner.py",
"scripts": {
"scan": "python3 scripts/earnings_scanner.py"
},
"keywords": [
"earnings",
"financial-reports",
"stock-tracker",
"akshare",
"china-stocks"
],
"author": "sunnyhot",
"license": "MIT"
}
#!/usr/bin/env python3
"""
Earnings Tracker - AI 驱动的财报追踪器(中国版)
功能:
1. 扫描 A 股财报日历(AKShare)
2. 筛选关注的公司
3. 推送到 Discord/Telegram
"""
import json
import sys
from datetime import datetime, timedelta
try:
import akshare as ak
except ImportError:
print("❌ 请先安装 akshare: pip install akshare")
sys.exit(1)
# 配置
CONFIG = {
"watchlist": {
"us": ["NVDA", "MSFT", "GOOGL", "META", "AMZN", "TSLA", "AMD"],
"cn": ["600519", "000858", "601318", "000001"]
},
"notify": {
"channel": "discord",
"to": "channel:1478698808631361647"
}
}
def get_cn_earnings_calendar():
"""获取 A 股财报预约披露时间表"""
try:
print(f"\n📊 获取 A 股财报预约披露时间表...")
# 尝试获取最近几个季度的数据
now = datetime.now()
quarters = []
# 当前季度和下一季度
current_quarter = (now.month - 1) // 3 + 1
for q in [current_quarter, current_quarter + 1]:
if q <= 4:
date_str = f"{now.year}{q:02d}31"
else:
date_str = f"{now.year + 1}01{q-4:02d}31"
quarters.append(date_str)
print(f" 🔍 查询季度: {', '.join(quarters)}")
all_earnings = []
for date_str in quarters:
try:
df = ak.stock_yysj_em(date=date_str)
if df is not None and not df.empty:
# 筛选关注的公司
watchlist = CONFIG["watchlist"]["cn"]
my_stocks = df[df["股票代码"].isin(watchlist)]
for _, row in my_stocks.iterrows():
all_earnings.append({
"code": row["股票代码"],
"name": row["股票简称"],
"date": row.get("首次预约时间", "待定"),
"type": "cn"
})
except Exception as e:
print(f" ⚠️ 查询 {date_str} 失败: {e}")
continue
if all_earnings:
print(f" ✅ 找到 {len(all_earnings)} 个 A 股财报预约")
return all_earnings
else:
print(" ℹ️ 本季度暂无关注公司的财报预约")
return []
except Exception as e:
print(f" ❌ 获取 A 股财报日历失败: {e}")
return []
def get_cn_performance_forecast():
"""获取 A 股业绩预告(提前信号)"""
try:
print(f"\n📊 获取 A 股业绩预告...")
df = ak.stock_yjyg_em()
if df is not None and not df.empty:
# 筛选关注的公司
watchlist = CONFIG["watchlist"]["cn"]
my_stocks = df[df["股票代码"].isin(watchlist)]
if not my_stocks.empty:
print(f" ✅ 找到 {len(my_stocks)} 个业绩预告")
forecasts = []
for _, row in my_stocks.iterrows():
forecasts.append({
"code": row["股票代码"],
"name": row["股票简称"],
"type": row.get("预告类型", "未知"),
"change": row.get("净利润增减", "未知")
})
return forecasts
print(" ℹ️ 暂无业绩预告")
return []
except Exception as e:
print(f" ❌ 获取业绩预告失败: {e}")
return []
def format_earnings_report(cn_earnings, cn_forecasts):
"""格式化财报报告"""
report = []
report.append("📅 下周财报日历(中国版)\n")
report.append("=" * 50)
if cn_earnings:
report.append("\n🇨🇳 A股财报预约:\n")
for e in cn_earnings:
report.append(f"• {e['code']} {e['name']} - {e['date']}")
if cn_forecasts:
report.append("\n📈 业绩预告:\n")
for f in cn_forecasts:
report.append(f"• {f['code']} {f['name']} - {f['type']} ({f['change']})")
if not cn_earnings and not cn_forecasts:
report.append("\nℹ️ 本周暂无关注公司的财报\n")
report.append("\n" + "=" * 50)
report.append("\n请回复要跟踪的公司(例如:600519, NVDA)")
return "\n".join(report)
def main():
print("📊 Earnings Tracker 启动(中国版)\n")
print("=" * 50)
# 获取 A 股财报日历
cn_earnings = get_cn_earnings_calendar()
# 获取业绩预告
cn_forecasts = get_cn_performance_forecast()
# 格式化报告
report = format_earnings_report(cn_earnings, cn_forecasts)
print("\n" + report)
# 保存结果
result = {
"timestamp": datetime.now().isoformat(),
"cn_earnings": cn_earnings,
"cn_forecasts": cn_forecasts,
"report": report
}
output_file = "/Users/xufan65/.openclaw/workspace/memory/earnings-calendar.json"
with open(output_file, "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
print(f"\n✅ 结果已保存到: {output_file}")
print("\n" + "=" * 50)
print("✅ Earnings Tracker 完成\n")
if __name__ == "__main__":
main()