# 港股日内交易复盘技能

## 目录
1. [核心交易逻辑](#核心交易逻辑重要)
2. [选股策略](#选股策略)
   - [选股时间](#选股时间)
   - [数据源](#数据源) ⭐ 已测试
   - [选股指标](#选股指标)
   - [选股流程](#选股流程)
   - [评分体系](#评分体系)
3. [交易价格计算策略](#交易价格计算策略)
4. [复盘策略](#复盘策略)
   - [复盘时间](#复盘时间)
   - [复盘数据](#复盘数据)
   - [复盘逻辑](#复盘逻辑)
   - [策略优化](#策略优化)
5. [飞书消息推送](#飞书消息推送)
   - [配置方法](#配置方法)
   - [推送格式](#推送格式)
   - [定时任务](#定时任务)
6. [报告格式](#报告格式)
7. [文件结构](#文件结构)

---

## 核心交易逻辑（重要！）

**盘前选股 → 盘中执行 → 盘后复盘**

### 交易执行规则
1. **盘前**：给出选股信息（目标买入价、目标卖出价、止损价）
2. **默认按选股信息交易**：不干预，默认会成交
3. **盘中**：
   - 触发买入价 → 成交买入
   - 买入后触发止损价 → 触发止损，卖出
   - 买入后触发卖出价 → 触发止盈，卖出
   - 没有触发买入价 → 不买入（没有成交）
4. **盘后复盘**：根据实际价格走势判断结果

### 复盘结果（只有3种）
| 结果 | 说明 | 触发条件 |
|------|------|----------|
| **没有成交** | 未触发买入价，未买入 | 最低价 > 目标买入价 |
| **买入后止损** | 触发止损价卖出 | 最低价 <= 买入价 AND 最低价 <= 止损价 |
| **买入后卖出** | 触发卖出价止盈 | 最低价 <= 买入价 AND 最高价 >= 卖出价 |

> **注意**：自动复盘系统会自动根据当日行情判断结果，无需手动记录

---

## 选股策略

### 选股时间
- **盘前选股**：每个交易日上午 09:15-09:25（港股开盘前）
- **选股时机**：在开盘前完成选股，给出交易计划
- **定时任务**：建议设置 cron 任务在每个交易日的 09:15 执行选股

### 数据源

#### 可用数据源列表

| 数据源 | 状态 | 测试日期 | 说明 |
|--------|------|----------|------|
| **东方财富 API** | ✅ 可用 | 2026-03-13 | 免费，无需 API Key，稳定可靠 |
| **腾讯财经 API** | ✅ 可用 | 2026-03-13 | 免费，直接 HTTP 请求 |
| **easyquotation 库** | ✅ 可用 | 2026-03-13 | 封装腾讯财经 API，易于使用 |
| **finance-data skill** | ⚠️ 不适用 | - | 仅提供历史数据，不适合实时选股 |

#### 1. 东方财富 API（推荐）
- **接口地址**：`https://push2.eastmoney.com/api/qt/stock/get`
- **接口参数**：
  - `secid=116.{股票代码}` （116 代表港股）
  - `fields=f43,f44,f45,f46,f47,f48,f60,f169,f170,f171,f177`
- **返回字段说明**：
  | 字段 | 说明 |
  |------|------|
  | f43 | 当前价格（需除以1000） |
  | f44 | 最高价（需除以1000） |
  | f45 | 最低价（需除以1000） |
  | f47 | 成交量 |
  | f170 | 涨跌幅（需除以100） |
  | f177 | 振幅（需除以100） |

**测试命令**：
```bash
curl -s "https://push2.eastmoney.com/api/qt/stock/get?secid=116.00700&fields=f43,f44,f45,f170,f177,f47"
```

**测试结果**：
```json
{"data": {"f43": 545500, "f44": 551500, "f45": 543500, "f47": 2895136, "f170": -18, "f177": 384}}
```
✅ 解析：价格 545.5港元，涨跌幅 -1.8%，振幅 3.84%

#### 2. 腾讯财经 API（备用）
- **接口地址**：`https://qt.gtimg.cn/q=hk{股票代码}`
- **特点**：免费，稳定，返回数据格式特殊需要解析

**测试命令**：
```bash
curl -s "https://qt.gtimg.cn/q=hk00700"
```

**测试结果**：✅ 可用，返回包含价格、涨跌幅、成交量等数据

#### 3. easyquotation 库（推荐）
- **安装**：`pip install easyquotation`
- **使用**：
```python
import easyquotation
quote = easyquotation.use('hkquote')
data = quote.stocks(['00700', '09988'])
```

**测试结果**：
```
✅ easyquotation 可用: 
  00700 腾讯控股: price=545.0, Pchange=-1.5, Amp=1.46
  09988 阿里巴巴: price=132.2, Pchange=0.6, Amp=1.67
```

#### 4. finance-data skill
- **结论**：⚠️ 不适用于日内交易实时选股
- **原因**：该 skill 主要提供历史数据查询（港股日线、分钟线），不适合实时数据获取
- **适用场景**：盘后复盘获取历史 K 线数据

#### 数据源选择建议
1. **首选**：东方财富 API - 直接 HTTP 请求，无需额外依赖
2. **备选**：easyquotation 库 - 封装良好，易于使用
3. **备用**：腾讯财经 API - 直接请求腾讯接口
4. **不使用**：finance-data skill（仅历史数据）

### 选股指标
基于以下指标进行选股：

1. **涨跌幅 (Pchange)**
   - 最佳范围：-2.0% ~ +1.5%
   - 理由：日内交易需要波动，但涨幅不能太大否则没有空间

2. **振幅 (Amp)**
   - 最佳范围：2.0% ~ 4.0%
   - 理由：振幅太小没有交易空间，振幅太大风险高

3. **成交量 (amount)**
   - 最小要求：300万股以上
   - 理由：流动性要好，便于买入和卖出

4. **技术指标**
   - RSI：30-70 之间最佳
   - 行业偏好：科技股 +8分，金融股 +5分

### 选股流程
```python
# 伪代码
1. 获取股票池（25只主流港股）
2. 调用东方财富API获取实时数据
3. 过滤条件：
   - 涨跌幅 > -3%
   - 振幅 >= 1%
   - 成交量 >= 300万
   - RSI 在 30-70 之间
4. 对满足条件的股票进行评分
5. 按评分排序，选出最高分的股票
6. 计算交易价格（买入价、卖出价、止损价）
7. 生成交易计划并推送
```

### 评分体系
总分 100 分，各指标分配：

| 指标 | 分数范围 | 评分规则 |
|------|----------|----------|
| 涨跌幅 | 0-30分 | -2%~+1.5%得25分，+1.5%~+3%得18分，-3%~-2%得15分 |
| 波动性 | 0-25分 | 2%~4%振幅得20分，1.5%~2%得15分 |
| 流动性 | 0-15分 | 成交量越高分数越高 |
| 技术面 | 0-20分 | RSI在40-60得15分，行业加成 |
| 综合 | 0-10分 | 数据完整性奖励 |

**评分 >= 75**：强烈买入信号
**评分 65-74**：关注
**评分 55-64**：持有
**评分 < 55**：观望

---

## 交易价格计算策略

### 价格计算公式
基于股票的振幅（ATR）计算交易价格：

```python
# 输入参数
current_price = 当日收盘价或当前价
atr_pct = 振幅 / 100  # 转换为小数

# 根据评分确定目标收益和止损比例
if score >= 80:
    target_gain_pct = atr_pct * 0.8    # 目标获取80%振幅
    stop_loss_pct = atr_pct * 0.4      # 止损40%振幅
elif score >= 70:
    target_gain_pct = atr_pct * 0.6
    stop_loss_pct = atr_pct * 0.5
elif score >= 60:
    target_gain_pct = atr_pct * 0.5
    stop_loss_pct = atr_pct * 0.6
else:
    target_gain_pct = atr_pct * 0.4
    stop_loss_pct = atr_pct * 0.7

# 计算交易价格
buy_price = round(current_price * 0.995, 3)    # 比当前价低0.5%买入
sell_target = round(current_price * (1 + target_gain_pct), 3)  # 卖出目标
stop_loss = round(current_price * (1 - stop_loss_pct), 3)      # 止损价格

# 风险收益比
risk_reward_ratio = target_gain_pct / stop_loss_pct
```

### 价格计算原则
1. **买入价**：比当前价低 0.5%，给市场调整空间
2. **卖出目标**：根据评分和振幅计算，评分越高，目标收益越高
3. **止损价格**：评分越高，止损越紧（但不超过振幅的 70%）
4. **风险收益比**：至少 1:1，最好 1.5:1 以上

---

## 复盘策略

### 复盘时间
- **盘后复盘**：每个交易日下午 16:30（港股收盘后）
- **定时任务**：建议设置 cron 任务在每个交易日的 16:30 执行复盘

### 复盘数据
需要获取以下数据：

1. **交易计划数据**（选股时生成）
   - 股票代码
   - 目标买入价
   - 目标卖出价
   - 止损价
   - 选股评分

2. **当日实际行情数据**（从东方财富 API 获取）
   - 最高价
   - 最低价
   - 收盘价
   - 涨跌幅
   - 振幅

### 复盘逻辑
**自动判断**：根据当日行情自动判断交易结果，无需手动输入

**结果类型（只有3种）**：
| 结果 | 说明 | 触发条件 |
|------|------|----------|
| **没有成交** | 未触发买入价，未买入 | 最低价 > 目标买入价 |
| **买入后止损** | 触发止损价卖出 | 最低价 <= 买入价 AND 最低价 <= 止损价 |
| **买入后卖出** | 触发卖出价止盈 | 最低价 <= 买入价 AND 最高价 >= 卖出价 |

**自动判断脚本**：
```bash
# 自动复盘（默认昨天）
python scripts/auto_review.py

# 指定日期复盘
python scripts/auto_review.py --date 2026-03-13
```

**自动判断流程**：
1. 读取昨日选股结果（包含买入价、卖出价、止损价）
2. 获取当日实际行情（最高价、最低价、收盘价）
3. 自动判断结果类型并计算收益
4. 更新 performance_tracking.json
5. 生成复盘报告

**判断逻辑**：
```python
# 自动判断伪代码
if 最低价 <= 目标买入价:
    # 触发了买入
    if 最高价 >= 目标卖出价:
        result = "sell_achieved"  # 买入后卖出（止盈）
    elif 最低价 <= 止损价:
        result = "stop_loss"      # 买入后止损
    else:
        result = "sell_achieved"  # 持有到收盘，按收盘价计算收益
else:
    # 没有触发买入价
    result = "no_buy"  # 没有成交
```

### 复盘结果判定
| 结果 | 触发条件 | 记录方式 |
|------|----------|----------|
| **没有成交** | 最低价 > 目标买入价 | `no_buy` |
| **买入后止盈** | 最低价 <= 买入价 AND 最高价 >= 卖出价 | `sell_achieved` |
| **买入后止损** | 最低价 <= 买入价 AND 最低价 <= 止损价 | `stop_loss` |

> 注：`hold_to_close`（持有到收盘）归入 `sell_achieved` 的边界情况，最终统计时归为止盈未触发。

### 策略优化
根据复盘结果，反推选股策略问题：

#### 1. 如果 "没有成交" 居多
**问题诊断**：
- 目标买入价设置过低
- 开盘前选股时数据不完整
- 选股时间过早

**优化建议**：
- 调整买入价为当前价的 99% 而不是 99.5%
- 延后选股时间到 10:00 后（等数据稳定）
- 增加选股数量，分散风险

#### 2. 如果 "止损" 居多
**问题诊断**：
- 选的股票日内走势向下
- 止损设置过紧
- 振幅计算不准确

**优化建议**：
- 增加选股时的趋势判断（涨跌幅为正更好）
- 放宽止损到 1.5%-2%
- 使用更可靠的数据源（避免错误数据导致策略失效）

#### 3. 如果 "止盈" 居多
**问题诊断**：
- 选的股票日内走势向上
- 止损设置合理

**优化建议**：
- 保持当前策略
- 可以适当提高止盈目标

---

## 飞书消息推送

### 配置方法

#### 1. 飞书机器人 Webhook
1. 在飞书群聊中添加自定义机器人
2. 获取 Webhook 地址（格式：`https://open.feishu.cn/open-apis/bot/v2/hook/{webhook_id}`）
3. 将 Webhook 地址配置到 `feishu_config.json`：

```json
{
  "enabled": true,
  "webhook_url": "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "secret": "your_secret_key",
  "notify_types": {
    "selection": true,
    "review": true,
    "error": true
  },
  "message_format": "rich"
}
```

#### 2. OpenClaw 飞书配置
- 在 OpenClaw 中配置飞书应用
- 确保应用有发送消息的权限
- 获取 `app_id` 和 `app_secret`

### 推送格式

#### 选股结果推送（富文本格式）
```json
{
  "msg_type": "post",
  "content": {
    "post": {
      "zh_cn": {
        "title": "🎯 港股选股结果",
        "content": [
          [
            {"tag": "text", "text": "🏆 首选股票："},
            {"tag": "text", "text": "00700 腾讯控股", "bold": true}
          ],
          [
            {"tag": "text", "text": "💰 交易计划："}
          ],
          [
            {"tag": "text", "text": "买入价："},
            {"tag": "text", "text": "¥380.50", "color": "blue"}
          ],
          [
            {"tag": "text", "text": "卖出目标："},
            {"tag": "text", "text": "¥390.00 (+2.5%)", "color": "green"}
          ],
          [
            {"tag": "text", "text": "止损价："},
            {"tag": "text", "text": "¥375.00 (-1.5%)", "color": "red"}
          ],
          [
            {"tag": "text", "text": "风险收益比："},
            {"tag": "text", "text": "1.67:1"}
          ]
        ]
      }
    }
  }
}
```

#### 复盘结果推送（富文本格式）
```json
{
  "msg_type": "post",
  "content": {
    "post": {
      "zh_cn": {
        "title": "📊 港股复盘报告",
        "content": [
          [
            {"tag": "text", "text": "📈 交易统计："}
          ],
          [
            {"tag": "text", "text": "• 买入达成：1/1 (100%)"}
          ],
          [
            {"tag": "text", "text": "• 卖出达成：1/1 (100%)"}
          ],
          [
            {"tag": "text", "text": "• 止损触发：0/1 (0%)"}
          ],
          [
            {"tag": "text", "text": "✅ 选股策略评价："}
          ],
          [
            {"tag": "text", "text": "今日策略表现良好，选中的股票成功触发止盈"}
          ]
        ]
      }
    }
  }
}
```

### 定时任务

#### 选股任务（每个交易日 09:15）
```bash
# OpenClaw cron 配置
cron:
  - name: "港股早盘选股"
    schedule: "0 15 * * 1-5"  # 周一至周五 09:15
    command: "python /path/to/hk_best_picker_real_fixed.py"
    on_success:
      - type: feishu
        message: "选股结果消息"
```

#### 复盘任务（每个交易日 16:30）
```bash
# OpenClaw cron 配置
cron:
  - name: "港股收盘复盘"
    schedule: "0 30 * * 1-5"  # 周一至周五 16:30
    command: "python /path/to/scripts/auto_review.py"
    on_success:
      - type: feishu
        message: "复盘报告消息"
```

### 推送触发条件

| 消息类型 | 触发条件 | 推送时间 |
|----------|----------|----------|
| 选股结果 | 每日开盘前 | 09:15-09:25 |
| 选股异常 | 选股失败时 | 立即推送 |
| 复盘结果 | 每日收盘后 | 16:30-16:45 |
| 策略预警 | 连续3天选股失败 | 立即推送 |

---

## 文件结构
```
hk-intraday-trading/
├── SKILL.md                    # 技能说明文档
├── template.md                 # 报告模板
├── data/
│   ├── strategy_config.json    # 策略配置
│   └── performance_tracking.json  # 性能追踪数据
├── scripts/
│   ├── hk_simple_picker.py     # 选股脚本（生成交易价格）
│   ├── auto_review.py          # 自动复盘脚本 ⭐
│   ├── review_analyzer.py      # 复盘分析器
│   ├── trading_cli.py          # 交易CLI工具
│   └── ...
├── output/
│   ├── picks/                  # 选股结果
│   │   ├── picks_YYYY-MM-DD.json
│   │   └── picks_report_YYYY-MM-DD.md
│   ├── reviews/                # 复盘报告 ⭐
│   │   └── review_YYYY-MM-DD.md
│   └── 复盘分析_YYYY-MM-DD.md
└── examples/
    └── sample_report_YYYY-MM-DD.md
```

### 核心脚本

| 脚本 | 用途 | 运行时间 |
|------|------|----------|
| `hk_simple_picker.py` | 盘前选股，生成交易价格 | 交易日 09:15 |
| `auto_review.py` | 盘后自动复盘，判断结果 | 交易日 16:30 |

## 更新日志
- 2026-03-14：实现自动复盘功能，无需手动记录结果；选股器现在生成交易价格
- 2026-03-13：移除旧版内容，统一报告格式；修复数据源逻辑，数据失败直接返回失败
- 2026-03-06：创建技能，包含完整的复盘报告模板
- 2026-03-05：参考用户提供的格式模板优化结构
- 2026-03-04：基于实际交易复盘需求设计

## 注意事项
1. 所有价格单位均为港元
2. 时间使用北京时间（GMT+8）
3. 百分比计算保留两位小数
4. 报告生成后建议保存到指定目录归档
5. 数据源获取失败时，直接返回错误，不使用假数据