name: stock-strategy-ma-cross description: 均线交叉策略。计算均线交叉点,生成买卖信号。用户说"均线策略"、"MA交叉"、"金叉死叉"时使用此 skill。
stock-strategy-ma-cross - 均线交叉策略
使用场景
当用户需要:
- 分析股票均线交叉点
- 生成买卖信号
- 查看历史信号记录
- 回测均线策略
- 导出信号数据
数据文件
位置: 工作空间根目录 signals-ma-cross.md
格式示例:
# 均线交叉信号
## 策略参数
- 策略: ma_cross_enhanced
- 快线周期: 5
- 慢线周期: 10
- MA20周期: 20
- RSI周期: 14
- RSI超买阈值: 70
- RSI超卖阈值: 30
- 持续周期: 2
- K线周期: 5m
- 生成时间: 2026-03-05T15:00:00
## 信号列表
| 时间 | 代码 | 方向 | 价格 | MA20 | RSI | 持续周期 |
|------|------|------|------|------|-----|----------|
| 2026-03-05 14:35 | 000001.SZ | 买入 | 10.52 | 10.40 | 55.2 | 2 |
| 2026-03-06 10:00 | 000001.SZ | 卖出 | 10.85 | 10.92 | 68.5 | 2 |
默认参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| K线周期 | 5m | 5分钟K线 |
| 快线周期 | 5 | 短期均线周期 |
| 慢线周期 | 10 | 长期均线周期 |
| MA20 周期 | 20 | 趋势判断均线(可选) |
| RSI 周期 | 14 | RSI 计算周期 |
| RSI 超买阈值 | 70 | RSI 超买线(可选) |
| RSI 超卖阈值 | 30 | RSI 超卖线(可选) |
| 持续周期 | 2 | 信号确认周期(交叉后持续N根K线) |
⚠️ 持续周期说明:
- 持续周期是指在交叉后,状态需要持续的K线数量
- 默认2周期适合短线,可根据K线周期调整
- 5分钟/15分钟:建议2-3周期
- 日线:建议2-4周期
支持的K线周期: 1d, 1m, 5m, 15m, 30m, 60m
均线交叉逻辑
基础交叉检测算法
- 获取K线收盘价序列
- 计算快线 MA(fast_period) 和慢线 MA(slow_period)
- 检测相邻时刻的均线关系变化
基础金叉条件:
MA_fast[t-1] < MA_slow[t-1] 且 MA_fast[t] > MA_slow[t]
基础死叉条件:
MA_fast[t-1] > MA_slow[t-1] 且 MA_fast[t] < MA_slow[t]
增强过滤条件
为提高信号质量,减少假信号,策略采用多条件过滤:
1. MA20 趋势过滤
- 买入信号:当前价格 > MA20(价格在均线之上,趋势向上)
- 卖出信号:当前价格 < MA20(价格在均线之下,趋势向下)
2. 持续性确认
要求交叉后的状态持续 >= N 根 K 线后才输出信号:
- 买入信号:快线 > 慢线 的状态已持续 >= N 根 K 线
- 卖出信号:快线 < 慢线 的状态已持续 >= N 根 K 线
⚠️ 重要:正确的持续性确认逻辑
持续性确认是检查交叉后的K线,而不是交叉前的K线:
金叉发生时刻: T
确认检查: T+1, T+2, ..., T+N
输出信号时刻: T+N
关键点:
- 检查的是交叉后的K线,不是交叉前
- 输出时刻是确认时刻(T+N),价格使用确认时刻的收盘价
- 需要预留足够的数据空间(最后一根K线可能无法输出信号)
信号延迟输出机制:
| 时间点 | 事件 | 检查内容 | 输出 |
|---|---|---|---|
| T | 金叉发生 | 快线刚好上穿慢线 | 无输出(等待确认) |
| T+1 | 状态持续 | 快线 > 慢线 | 无输出 |
| T+2 | 状态持续 | 快线 > 慢线 | 输出买入信号(满足2周期) |
注意:输出的是"确认时刻"的信号,价格使用确认时刻的收盘价。
3. RSI 辅助过滤
使用 RSI(14) 判断超买超卖状态:
- 买入信号:RSI(14) < 70(非超买状态),RSI > 30 更佳(有反弹空间)
- 卖出信号:RSI(14) > 30(非超卖状态),RSI < 70 更佳(有下跌空间)
完整信号条件
买入信号(全部满足)
1. 金叉发生:MA_fast[t-1] < MA_slow[t-1] 且 MA_fast[t] > MA_slow[t]
2. MA20 趋势过滤(可选):
- 价格 > MA20(当前在均线之上,趋势向上)
3. 持续性确认:
- 快线 > 慢线 的状态在交叉后已持续 >= N 根 K 线
- 即检查 T+1, T+2, ..., T+N 时刻的状态
4. RSI 辅助过滤(可选):
- RSI(14) < 70(非超买状态)
- RSI > 30 更佳(有反弹空间)
卖出信号(全部满足)
1. 死叉发生:MA_fast[t-1] > MA_slow[t-1] 且 MA_fast[t] < MA_slow[t]
2. MA20 趋势过滤(可选):
- 价格 < MA20(当前在均线之下,趋势向下)
3. 持续性确认:
- 快线 < 慢线 的状态在交叉后已持续 >= N 根 K 线
- 即检查 T+1, T+2, ..., T+N 时刻的状态
4. RSI 辅助过滤(可选):
- RSI(14) > 30(非超卖状态)
- RSI < 70 更佳(有下跌空间)
技术指标计算公式
MA(移动平均)
MA(n) = (P1 + P2 + ... + Pn) / n
其中 P 为收盘价,n 为周期。
RSI(相对强弱指数)
RSI(n) = 100 - 100 / (1 + RS)
其中:
RS = 平均涨幅 / 平均跌幅
n = 14(默认周期)
计算步骤:
- 计算 price_diff = close[t] - close[t-1]
- gains = price_diff > 0 ? price_diff : 0
- losses = price_diff < 0 ? abs(price_diff) : 0
- avg_gain = SMA(gains, n)
- avg_loss = SMA(losses, n)
- RS = avg_gain / avg_loss
- RSI = 100 - 100 / (1 + RS)
数据量计算
最小数据需求
计算增强版均线交叉所需的最小 K 线数量:
数据量 = max(slow_period, 20) + sustain_period + RSI周期 + 缓冲
其中:
- slow_period: 慢线周期
- 20: MA20 周期
- sustain_period: 持续性确认周期(默认2)
- RSI周期: 14
- 缓冲: 建议 +10 根 K 线
示例(slow=10, sustain_period=2):
所需 K 线 = max(10, 20) + 2 + 14 + 10 = 20 + 2 + 14 + 10 = 46 根
推荐获取 = 46 × 1.5 ≈ 69 根
推荐数据量
| slow_period | 最少 K 线数 | 推荐获取 |
|---|---|---|
| 5 | 46 | 69 |
| 10 | 46 | 69 |
| 20 | 56 | 84 |
各指标数据需求明细
| 指标 | 数据需求 | 说明 |
|---|---|---|
| MA(slow_period) | slow_period 根 K 线 | 计算慢线 |
| MA20 | 20 根 K 线 | 趋势过滤 |
| RSI(14) | 14 + 1 根 K 线 | 计算价格变化 |
| 持续性确认 | sustain_period 根 K 线 | 信号确认延迟(默认2) |
| 交叉检测 | 1 根 K 线 | 比较 t 和 t-1 |
| 总计 | max(slow_period, 20) + sustain_period + 15 | 含价格变化缓冲 |
时间范围计算
根据 K 线周期和数据量计算 start_time:
| K线周期 | 每24小时K线数 | 计算公式 |
|---|---|---|
| 1d | 1 | N 天前 |
| 60m | 4 | N/4 天前(向上取整) |
| 30m | 8 | N/8 天前(向上取整) |
| 15m | 16 | N/16 天前(向上取整) |
| 5m | 48 | N/48 天前(向上取整) |
| 1m | 240 | N/240 天前(向上取整) |
示例(slow=10, sustain_period=2,推荐获取69根K线):
1d周期:69 天前 → start_time = 当前日期 - 69天5m周期:69/48 ≈ 2 天前 → start_time = 当前日期 - 2天
日期格式:YYYYMMDD(如 20260305)
数据获取策略
- 优先使用 get_market_data_ex(直接查询本地缓存,无需下载)
- 仅当数据不足时才调用 download_history_data2
- 精确计算 start_time,避免获取过多历史数据
计算 start_time 的步骤:
- 计算所需 K 线数:
bars_needed = max(slow_period, 20) + sustain_period + 14 + 10 - 推荐获取数量:
bars_recommended = bars_needed * 1.5 - 根据周期计算天数:
days = ceil(bars_recommended / bars_per_day) - 计算 start_time:
当前日期 - days 天
操作指南
1. 运行策略分析
命令示例:
分析均线交叉 000001.SZMA策略 600519.SH --fast 5 --slow 10金叉死叉 300750.SZ --period 1d
操作流程:
- 解析股票代码(支持自动补全交易所后缀)
- 确保数据已下载(必要时先调用 xtdata download_history_data2)
- 获取K线数据(调用 xtdata get_market_data_ex)
- 计算快线和慢线
- 检测交叉点
- 生成信号列表
- 存储到 signals-ma-cross.md
- 输出分析结果摘要
代码补全规则:
| 输入 | 补全为 |
|---|---|
000001 |
000001.SZ |
600000 |
600000.SH |
300750 |
300750.SZ |
交易所判断规则:
6开头 →.SH(上海)0、3开头 →.SZ(深圳)68开头 →.SH(科创板)
2. 查看信号
命令示例:查看均线信号、显示信号列表、列出买卖信号
操作流程:
- 读取 signals-ma-cross.md
- 解析信号列表
- 按时间排序输出
- 若文件不存在,提示暂无信号
3. 清除信号
命令示例:清除均线信号、清空信号、删除所有信号
操作流程:
- 确认用户意图(危险操作)
- 清空 signals-ma-cross.md 或删除文件
- 输出清除结果
确认格式:
⚠️ 危险操作检测!
操作类型:清除所有均线交叉信号
影响范围:将删除 signals-ma-cross.md 中的所有信号数据
风险评估:信号数据将被永久删除,无法恢复
请确认是否继续?
4. 导出信号
命令示例:导出信号、导出信号到CSV、信号导出
操作流程:
- 读取 signals-ma-cross.md
- 转换为 CSV 格式
- 保存为 signals-ma-cross.csv
CSV 格式:
时间,代码,方向,价格,MA20,RSI,持续周期
2026-03-05 14:35,000001.SZ,买入,10.52,10.40,55.2,2
2026-03-06 10:00,000001.SZ,卖出,10.85,10.92,68.5,2
与 xtdata 联动
数据下载
精确数据获取原则:仅获取计算所需的最小数据量,避免下载过多历史数据。
计算 start_time 的步骤:
- 计算所需 K 线数:
bars_needed = slow_period * 3 - 根据周期计算天数:
days = ceil(bars_needed / bars_per_day) - 计算 start_time:
当前日期 - days 天
命令示例(假设 slow=10,当前日期 20260305):
# 5分钟K线,需要 69 根,约 2 天
xtdata download_history_data2 --stock-list "['000001.SZ']" --period "5m" --start-time "20260303"
# 日线,需要 69 根,69 天
xtdata download_history_data2 --stock-list "['000001.SZ']" --period "1d" --start-time "20251226"
动态计算模板:
bars_needed = max(slow_period, 20) + sustain_period + 14 + 10 # 最小需求
bars_recommended = bars_needed * 1.5 # 推荐数量
period=1d: start_time = today - ceil(bars_recommended / 1) (天)
period=60m: start_time = today - ceil(bars_recommended / 4) (天)
period=30m: start_time = today - ceil(bars_recommended / 8) (天)
period=15m: start_time = today - ceil(bars_recommended / 16) (天)
period=5m: start_time = today - ceil(bars_recommended / 48) (天)
period=1m: start_time = today - ceil(bars_recommended / 240) (天)
获取K线数据
# 使用相同的 start_time 获取数据
xtdata get_market_data_ex --stock-list "['000001.SZ']" --period "5m" --start-time "20260304"
获取股票名称
xtdata get_instrument_detail --stock-code "000001.SZ"
数据准备提示
分析前应确保数据已下载:
- 首次分析某只股票时,或数据可能不是最新的,应先执行下载命令
- 按需获取:根据参数精确计算所需数据量,避免下载过多历史数据
推荐流程:
1. 计算数据量: bars_needed = max(slow_period, 20) + sustain_period + 14 + 10
2. 推荐数量: bars_recommended = bars_needed * 1.5
3. 计算 start_time: 根据 period 和 bars_recommended 推算
4. 优先获取数据: xtdata get_market_data_ex(直接查缓存)
5. 若数据不足: xtdata download_history_data2(下载缺失数据)
6. 计算 MA(快)、MA(慢)、MA20、RSI(14)
7. 检测交叉点并应用过滤条件
8. 生成信号并存储
示例(slow=10, sustain_period=2, period=5m, today=20260305):
bars_needed = max(10, 20) + 2 + 14 + 10 = 46 根K线
bars_recommended = 46 * 1.5 = 69 根
days = ceil(69 / 48) = 2 天
start_time = 20260305 - 2 = 20260303
命令: xtdata get_market_data_ex --stock-list "['000001.SZ']" --period "5m" --start-time "20260303"
信号输出格式
分析完成后,输出以下信息:
📊 均线交叉分析结果
股票: 000001.SZ 平安银行
策略: MA交叉增强版 (快线5 / 慢线10 / MA20)
K线周期: 5分钟
📊 过滤条件:
- MA20 趋势过滤: ✅ 启用
- 持续性确认: ✅ 2周期
- RSI 过滤: ✅ RSI(14), 超买70/超卖30
📈 信号统计:
- 总信号数: 3
- 买入信号: 2
- 卖出信号: 1
📋 信号详情:
| 时间 | 方向 | 价格 | MA20 | RSI | 持续周期 |
|------|------|------|------|-----|----------|
| 2026-03-05 14:35 | 买入 | 10.52 | 10.40 | 55.2 | 2 |
| 2026-03-06 10:00 | 卖出 | 10.85 | 10.92 | 68.5 | 2 |
✅ 信号已保存至 signals-ma-cross.md
注意事项
- 持续性确认逻辑:检查交叉后的K线,不是交叉前
- 信号延迟输出:信号在确认时刻(交叉后N根K线)输出
- 默认持续周期为2:适合短线交易,可根据K线周期调整
- 快线周期必须小于慢线周期
- 需要先下载K线数据才能分析
- 信号文件存储在工作空间根目录
- 每次分析会追加新信号到现有文件
- 建议定期清除旧信号以保持数据清洁
- MA20和RSI过滤是可选的:可根据需要启用或禁用
- 数据量要求:需要足够的历史数据(推荐60-80根K线)
参数调整建议
| K线周期 | 推荐持续周期 | 推荐MA20过滤 | 推荐RSI过滤 |
|---|---|---|---|
| 1分钟 | 3-5 | ❌ | 可选 |
| 5分钟 | 2-3 | 可选 | 可选 |
| 15分钟 | 2-3 | 可选 | 可选 |
| 30分钟 | 2-3 | ✅ | ✅ |
| 60分钟 | 2-3 | ✅ | ✅ |
| 日线 | 2-4 | ✅ | ✅ |
说明:
- 短周期(1分钟、5分钟)波动大,建议降低持续周期,可选启用过滤条件
- 长周期(30分钟以上)趋势更稳定,建议启用过滤条件以提高信号质量
错误处理
| 错误情况 | 处理方式 |
|---|---|
| 股票代码无效 | 提示用户检查代码格式 |
| 数据未下载 | 提示先执行下载命令 |
| 快线周期 >= 慢线周期 | 提示参数错误,要求重新输入 |
| K线数据不足 | 提示数据量不足以计算指标(需要至少46根K线) |
| RSI计算失败 | 检查数据连续性,确保无缺失数据 |
| MA20计算失败 | 检查数据量是否达到20根K线 |
| xtdata 服务不可用 | 提示检查 xtdata 服务状态 |