---
name: dividend-scanner
description: 高息股扫描与DCA监控系统 - 三市场（港股/美股/A股）自动扫描候选、监控持仓买入信号
trigger: DCA监控、高息扫描、股息率筛选、dividend scan、阶梯买入
---

# 高息股扫描与DCA监控

## 系统架构

```
~/.hermes/scripts/
├── dividend_alert.py    # 股息登记日前一天提醒（A/HK/US三市场，无Token依赖）
├── dca_scanner.py       # 港股/美股扫描（LongPort API）
├── scan_cn.py           # A股扫描（LongPort价格+预设股息率）
├── dca_monitor.py       # 持仓监控（买入信号），支持 --market=us/hk/cn
├── dca_positions.json   # 持仓配置（含阶梯价位、股息率、派息频率）
├── scan_hk.sh           # shell包装脚本
├── scan_us.sh
├── scan_cn.sh
├── dca_monitor_us.sh    # DCA美股监控wrapper（解决no_agent参数问题）
├── rgti_alert.py        # RGTI价格提醒
├── rgti_auto_monitor.py # RGTI半自动做T挂单
└── rgti_alert_state.json
```

## 股息登记日提醒系统（dividend_alert.py）

### 用途
每天自动扫描**明天除权的股票**，在登记日前一天推送给用户，让用户有足够的买入时间窗口。

### 数据源（无需API Key）

| 市场 | 数据源 | 函数/API |
|------|--------|----------|
| 🇨🇳 A股 | AKShare(百度) | `ak.news_trade_notify_dividend_baidu(date='YYYYMMDD')` |
| 🇭🇰 港股 | AKShare(百度) | 同上（交易所=HK） |
| 🇺🇸 美股 | Nasdaq API | `https://api.nasdaq.com/api/calendar/dividends?date=YYYY-MM-DD` |

### 数据格式说明

**A股/港股（百度接口）：**
- `分红`字段已经是 **元/10股** 或 **港元/10股**，不要乘以10
- 返回字段：股票代码, 除权日, 分红, 送股, 转增, 交易所, 股票简称, 报告期
- A股除以权除息日查询，登记日=除权日的前一个交易日
- 可以查未来日期，支持周末自动跳过

**美股（Nasdaq API）：**
- `dividend_Rate`: 本次每股分红金额（美元）
- `indicated_Annual_Dividend`: 年化分红
- `record_Date`: 登记日（美股登记日通常=除权日）
- 优先股/REIT占多数，注意区分

### 实现要点
- **proxy处理**：服务器在EDT时区，请求国内API需先 `unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY`，否则Python requests走127.0.0.1:7890代理会报ProxyError
- **时间处理**：北京时间运行，用 `datetime.utcnow() + timedelta(hours=8)` 转换
- **周末跳过**：`while d.weekday() >= 5: d += timedelta(days=1)`
- **no_agent模式**：cron任务用 `no_agent=True`，脚本stdout直接推送给用户，不需要LLM推理
- **输出格式**：emoji标记+分类（A/HK/US三栏），每行一个股票+分红金额+除权日期

### Cron配置
```
30 20 * * 1-5   # EDT 20:30 = 北京 次日 8:30 AM
# Mon 20:30 EDT → Tue 08:30 BJT (查Wed除权)
# Thu 20:30 EDT → Fri 08:30 BJT (查Mon除权，跳过周末)
```

### 使用方式
用户看到推送后，**当天开盘买入**仍能赶上登记日，享有本次分红权。

## 高息股扫描 vs 股息登记日提醒（区别）

| 维度 | 高息扫描 | 分红提醒 |
|------|---------|---------|
| 时机 | 每周五收盘后 | 每天 20:30 EDT |
| 目的 | 长期候选池价格监控 + DCA建仓 | 明日除权提醒 |
| 输出 | 当前价、股息率、涨跌、阶梯买入点 | 明天除权的股票 + 预计股息率 |
| 动作 | 关注买入机会 | 提醒买入搭车分红 |
| 数据源 | LongPort实时报价 | AKShare除权日历 + Nasdaq |
| 池子 | 固定候选池（~24只港股/15只美股/20只A股） | 全市场除权数据 |

**不重复，互补关系。** 扫描说"这票便宜可以囤"，提醒说"明天发钱今天上车"。

## Cron任务配置

| 任务 | 时间(EDT) | 北京时间 | 频率 | 脚本 |
|---|---|---|---|---|
| 港股高息扫描 | 周五 20:00 | 周六 8:00AM | **每周五** | scan_hk.sh |
| A股高息扫描 | 周五 19:30 | 周六 7:30AM | **每周五** | scan_cn.sh |
| 美股高息扫描 | 周五 21:30 | 周六 9:30AM | **每周五** | scan_us.sh |
| 美股盘中监控(夜间) | 22:30 | 10:30AM | 工作日 | dca_monitor_us.sh |
| 美股盘中监控(凌晨) | 02:00 | 14:00 | 工作日 | dca_monitor_us.sh |
| **股息登记日前一天提醒** | **20:30** | **次日8:30AM** | **每天** | **dividend_alert.py** |

> 📌 高息扫描已从每天改为每周五收盘后推送，分红提醒保持每天不变。扫描是"哪些高息股现在值得买"，提醒是"明天分红今天买入"。

## 用户偏好（关键）

1. **吃股息为主，不做短线投机**。当用户问"买点"时，默认用股息率/除权日期/分红增长角度分析，而不是技术面支撑阻力。
2. **时间显示用北京时间(UTC+8)**，不要用服务器EDT时间。
3. **输出格式**：emoji标记 + 简洁卡片状，数据密集但视觉清爽，≤500字。

