步骤4阶段1 - 3-4天核心闭环方案(修正版)
制定日期: 2026-09-13
观察任务: cron_id=7e8ae2aeca81
当前进度: D1观察中(17次自动运行,100%成功)
任务1:修正排期表
| 日期 |
阶段 |
核心任务 |
验收标准 |
耗时 |
| D1 9/13 |
告警系统上线 |
alert_channel_health + dead_mans_switch部署 |
D1观察通过(100%成功)✅ |
✅ 已完成 |
| D2 9/14 |
受控测试+集成 |
4项测试 + run_with_alert集成 |
4项测试全部通过 |
2.5小时 |
| D3 9/15 |
风控熔断 |
设计+实现熔断逻辑 |
熔断测试通过 |
4小时 |
| D4 9/16 |
影子运行+验收 |
双系统并行比对 |
零重大偏差,交付使用 |
2小时 |
增量迭代(D5-D7,边跑边做)
| 任务 |
执行方式 |
说明 |
| 2C-1 DAG设计 |
D5开始设计 |
裁剪非必要模块 |
| 消除重复 |
边跑边做 |
不单独排期 |
| 权重校准 |
影子运行时同步 |
对比新旧系统输出 |
任务2:修正受控测试方案(D2)
2.1 测试矩阵
| 测试项 |
注入方式 |
预期结果 |
验证方法 |
耗时 |
| 告警路径 |
jobs.json添加test_alert_path_001 + task_runs插入failed记录 |
[TEST]前缀TG告警 |
检查TG频道 |
30分钟 |
| 超时路径 |
修改last_run_at为3天前 |
timeout告警 |
检查TG频道 |
30分钟 |
| Dead-Man |
停心跳30分钟 |
dead_man告警 |
检查TG频道 |
30分钟 |
| 通道健康 |
改TG token为错误值 |
channel_error告警 |
检查TG频道 |
30分钟 |
| run_with_alert集成 |
集成到评估流程 |
评估后触发告警检查 |
手动触发+检查日志 |
30分钟 |
| 回归验证 |
恢复所有配置 |
无告警,正常运行 |
cron list检查 |
30分钟 |
总计耗时: 约2.5小时(可分上午/下午执行)
2.2 测试执行流程
# === 前置:备份生产数据 ===
cp C:/Users/Admin/AppData/Local/hermes/cron/jobs.json C:/Users/Admin/AppData/Local/hermes/cron/jobs.json.bak_D2
# === 测试1:告警路径(30分钟)===
# 1.1 添加测试任务
python -c "
import json
from pathlib import Path
jobs_path = Path('C:/Users/Admin/AppData/Local/hermes/cron/jobs.json')
data = json.loads(jobs_path.read_text(encoding='utf-8'))
data['jobs'].append({
'id': 'test_alert_path_001',
'name': '[TEST] 告警路径测试',
'schedule': '*/15 * * * *',
'command': 'python -c \"import time; time.sleep(1)\"',
'last_status': 'failed',
'last_run_at': '2026-09-14T10:00:00+08:00'
})
jobs_path.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding='utf-8')
print('测试任务已添加')
"
# 1.2 插入failed记录
python -c "
import sqlite3
conn = sqlite3.connect('D:/Hermes/data/state/alert_state.db')
conn.execute(\"\"\"
INSERT OR REPLACE INTO task_runs
(task_id, status, start_time, exit_code, error_message, created_at)
VALUES ('test_alert_path_001', 'failed', '2026-09-14T10:00:00', 1, 'test alert trigger', datetime('now'))
\"\"\")
conn.commit()
conn.close()
print('测试记录已插入')
"
# 1.3 等待cron运行(约15分钟),检查TG是否收到[TEST]前缀告警
# 1.4 清理测试数据(恢复jobs.json + 删除task_runs记录)
# === 测试2-5:类似流程,分别注入不同故障 ===
2.3 测试通过标准
- [ ] 告警路径:收到包含
[TEST]前缀的TG消息
- [ ] 超时路径:收到包含
timeout关键词的TG消息
- [ ] Dead-Man:停心跳30分钟后收到dead_man告警
- [ ] 通道健康:改token后收到channel_error告警
- [ ] run_with_alert集成:评估完成后触发告警检查
- [ ] 清理后:jobs.json恢复原状,task_runs无残留
任务3:修正风控熔断边界(D3)
3.1 只做(核心4项)
| 熔断项 |
触发条件 |
动作 |
实现方式 |
| 总仓位 |
总仓位>80% |
输出警告,不阻断主流程 |
检查持仓总额/总资产 |
| 单票 |
单票回撤>5% |
输出警告,建议减仓 |
检查单票盈亏 |
| 回撤 |
单日回撤>3% |
输出警告,暂停新开仓 |
检查当日净值变化 |
| 流动性 |
流动性不足 |
输出警告,建议观望 |
检查成交额/换手率 |
3.2 不做(非核心)
- ❌ 行业暴露控制
- ❌ 信号失效检测
- ❌ 数据断流监控
3.3 实现方案
# 风控熔断检查脚本(D3实现)
# 文件: D:/Hermes/scripts/risk_circuit_breaker.py
def check_circuit_breaker():
"""核心4项熔断检查"""
results = {
"total_position": check_total_position(), # 总仓位>80%
"single_stock": check_single_stock_drawdown(), # 单票回撤>5%
"daily_drawdown": check_daily_drawdown(), # 单日回撤>3%
"liquidity": check_liquidity() # 流动性不足
}
# 输出警告,不阻断主流程
for item, passed in results.items():
if not passed:
log_warning(f"熔断警告: {item}")
return results
def check_total_position():
"""总仓位检查"""
# 实现逻辑...
pass
def check_single_stock_drawdown():
"""单票回撤检查"""
# 实现逻辑...
pass
def check_daily_drawdown():
"""单日回撤检查"""
# 实现逻辑...
pass
def check_liquidity():
"""流动性检查"""
# 实现逻辑...
pass
任务4:修正验收标准
4.1 P0验证(必须完成)
| 验证项 |
验证方法 |
通过标准 |
| 受控测试 |
D2执行4项测试 |
4项测试全部通过 |
| 稳定运行 |
D2-D4连续运行 |
3天稳定运行,无重大故障 |
| 回滚方案 |
一键回滚测试 |
<5分钟完成回滚 |
4.2 移除的指标
- ❌ "7天100%成功率" → 改为"3天稳定运行"
- ❌ "cron≤10个" → 移除,不单独考核
任务5:增量迭代计划(D5-D7)
5.1 边跑边做
| 任务 |
执行方式 |
预计完成 |
| 2C-1 DAG设计 |
D5开始设计,不阻塞主流程 |
D5-D6 |
| 消除重复 |
边运行边扫描,发现即合并 |
持续进行 |
| 权重校准 |
影子运行时同步对比 |
D4-D5 |
5.2 不单独排期
- 历史数据回填(低优先级)
- 报告格式优化(低优先级)
- 多源数据融合(长期价值)
附录:当前系统状态
A.1 已部署组件
| 组件 |
文件路径 |
cron_id |
状态 |
| alert_channel_health |
D:/Hermes/scripts/alert_channel_health.py |
7e8ae2aeca81 |
✅ 运行中 |
| dead_mans_switch |
D:/Hermes/scripts/dead_mans_switch.py |
- |
✅ 已部署 |
| run_with_alert |
D:/Hermes/scripts/run_with_alert.py |
- |
⏳ D2集成 |
A.2 D1观察统计
| 指标 |
值 |
| 自动运行次数 |
17次(10:30-14:15) |
| 成功率 |
100% |
| 平均间隔 |
15m05s |
| 心跳记录 |
18条(全部ok) |
| TG通知 |
0次(expected) |
| exit_code |
全部0 |
A.3 待执行检查
| 时间 |
检查内容 |
状态 |
| 14:30 |
自动运行 |
⏳ 即将执行 |
| 20:00 |
晚间检查 |
⏳ 待执行 |
| 次日10:00 |
D1总结 |
⏳ 待执行 |
方案修正时间: 2026-09-13T14:30:00
下一步: 等待20:00晚间检查 + 次日10:00 D1总结后进入D2