Files

132 lines
5.4 KiB
Markdown

# dividend_alert.py 美股频率反推 + 周派票数据缺口 (2026-08-26)
## 📋 背景
`dividend_alert.py` 推送"明天除权的美股"列表时,只显示「每股派/annual/连续估年」, 没法区分:
- 季度派息的稳定票 (EXPE/SOLS) vs
- BDC/REIT 的高频派息陷阱 (PSEC月派, SATA周派)
用户原话 "PSEC 显示连续 12 年, SATA 显示连续 249 年, 显然公式 bug"。
## ✅ 加的修复 (2026-08-26)
`dividend_alert.py` 加了「频率(估)」列, 用 `round(ann/rate)` 反推年度派息次数 → 档位标签:
```python
freq_n = round(ann / d) # d = 单次每股派, ann = 年化
if freq_n >= 50: freq_str = '🔄周W'
elif freq_n >= 25: freq_str = '🔄双周BW'
elif freq_n >= 11: freq_str = '🔄月M'
elif freq_n >= 5: freq_str = '🔄双月BM'
elif freq_n >= 3: freq_str = '📅季度Q'
elif freq_n == 2: freq_str = '📅半年S'
elif freq_n == 1: freq_str = '📅年A'
else: freq_str = '❓'
```
| 档位 | 年度次数 | 真实场景 |
|---|---|---|
| 🔄周W | ≈52 | BDC 周派 (SATA, EPRF) — 高息陷阱常见 |
| 🔄双周BW | ≈26 | BDC 双周派 |
| 🔄月M | ≈12 | BDC/REIT 月派 (PSEC, AGNC) — 高息陷阱 |
| 🔄双月BM | ≈6 | 不常见 |
| 📅季度Q | 3-4 | 标准季度派 (EXPE/SOLS/JNJ) |
| 📅半年S | 2 | 半年派 |
| 📅年A | 1 | 年度派 |
## ⚠️ 周派票数据缺口 (已部分解决 — 2026-08-26)
Nasdaq 除权日历 API (`api.nasdaq.com/api/calendar/dividends?date=...`) **不收录周派 ETF/BDC**:
**实测** (2026-08-25):
- QQQY / RDTE 每周四都派息 (yfinance 历史可查)
- 但 Nasdaq API 未来 7 天所有除权日都查不到 QQQY/RDTE
- 周派 ETF 普遍被漏: QQQY/RDTE/EPRF/EFC/STWD 等
**根因**: Nasdaq API 的 `indicated_Annual_Dividend` 对周派 ETF 返回 0, 脚本过滤掉 ann=0 的票, 但**根本拉不到除权日信息**。
## ✅ 解决方案 (2026-08-26 上线): LongPort MCP `dividend` 工具
**关键发现**: 长桥 MCP 的 `mcp_longport_dividend` 工具**有 QQQY/RDTE/EPRF 的完整历史派息**。本会话验证:
```python
resp = mcp_call('tools/call', {
'name':'dividend','arguments':{'symbol':'QQQY.US'}
}, ...)
# → list 含 100 条记录, 每条 record_date 是周四 (2026.08.20, 2026.08.13, 2026.08.06...)
# desc 字段: "每股派发 0.1309 USD" (编码乱但能 parse 数字)
```
**新工具: `~/.hermes/scripts/dividend_highfreq.py`**
设计: 全 US 市场动态扫描, 找出高频派息票 (W/BW/M/BM 档)。
**数据流**:
1. `security_list` 翻页 (US market, page=1..N, 每页 50 条) → 候选池
2. `quote` 批量 (一次最多 500) → 当前价格
3. `dividend` 逐只 (1-4 秒/只) → 历史派息日期 + 金额
4. 算频率档位 (period_days_avg: ≤5=W, ≤11=BW, ≤18=M, ≤35=BM, ≤70=Q)
5. 筛 yield ≥ 4% 入 SQLite `highfreq_pool`
6. 按 freq + yield + 稳定度 (std/mean cv) 排序推送
**cron 频率**: 每日一次 (建议 21:00 北京, 比长桥主推送早 30 分钟), Top 200 票 ~8 分钟跑完。
**推送格式** (横表):
```
🔄 美股高频派息雷达 (YYYY-MM-DD 北京) 数据源: 长桥 MCP
| 票 | 频率 | 连续(期) | 稳定度 | 平均派$ | 现价 | 年化股息率 |
|:---|:---|:---|:---|:---|:---|:---|
| LEND.US | 🔄双月BM | 8 | ⭐⭐⭐ cv=0.05 | $0.193 | $20.50 | **9.41%** |
| VAIE.US | 🔄双周BW | 12 | ⭐⭐⭐ cv=0.04 | $0.077 | $4.74 | **16.27%** |
```
⚠️ 高频派息 (W/BW/M/BM) 多为 BDC/REIT, 高息常不可持续, **文化娱乐参考**。
## ⚠️ 长桥 `screener_search` 工具的隐性坑
实测 (2026-08-26): `screener_search` 的 `dividend` 和 `dpseps` indicator 字段**返 None** (即使请求了), 只返 `prevclose/marketcap/pettm/pbmrq/salesgrowthyoy` 这些。
**所以**:
- ❌ 不要试图用 `screener_search filter=[dividend≥X]` 筛高息股 — 返的 dividend 字段全 None
- ✅ 改用 `security_list` 拿全市场 → `quote` 拿现价 → `dividend` 拿历史 → 算 yield
- ✅ `security_list` 支持 `page=N` 翻页 (每页 50 条), `total=16008` (US)
## 🧠 数据源优先级 (v2 决策)
| 方案 | 数据源 | 优/缺 | 状态 |
|---|---|---|---|
| A | yfinance 单只拉 | 准 / 慢 | ❌ 太慢 |
| B | yfinance bulk download | 一次 / 数据大,漏票 | ❌ |
| C | ETF.com API | 准 / 付费 | ❌ |
| D | stockanalysis.com HTML scrape | 免费 / 反爬 | ❌ |
| **E** | **LongPort MCP dividend 工具** | **准 / 已知完整覆盖 QQQY/RDTE 等** | ✅ **v2 实装** |
| F | Nasdaq 除权日历 (旧) | 不收周派 | ❌ 已被覆盖 |
**用户决策 (2026-08-26)**: 走 E。`dividend_highfreq.py` v1.0 已实装, cron 接入待办。
## 🛠️ 加列后推送对比
**前**:
```
| PSEC | 💰$0.04 | $0.42 | 🔥12 | 📊$2.35 | **17.87%** | 8/27/2026 |
| SATA | 💰$0.05 | $12.85 | 🔥249 | 📊$100.00 | **12.85%** | 8/27/2026 |
```
**后** (frequency column added):
```
| PSEC | 💰$0.04 | $0.42 | 🔄月M | 🔥12 | 📊$2.35 | **17.87%** | 8/27/2026 |
| SATA | 💰$0.05 | $12.85 | 🔄周W | 🔥249 | 📊$100.00 | **12.85%** | 8/27/2026 |
```
新增列**一目了然看出 BDC/REIT 高频派息陷阱**。
## 📌 实现位置
`~/.hermes/scripts/dividend_alert.py` line ~226 (us_h 表格渲染分支), 改动注释 `2026-08-26 加频率(估)列`, 在 `SKILL.md` 末尾加一行 disclaimer。
## 验证
```bash
python3 ~/.hermes/scripts/dividend_alert.py --market us
# 验证: 输出表格有"频率(估)"列, 数字标的是 W/M/Q 等档位
```