## 关键实现细节

### Shell包装脚本（必须）
Cron的script字段不能带参数。Python脚本需要参数时，用.sh包装：
```bash
#!/bin/bash
cd /home/openclaw/.hermes/scripts
python3 dca_scanner.py hk
```
Cron系统对.sh文件自动用bash执行，不需要chmod +x。

### A股数据源
- **LongPort有CN行情**：`ctx.quote(["601088.SH"])` 可以获取A股实时价格
- **东方财富API**：从美国服务器无法直连，需走Mihomo代理(127.0.0.1:7890)，且不稳定
- **股息率**：LongPort的CalcIndex.DividendYield对A股可能不可靠，用预设数据更稳
- **股票名称**：东方财富API的f14字段可能返回代码而非名称，必须用name_map兜底

### 输出格式（用户偏好）
```
🥇 冀中能源 [煤炭]
   000937.SZ
   💰 现价: 5.28  📉 -2.9%
   📊 股息率: 11.0%  派息: 年度
   🪜 阶梯: T1:5.12(-3%) → T2:4.96(-6%) → T3:4.75(-10%)
```
- emoji标记 + 简洁一行一个信息
- 阶梯买入价：现价的-3%/-6%/-10%
- 总字数≤500

### 市场过滤（dca_monitor.py）
`--market=us` 参数按positions.json的market字段过滤。无参数则监控全部。

## 候选股池

### 港股（≥7%股息率）
银行：建行/工行/农行/中行
能源：中海油/中国神华/中石油
REIT：领展/顺丰房托/置富/越秀/冠君
电信：中国移动/香港电讯

### 美股（≥7%股息率）
BDC：ARCC/HTGC/PSEC/MAIN/ABR/OFS
mREIT：NLY/AGNC/TWO/CIM/NYMT/STWD
其他：SBR/PDI/PTY

### A股（≥5%股息率）
煤炭：冀中能源/中国神华/平煤股份
白酒：洋河/五粮液/泸州老窖/古井贡/茅台
银行：交行/工行/建行/农行/中行/兴业/光大
其他：宁沪高速/浙能电力/长江电力

## Pitfalls

1. **全量脚本同时失败=Token过期**：港股/美股/A股三市场扫描+DCA监控全部报401003错误时，不要逐个排查。**100%是LongPort access token过期**。快速诊断：`cd ~/.hermes/scripts && bash scan_hk.sh`，看是否返回 `code=401003 token expired`。修复：去 [LongPort开发者后台](https://open.longportapp.com/) 刷新Token。
2. **Token截断（401004）**：`.bashrc` 中 `LONGBRIDGE_ACCESS_TOKEN=m_eyJh...jb-k` 可能是占位符（中间有`...`）。此时报错是401004而非401003。权威token在 `~/.env`。
3. **API限流**：多个脚本同时调LongPort会触发429002错误。避免10分钟内的高频轮询。
4. **USOption权限**：LongPort返回"You do not have access to USOption"不影响正股数据。
5. **A股名称**：东方财富f14字段不可靠，必须维护name_map。
6. **代理依赖**：东方财富API从美国服务器不稳定，A股扫描优先用LongPort。
7. **用户不喜欢轮询**：最低30分钟间隔。
8. **无候选时不推送（2026-06-24）**：`dca_scanner.py` 的 `format_result()` 在无符合条件的标的时返回空字符串，主程序过滤空输出不print。`no_agent: true` 任务无stdout=不推送。避免用户收到"暂无符合条件的标的"的空消息。
9. **Proxy冲突**：服务器 `HTTP_PROXY=http://127.0.0.1:7890` 环境变量是全局的。Python requests 自动读取，导致国内 API 请求失败（ProxyError）。**所有国内 API 调用前必须先 unset proxy**：`os.environ.pop('http_proxy', None)` 等四个变量都要清。美股 Nasdaq API 直连无此问题。
10. **百度接口港股过滤**：返回数据的 `交易所` 字段，HK=港股、SH/SZ/BJ=A股。注意港股代码前有空格（如 ` 06808`），需要 `strip()`。
11. **除权日与登记日关系**：A股登记日=除权日前一交易日。美股登记日通常=除权日当天。
12. **百度接口日期格式**：`news_trade_notify_dividend_baidu(date='YYYYMMDD')` 参数是纯数字字符串，不要带横杠。支持查未来日期。

## 股息分析工作流（用户问"买点"时）

当用户说"分析XX的买点"时，**先问清楚是吃股息还是做短线**。用户偏好是吃股息，分析框架：

### 吃股息分析步骤
1. **查分红历史** → `ak.stock_history_dividend_detail(symbol)` 拿历年数据
2. **算当前股息率** → 每股分红 / 当前股价
3. **算分红增长率** → 5年CAGR、同比变化
4. **查除权时间线** → 已除权还是未除权？最近一次除权日即已错过，等下一波
5. **查盈利预测** → EPS 看分红可持续性（分红率=每股分红/EPS）
6. **查财务健康** → 货币资金、经营现金流（确保有钱分红）
7. **避坑**：不要给 MACD/均线/支撑阻力等技术面分析

### 输出格式（emoji卡片）
```
💰 XX年全年分红: XX元/10股 = X.XX元/股
📊 当前价格: XX.XX元 (除权后)
📊 股息率: X.XX%
📈 X年股息CAGR: X.X%/年
```
